一、PWM
1.定义
英文全称:PULSE WIDTH MODULATION,脉冲宽度调制。
脉冲:频率,方波
宽度:占空比(duty),高电平的宽度
2.用途
(1)控制输出的电压和电流
(2)灯光的亮度
(3)电机
二、编程细节
PWM输出是没有中断触发的,PWM由硬件输出波形,用了中断反而会影响系统定时的效率。
所以,记住以后使用定时器输出PWM都不需要使用到中断
1.如配置STM32F407的TIM14的通道1,10ms即100Hz.
1ms = 0.01s=100HZ
84000000 /8400 = 10000
10000/x = 100
x=100
得到周期8400-1,分频系数10-1
基本配置如下
2.然后还要再配置定时器的输出功能,可以参考固件库手册的例子TIM_PWMOutPut
,
这里涉及到了一个寄存器
TIMx_CCMR1:capture/compare mode register 1 --捕获/比较模式寄存器1
从上图可以看出,我们设置占空比是可以动态调整的,关键就在于设置中间这个比较值的大小。
我们会使用到下面这个函数设置TIMx通道1比较值函数,如果使用到通道2,改1为2即可。
假如100hz内,比较值设置为80hz,那么0-79为高电平,80-100为低电平。
void TIM_SetCompare1(TIM_TypeDef* TIMx,uint16_t Comarex);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//pwm模式1,解释如上图所示
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//允许输出
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效的时候,输出高电平
TIM_OC1Init(TIM14, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);//因为要周期性输出,所以要自动重装载初值,不断输出PWM脉冲
TIM_ARRPreloadConfig(TIM14,ENABLE);//自动重载使能
3.下面讲一下设置gpio的注意事项
(1)将引脚设置为复用功能
(2)将引脚与定时器进行绑定,告知是复用定时器功能
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM14);
(3)最好是按照固件库手册的例程来写,有些定时器使能需要配置下面这个函数
TIM_CtrlPWMOutputs(TIM1,ENABLE);
4.主函数部分
uint32_t pwm_cmp = 0;//新建一个比较值
添加两个延时函数
while