管理员
最后登录1970-1-1
在线时间 小时
注册时间2013-3-25
|
STM32 PWM 输入捕获,计算占空比和频率时,捕获的值都必须加1,千万注意。
1-如果你捕获的PWM的频率很低,都是在1KHZ以内,那么加一个1和少一个1去计算,对结果的影响不是很大,这个时候你就会认为是误差,而不是错误
2-当你捕获的PWM频率在100KHZ以上时,这个时候少一个1和加一个1,那么对结果的影响就很大了,如果你不知道原理,你就会认为是你自己的程序写错了。
3-PWM输入是输入捕获的特殊例子,很多初学者是不知道我说什么的,即使你用过,你一般也是捕获低频率的PWM信号,基本用的都是错误的公式,因为网络上还有ST官方的例程提供的都是没有加1的错误例程。
4-输入捕获能捕获到的最低的PWM频率为:// 输入捕获能捕获到的最小的频率为 TIM_CLK /{ (ARR+1)*(PSC+1) },这个前提是 捕获定时器没有溢出的情况下,如果计数溢出了,那么需要在中断里面进行额外的处理,但是这种应用非常少,基本不会溢出。
5-该例程已经在霸道和指南者上面验证过,实验设计为:通过定时器TIM3的通道1:PA6 产生一个 100K 的 PWM 波,然后通过 高级定时器TIM1的通道1:PA8来捕获,然后计算出PWM信号的频率和占空比,其中TIM1的能捕获到的最低的PWM频率为1K,所以大于1K的PWM信号都可以被捕获到。
TIM—高级定时器-PWM输入.zip
(380.81 KB, 下载次数: 1333)
- /*
- * 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,
- * 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中
- * CCR1对应的是周期,CCR2对应的是占空比。
- */
- void ADVANCE_TIM_IRQHandler(void)
- {
- /* 清除中断标志位 */
- TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);
- /* 获取输入捕获值 */
- IC1Value = TIM_GetCapture1(ADVANCE_TIM);
- IC2Value = TIM_GetCapture2(ADVANCE_TIM);
-
- // 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1
- if (IC1Value != 0)
- {
- /* 占空比计算 */
- DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
- /* 频率计算 */
- Frequency = 1000000/(float)(IC1Value+1);
- printf("占空比:%0.2f%% 频率:%0.2fHz\n",DutyCycle,Frequency);
- }
- else
- {
- DutyCycle = 0;
- Frequency = 0;
- }
- }
复制代码
|
|