打印

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

[复制链接]
2964|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haohongyu|  楼主 | 2012-8-12 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM, TI, IO, pi, ic
大家好,本人现在接到一个项目,目前做到用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;
  }
}
沙发
jiangsai| | 2012-8-12 17:27 | 只看该作者
不懂ing,

使用特权

评论回复
板凳
haohongyu|  楼主 | 2012-8-12 17:47 | 只看该作者
2# jiangsai
这个问题我都看了好几天了,就是找不到问题的原因,我想测的信号频率在100到1000Hz之间,但是就是测不出来,这两天太郁闷了。

使用特权

评论回复
地板
figo20042005| | 2012-8-12 19:33 | 只看该作者
直接下载运行,结果怎样?PB.07 接到PWM信号吧,重新配置看看

使用特权

评论回复
5
haohongyu|  楼主 | 2012-8-12 20:38 | 只看该作者
4# figo20042005
是的,PB07接PWM信号,我就是直接下载然后Debug设置断点运行,看最后的计算结果,可是显示的结果始终和我信号发生器设置的不一样,而且明显一看就知道计算出的数据是错的。反复的实验然后得到不同的结果,真的不知道是怎么回事?原理应该是这样的吧:设置TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  打开TIM4, TIM_TS_TI2FP2;根据每个上升沿过来之后计数器清零重新计数,之后CCR2自动记录下两个上升沿之间的脉冲计数,CCR1自动记录下上升沿和下一个下降沿的脉冲计数值。然后就应该可以计算了,但是不知道为什么始终不对?是不是还要对TIMER的计数频率,分频数以及寄存器重新设置呢?

使用特权

评论回复
6
figo20042005| | 2012-8-13 22:43 | 只看该作者
按照你的怀疑再试下

使用特权

评论回复
7
s_f_tan| | 2012-8-14 09:57 | 只看该作者
定时器不是不是溢出了

使用特权

评论回复
8
haohongyu|  楼主 | 2012-8-15 22:54 | 只看该作者
7# s_f_tan
测了半天,发现是信号发生器出了问题,不过还算弄出来了。

使用特权

评论回复
9
suse-lj| | 2012-8-16 12:18 | 只看该作者
这哥们儿 扯淡, 信号发生器都有了。难道没有示波器?

使用特权

评论回复
10
weikezhi| | 2012-10-16 15:17 | 只看该作者
:funk:

使用特权

评论回复
11
jsbjzy| | 2014-8-14 11:00 | 只看该作者
我碰到的问题是数据不对,但跳动不大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

0

粉丝