STM32
登录
直播中
李晓鹏
7年用户
1260经验值
私信
关注
[问答]
怎样通过定时器控制管脚输出PWM信号
开启该帖子的消息推送
定时器
PWM信号
管脚
脉冲宽度调制PWM是什么?
怎样通过定时器控制管脚输出PWM信号?并控制LED实现呼吸灯呢?
回帖
(1)
李勇俊
2021-11-25 14:24:25
上一章我们讲解了定时器的基本应用,以及定时器中断。这一章我们讲解通过定时器控制管脚输出PWM信号,控制LED实现呼吸灯。
1. PWM简介
脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制, PWM 原理如图所示:
上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT
=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。
2. stm32cube配置和说明
打开STM32CubeMX新建工程,选择STM32F103ZET6芯片,选择外部高速晶振(HSE)。LED1管脚PB6配置为定时器4的通道1输出。同时TIM4的通道1配置为PWM。
脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CCRx) 寄存器值决定。在 PWM 模式下,计数器寄存器(TIMx_CNT )总是与捕获/比较寄存器(TIMx_CCRx )进行比较。 下图为PWM边沿对齐模式(递增计数配置)。图中CCRx为捕获/比较寄存器,OCxREF为输出比较信号,CCxIF为中断状态标识位。
当CCRX=4时,当捕获/比较寄存器(TIMx_CCRx)比计数器小时,输出高电平,反之则输出低电平。
下图为PWM中心对齐模式。
这里设置PWM周期为20ms,其他参数为默认不用修改。其中Pulse的为设置脉宽,即为捕获/比较寄存器(TIMx_CCRx)。通过修改它的值可以修改占空比。
生成报告,以及生成代码,编译程序。
3.添加应用程序
在tim.c文件中我们找到刚才的定时器初始化函数。
刚才说到的,设置Pulse的值可以修改脉宽。这里我们在main.c文件中添加一个用户PWM设置函数,函数的参数为修改的值。
在把main()函数中添加HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1)开启定时器PWM输出。在while循环中不断修改脉宽,实现LED亮度渐变。Pulse的值最大为2000,从0开始,每100ms增加100,当增加到2000时,又逐渐递减到0。
在main.c函数前面声明pwm_value,step变量,User_PWM_Setvalue ()函数.编译程序下载(我这里LED等接在PB5,所以用杜邦线连接到PB6)。可以看到LED亮度循环逐渐变亮再变暗。
补充:TIM-PWM重映射配置,这里以TIM3_CH2部分映射为例,其他一样
其他配置跟上面一样,配置对应输入引脚就可以。
上一章我们讲解了定时器的基本应用,以及定时器中断。这一章我们讲解通过定时器控制管脚输出PWM信号,控制LED实现呼吸灯。
1. PWM简介
脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制, PWM 原理如图所示:
上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT
=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。
2. stm32cube配置和说明
打开STM32CubeMX新建工程,选择STM32F103ZET6芯片,选择外部高速晶振(HSE)。LED1管脚PB6配置为定时器4的通道1输出。同时TIM4的通道1配置为PWM。
脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CCRx) 寄存器值决定。在 PWM 模式下,计数器寄存器(TIMx_CNT )总是与捕获/比较寄存器(TIMx_CCRx )进行比较。 下图为PWM边沿对齐模式(递增计数配置)。图中CCRx为捕获/比较寄存器,OCxREF为输出比较信号,CCxIF为中断状态标识位。
当CCRX=4时,当捕获/比较寄存器(TIMx_CCRx)比计数器小时,输出高电平,反之则输出低电平。
下图为PWM中心对齐模式。
这里设置PWM周期为20ms,其他参数为默认不用修改。其中Pulse的为设置脉宽,即为捕获/比较寄存器(TIMx_CCRx)。通过修改它的值可以修改占空比。
生成报告,以及生成代码,编译程序。
3.添加应用程序
在tim.c文件中我们找到刚才的定时器初始化函数。
刚才说到的,设置Pulse的值可以修改脉宽。这里我们在main.c文件中添加一个用户PWM设置函数,函数的参数为修改的值。
在把main()函数中添加HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1)开启定时器PWM输出。在while循环中不断修改脉宽,实现LED亮度渐变。Pulse的值最大为2000,从0开始,每100ms增加100,当增加到2000时,又逐渐递减到0。
在main.c函数前面声明pwm_value,step变量,User_PWM_Setvalue ()函数.编译程序下载(我这里LED等接在PB5,所以用杜邦线连接到PB6)。可以看到LED亮度循环逐渐变亮再变暗。
补充:TIM-PWM重映射配置,这里以TIM3_CH2部分映射为例,其他一样
其他配置跟上面一样,配置对应输入引脚就可以。
举报
更多回帖
rotate(-90deg);
回复
相关问答
定时器
PWM信号
管脚
通用
定时器
无法正常
输出
2019-01-15
1629
怎样
使用
定时器
输出
指定个数的
PWM
脉冲?
2021-12-21
3438
通过
两个不同的
定时器
控制
PWM
的
输出
,如何让两者同步?
2023-11-06
405
通用TIMx
定时器
输出
PWM
配置的流程是
怎样
的
2021-11-23
789
stm32
定时器
输出
PWM
的流程是
怎样
的
2021-11-17
966
定时器
的原理是什么?
定时器
PWM
的原理又是什么
2021-11-24
1883
stm32
定时器
是如何
控制
一个
pwm
信号
的
2021-09-02
814
怎样
通过
调节
PWM
输出
的时长来调节舵机的角度呢
2021-11-25
629
如何去实现STM32103
定时器
3
输出
四路
PWM
呢
2021-12-13
1888
如何
通过
STM32F4
定时器
输出
固定数量
PWM
脉冲?
2021-07-16
1654
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分