紧急求助,关于用stm32f4discovery板子读PWM信号的占空比

haohongyu_1986 2012-08-12 04:44:34
大家好,本人现在接到一个项目,目前做到用stm32f4discovery那块板子读取PWM信号的时候遇到了问题。我直接用官网上的源程序来实验,然后板子接一个信号发生器。但是在Debug模式下,我分步运行程序,但是测出来的周期和频率始终和信号发生器设置的不一样,而且数字差距非常大,占空比都超过100了,频率也读出来很不靠谱的值,这明显是错的。然后有时候进行了几十次的调试,发现偶尔会有一次能够出现正确的值。我现在是一头雾水,花了几天都没找到原因,这里恳请大家帮帮我吧,我不知道哪里出错了(理论上官方给出的代码肯定是没有问题的,但是在我这里就是读不出来正确的值)。不知道是不是哪里还少了什么重要的设置。
这里我附上代码,请大家帮帮忙,谢谢!

int main(void)
{
/* TIM Configuration */
TIM_Config();
/* TIM4 configuration: PWM Input mode ------------------------
The external signal is connected to TIM4 CH2 pin (PB.07),
The Rising edge is used as active edge,
The TIM4 CCR2 is used to compute the frequency value
The TIM4 CCR1 is used to compute the duty cycle value
------------------------------------------------------------ */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);

/* Select the TIM4 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);

/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);

/* TIM enable counter */
TIM_Cmd(TIM4, ENABLE);

/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);

while (1);
}

void TIM_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

/* GPIOB clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

/* TIM4 chennel2 configuration : PB.07 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* Connect TIM pin to AF2 */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);

/* Enable the TIM4 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

这是中断服务程序:
void TIM4_IRQHandler(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

/* Clear TIM4 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);

/* Get the Input Capture value */
IC2Value = TIM_GetCapture2(TIM4);

if (IC2Value != 0)
{
/* Duty cycle computation */
DutyCycle = (TIM_GetCapture1(TIM4) * 100) / IC2Value;

/* Frequency computation
TIM4 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */

Frequency = (RCC_Clocks.HCLK_Frequency)/2 / IC2Value;
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
...全文
194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
haohongyu_1986 2012-08-13
  • 打赏
  • 举报
回复
求帮助啊,谁能帮帮我啊?
haohongyu_1986 2012-08-12
  • 打赏
  • 举报
回复
对啊,我也很奇怪,为什么就是不能得到正确的值,理论上不应该会这样啊,就这么几句程序,但是就是找不到问题的原因,我不知道是不是还要设置什么参数才行?
tangjs208 2012-08-12
  • 打赏
  • 举报
回复
应该是没问题的,这个我们已经调过了

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧