紧接上文,这里要修改PWM波的频率,则需要修改定时器的重装载值。
可以使用
TIM3_PWM_Init(arr,18);
函数来修改装载值arr 。
修改完频率后
TIM_SetCompare2(TIM3,seg[1]); //设置通道2比较值
下面展示一些 内联代码片
。
// An highlighted block
extern arr;
static u16 seg[4]={200,400,600,800}; //保存各路占空比
int main(void) //多个定时器同一通道实现多路PWM(同频率,不同占空比)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2
TIM3_PWM_Init(arr,18); //18分频。设置频率
TIM_SetCompare1(TIM3,seg[0]); //设置定时器3通道的比较值
TIM_SetCompare2(TIM3,seg[1]);
TIM_SetCompare3(TIM3,seg[2]);
TIM_SetCompare4(TIM3,seg[3]);
delay_ms(30); //延迟30ms
arr=1199;//修改定时器预装载值来修改频率
TIM3_PWM_Init(arr,18);
TIM_SetCompare3(TIM3,seg[2]);
while(1){
;
}
}
此处在之前的基础上,增加了延迟后设定定时器装载值来修改频率。修改后重新设定比较值,从而能看到占空比。
这样一来,知道了PWM波的频率和占空比修改就可以调制出自己想要的多路PWM波。呼吸灯可以视为根据PWM高电平的占空比不断发生变化,从而在一个时间周期内灯的量度也在不断变化形成的。
注意:1、此处的arr变量定义在timer.c文件中。也可以定义在其他用得到的地方,比如串口中断文件中,通过串口数据来修改频率。同样的占空比变量数组也是如此。
2、有些地方会用到波形互补的PWM,这点由定时器PWM功能结构体成员TIM_OCPolarity决定,在ST官方库中的定义如下:
uint16_t TIM_OCPolarity; /*!< Specifies the output polarity.
This parameter can be a value of @ref TIM_Output_Compare_Polarity */
此成员设定PWM输出通道的极性,有两种取值 high或者low。high表示在一个计数周期中小于比较值的范围内输出高电平,大于比较值的范围输出低电平。而low刚好相反,可以用这一点来调制出具有互补的PWM波。
运行效果如下:
第三路和第四路PWM波形互补。
改天做定时器的输入捕获。