定时器实现pwm波

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的关系式为y=0.5sin(2\pi t)+0.5,请写出代码实现这一功能。

解答:用占空比替代亮度得duty=0.5sin(2\pi t)+0.5

//导入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的值。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值