【蓝桥杯】【嵌入式组别】第十四节:PWM输出编程


目的:在特定管脚上产生频率和占空比可调的方波信号。
比赛我们主要掌握PA6和PA7就可以了。

PWM输出原理

CNT: 定时器中的计数器,配置成1us增加1;
ARR: 自动重装载寄存器(相当于计数的周期),当CNT计数到ARR时,即溢出,重新开始计数;
CCRx: 比较寄存器(相当于高电平时间) ,当CNT计数到CCRx时,输出极性会翻转! (CCRx对STM32CUBE里的Pulse)
具体原理见下图:
在这里插入图片描述

单路PWM信号输出

比如本次我们让PA7输出1KHZ的方波,应该如何配置ARR重装载寄存器的值呢?
1KHZ对应的周期就是1ms,1ms就是1000微秒,所以对应的就是CNT要一微秒递增一次一共递增1000次才能到ARR。又由于ARR计数都是从0开始的,所以ARR配置为999即可实现。

在这里插入图片描述

所以我们按照上图配置好这些参数就可以了。

需要注意的是,这个“auto-reload preload”不是我们说的重装载值,而是一个很不常用的设置“预装载值”,这个启用和不启用关系不大,所以我们保持默认状态就可以了。
还有一点就是PWM输出不需要中断配置,所以不用勾选NVIC

关于下面这部分的配置:
在这里插入图片描述

这几个配置是关联起来的。“Mode”里面有两种模式,一种是“PWM mode1”,一种是“PWM mode2”,
文档里查到的定义是这样的:

  • PWM mode 1 - Channel 1 is active as long as TIM15 CNT<TIM15 CCR1
    elseinactive.
  • PWM mode 2 - Channel 1 is inactive as long as TIM15 CNT<TIM15 CCR1
    else active.

意思就是mode1代表的是当CNT< CCR1的时候采用的是不活跃状态,而mode2相反。
至于什么是活跃状态,什么是不活跃状态,则由下面的“CH Polarity”来控制,如果“CH Polarity”选择“High”,那么高电平就是活跃状态,低电平就是不活跃状态。
所以两个结合起来的意思就是,如果选择mode1并且“CH Polarity”选择“High”,那就意味着CNT< CCR1时输出的方波信号是低电平,而CNT>CCR1时输出的是高电平。我们一般都选择这种组合,比较符合直觉。而“Pulse”这个选项就是规定“活跃状态的时间”,所以我们如果上面选的组合是mode1并且“CH Polarity”选择“High”,那么此处“Pulse”就是在规定高电平的时间,那就是占空比了。
由于ARR已经被设置为了999,也就是一共1000微秒,所以Pulse为100就是占空比百分之十,Pulse为200就是占空比百分之二十。
在这里插入图片描述
所以按如上图的配置就可以了。然后直接生成代码。
在主函数中调用tim17的初始化函数之后,用hal库函数开启tim17的1通道的pwm输出即可:

	MX_TIM17_Init();
	HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);

当然我们也可以在主函数里面直接操作寄存器来更改他的频率和占空比:

TIM17->ARR=499;
TIM17->CCR1=250;

双路PWM信号输出

就是把单路的PWM代码重复一次即可。
然后在主函数中加入相应的初始化代码和开启PWM产生的代码:

MX_TIM16_Init();
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兜兜里有好多糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值