在cubemx中配置定时器:
在上方的模式中有4个频道,以1频道举例,选择pwm generation ch1或pwm generation ch1 ch1N,这里的ch1 ch1N表示正常输出和互补输出,可以实现led灯的交替点亮,其实频道中的选项(选项后面的no output表示两种输出都禁止,chx表示只使能正常输出,chxn表示只使能互补输出,chx chxn表示两种输出都使能 )都能输出pwm方波,它们分别对应上图,只不过前面带有pwm的是我们常用的,下方pwm配置中有pwm mode 1和pwm mode 2 。
pwm mode 1表示cnt小于等于ccr输出高电压,否则输出低电压,其中cnt表示计数器中的当前值,它的最大值为arr,arr为cubemx下方配置中的counter period(autoreload register)的值,它储存在一个16位的寄存器中,arr+1是定时周期,这是因为计数器从0开始到arr,ccr表示捕获比较寄存器的值。pwm mode 2表示cnt小于等于ccr输出低电压,否则输出高电压。注意ccr的值在cubemx中没有配置项,需要在代码中配置。
pwm占空比:
占空比:duty=ccr/(arr+1),在pwm mode 1中表示一个周期中有百分之duty输出高电压,在pwm mode 2中表示一个周期中有百分之duty输出低电压。
pwm的周期:
一个周期时间=(arr+1)*定时器加一需要的时间
hal库pwm常用接口:
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) //作用:启动pwm的正常输出。
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1) //作用:启动pwm的互补输出。
__HAL_TIM_GET_COUNTER(&htim1) //读计数器cnt的值。
__HAL_TIM_SET_COUNTER(&htim1,要写入的值) //写计数器cnt的值。
__HAL_TIM_GET_COMPARE(&htim1) //读ccr的值。
__HAL_TIM_SET_COMPARE(&htim1,要写入的值) //写ccr的值。
__HAL_TIM_GET_AUTORELOAD(&htim1)//读arr的值
__HAL_TIM_SET_AUTORELOAD(&htim1,要写入的值)//写arr的值
这里举出一个例题,当灯泡的正极接单片机输出pwm的引脚,负极接地,pwm位模式1时,占空比可以用来替代灯泡亮度。此时想要灯泡亮度y随时间t变化,y和t的关系式为,请写出代码实现这一功能。
解答:用占空比替代亮度得
//导入math包
#include "math.h"
//在main函数中写入如下代码
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //启动pwm的正常输出。
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1); //启动pwm的互补输出。
while(1)
{
float t=Hal_GetTick()*0.001;//Hal_GetTick()用来获取系统启动以来的毫秒数
float duty=0.5*sin(2*3.14*t)+0.5;//计数占空比
uint16_t arr=__HAL_TIM_GET_AUTORELOAD(&htim1); //获取arr的值
uint16_t ccr=duty*(arr+1)//计数ccr的值
__HAL_TIM_SET_COMPARE(&htim1,要写入的值) //写ccr的值。
}