原创 使用STM32的PWM输入功能计算输入PWM的周期!

2009-6-12 10:32 8239 6 8 分类: MCU/ 嵌入式

1、时钟部分,TIMER2的时钟频率,我是初始化为36M.
      RCC_PCLK1Config(RCC_HCLK_Div2);           //设置低速AHB时钟=系统时钟/2


      RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    // 倍频系数为9  PLLCLK="8"*9=72


2、TIMER初始化
   TIM_DeInit(TIM2);


   TIM_TimeBaseStructure.TIM_Period = 65535;         
   TIM_TimeBaseStructure.TIM_Prescaler = 18;      
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


   TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
   TIM_ICInitStructure.TIM_ICFilter = 0x0;
   TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
  
   TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);


   TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);                       //复位模式为从模式


   TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);          //使能主从模式
 
   TIM_Cmd(TIM2, ENABLE);                           //使能TIM2计数器


   TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);          //使能CC2中断请求
3、TIMER中断处理
void TIM2_IRQHandler(void)
{
  /* Clear TIM2 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
 
  /* Get the Input Capture value */
  IC2_Value = TIM_GetCapture2(TIM2);
 
}


注意事项:


     不知道为什么,STM32的TIMER时钟经过分频率后,时钟的精度误差会随分频值变大而变大。在不分频的情况下,我检测1KHz的PWM输入信号,误差为0.5us。在18分频的情况下,误差已经不能看了。测量100Hz,根据捕获值计算出来却是105Hz。


     确实如STM32朋友所讲,在分频处我理解错了,分频值=TIM_TimeBaseStructure.TIM_Prescaler +1,所以如果要分18分频,只要将TIM_Prescaler=17即可。经这样修改后测量误差在万分之5以内。谢谢STM32朋友的提醒!!(上面的误解我就不删除了,留做以后警记,呵呵!)

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户211336 2009-6-12 09:01

哈哈,原来如此呀!!

用户1090342 2009-6-11 15:06

哈哈,你计算错了,TIM_Prescaler = 18表示19分频,不是18分频。
相关推荐阅读
用户211336 2011-06-27 15:28
NEC的扩展RAM和CODE BANK在IAR的设置和使用
    NEC的8位单片机有很多型号具有内部扩展RAM和额外代码段,在IAR中如何使用呢,一直没有资料说明,特将它整理后放于此文。 扩展RAM:   变量申明方法如下:#pragma dataseg=...
用户211336 2011-03-02 10:53
define宏定义中的#,##,@#及\符号
1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 如: #def...
用户211336 2010-07-03 00:41
C51定义位变量方法
使用位域 typedef union {   unsigned char byte;   struct   {      unsigned char bit0:1, bit1:1, bit2:1, b...
用户211336 2010-03-24 20:10
程序编写最重要的原则
代码简单化        编写的代码不仅仅是给计算机执行的,更大的价值在于能被其他人以及自己所理解.        尽量用人的语言来编写程序而不是计算机的语言. ...
用户211336 2009-06-14 20:11
AD6导入使用SolidWorks建立的3D模型
在传统的电子产品整机设计流程里,电器设计部门与结构设计部分是两个完全独立工作的部门,之间没有什么直接的合作关系。多数情况下(这里指的是大多数。因为也是有部分企业的产品是已定型化的,都是先设计好外壳再根...
EE直播间
更多
我要评论
2
6
关闭 站长推荐上一条 /3 下一条