目录
关于PWM占空比存在的问题及分析
相关问题的解决方案
具体程序设计
注意事项
关于PWM占空比存在的问题及分析
在之前发布的有关占空比的文章中,我们看到输出信号的占空比只能在主函数中的while循环中更改。
程序信号模拟图如下所示:
这样更改占空比,存在的问题非常明显——占空比的改变并不规律。产生这种问题的原因是:我们改变占空比是通过下面这一条程序语句实现的。但是这条语句在主函数中的while循环中,也就是说,这条语句的运行时间是不确定的,所以没有办法准确的定位到每个周期,改变每个周期的占空比。
//改变占空比函数
//led0pwmval表示高电平开始的数值
TIM_SetCompare1(TIM1,led0pwmval);
相关问题的解决方案
通过我们的分析可得,上述问题产生的原因在于我们没有办法准确的定位到每个周期,并作出相应的更改。为解决这一问题,我们使用了定时器。
我们利用定时器进行计时,这样就可以精确定位到每个周期,为对每个周期的占空比进行更改提供了前提。然后我们在中断服务函数中编写程序,更改占空比,这样就达到了有规律的更改每个周期的占空比的效果。在主函数中的while循环就可以更改为空循环,其功能仅为使主函数一直运行下去。
具体程序设计
具体的程序设计如下:
1.由于我们使用的是TIM1,所以我们对其进行使能
TIM_ITConfig(TIM1,TIM1_UP_IRQn,ENABLE);
2.然后我们进行中断的初始化
//初始化
NVICStruct.NVIC_IRQChannel=TIM1_UP_IRQn;
NVICStruct.NVIC_IRQChannelCmd=ENABLE;
NVICStruct.NVIC_IRQChannelPreemptionPriority=3;
NVICStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVICStruct);
3.最后我们编写中断服务函数即可
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM1_UP_IRQn) != RESET)
{
TIM_ClearITPendingBit(TIM1,TIM1_UP_IRQn);
if(direction)p=p+100;
else p=p-100;
if(p>1000)direction=0;
if(p==0)direction=1;
TIM_SetCompare2(TIM1, p);
}
}
修改后的模拟图就是下图了,从图中我们可以看出,我们的占空比在均匀的变化。已经达到了我们的目标实验效果。
注意事项
1.在我们的中断服务函数中的变量需要使用全局变量,这样才能保证我们每次进入中断服务函数是,变量取值的连续性。
2.在我们进行中断相关函数的编写时,有关的变量名、函数名需要去相关的文件中寻找,不要自己写(不然就会像我一样,一个问题一下午,错的醉生梦死,改完名字之后痛心疾首)。
3.记得中断使能。
好的,关于使用中断更改PWM的占空比,我们就分析到这里,你学废了吗?下篇文章见!