9799|10

24

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

万分紧急,请教大家关于读取PWM占空比的问题 [复制链接]

大家好,本人现在接到一个项目,目前做到用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;
  }
}
此帖出自stm32/stm8论坛

最新回复

你自己的问题那么狗血,人家怎么帮啊  详情 回复 发表于 2012-8-21 08:51

点评

自己顶一下,谁能帮帮我啊:Cry:  详情 回复 发表于 2012-8-12 20:40
点赞 关注
 

回复
举报

24

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
自己顶一下,谁能帮帮我啊
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
调式模式有时不可靠,你把数据连续存到一个数组里运行一会儿看数组里的值。
此帖出自stm32/stm8论坛

点评

这位前辈,我现在的问题是频率能够出现正确的值,但是通过TIM_GetCapture1(TIM4) 计算占空比的时候计算值始终不正确,一直显示49,不管我怎么改变信号频率.不知道这是什么原因.  详情 回复 发表于 2012-8-13 19:10
弱弱的问一下这位前辈,如果不连终端不用Debuger模式,直接建立一个数组看结果的话怎么写程序啊,是不是可以在cmd下面看,但是我不会,能不能指点一下,这里先谢谢了! [ 本帖最后由 haohongyu 于 2012-8-13 04:13  详情 回复 发表于 2012-8-13 04:11
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 huo_hu 的帖子

弱弱的问一下这位前辈,如果不连终端不用Debuger模式,直接建立一个数组看结果的话怎么写程序啊,是不是可以在cmd下面看,但是我不会,能不能指点一下,这里先谢谢了!

[ 本帖最后由 haohongyu 于 2012-8-13 04:13 编辑 ]
此帖出自stm32/stm8论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳 huo_hu 的帖子

这位前辈,我现在的问题是频率能够出现正确的值,但是通过TIM_GetCapture1(TIM4) 计算占空比的时候计算值始终不正确,一直显示49,不管我怎么改变信号频率.不知道这是什么原因.
此帖出自stm32/stm8论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

6
 
有没有人帮帮我啊?
此帖出自stm32/stm8论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

7
 
不知道为什么得到的CCR1的值始终为CCR2的一半
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

8
 
u16 debug_list[256];
u8 point=0;
把这句放到中断里
debug_list[point++]=TIM_GetCapture1(TIM4);
先把扑获的值粘上来看看
此帖出自stm32/stm8论坛

点评

谢谢huo_hu,我找到答案了,原来的程序其实是对的,我把信号发生器的一个地方设置错了,结果只能在信号发生器上改变频率和占空比,但是改了之后的信号没有发出去,还是发的以前的信号,当我知道后各种郁闷,想了好几  详情 回复 发表于 2012-8-17 06:44
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 huo_hu 的帖子

谢谢huo_hu,我找到答案了,原来的程序其实是对的,我把信号发生器的一个地方设置错了,结果只能在信号发生器上改变频率和占空比,但是改了之后的信号没有发出去,还是发的以前的信号,当我知道后各种郁闷,想了好几天这是为什么
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

10
 
多数情况别人帮不到啊
此帖出自stm32/stm8论坛

点评

你自己的问题那么狗血,人家怎么帮啊:lol  详情 回复 发表于 2012-8-21 08:51
 
 
 

回复

705

帖子

0

TA的资源

纯净的硅(中级)

11
 

回复 10楼 huo_hu 的帖子

你自己的问题那么狗血,人家怎么帮啊
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表