万分紧急,请教大家关于读取PWM占空比的问题

2019-03-23 19:39发布

大家好,本人现在接到一个项目,目前做到用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;
  }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
haohongyu
1楼-- · 2019-03-24 03:07
 精彩回答 2  元偷偷看……
Li_Lei
2楼-- · 2019-03-24 08:36
调式模式有时不可靠,你把数据连续存到一个数组里运行一会儿看数组里的值。
haohongyu
3楼-- · 2019-03-24 10:38
弱弱的问一下这位前辈,如果不连终端不用Debuger模式,直接建立一个数组看结果的话怎么写程序啊,是不是可以在cmd下面看,但是我不会,能不能指点一下,这里先谢谢了!

[ 本帖最后由 haohongyu 于 2012-8-13 04:13 编辑 ]
haohongyu
4楼-- · 2019-03-24 15:21
 精彩回答 2  元偷偷看……
haohongyu
5楼-- · 2019-03-24 20:26
有没有人帮帮我啊?
haohongyu
6楼-- · 2019-03-24 21:43
不知道为什么得到的CCR1的值始终为CCR2的一半

一周热门 更多>