PWM控制LED亮度(1)-STM32电控学习笔记09

PWM控制LED亮度(1)-STM32电控学习笔记09

day9:2022/9/28

在上一篇我们知道了PWM的基本概念,那么我们的stm32单片机是如何产生PWM波的呢?
STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。
STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出
这时我们就要回顾一下之前说的定时器的内容,我们知道,系统时钟的定时器是以一种从0开始到我们设置的时间之间往复的函数关系在运作
在这里插入图片描述

那么我们观察这张图,计时器从0开始,一直向上计数,直到我们设定的时间t后,再变为0,重新计数,因此如果我们想要获得PWM这种高低电平不断翻转的信号,只需要在Y轴也就是时间轴设定一个CCR(捕获寄存器值),当定时器走到CCR这个位置之前,我们的单片机给引脚持续输出低电平,当定时器跑到CCR之后时,那么就转换为高电平,因此在不断的循环往复之间,便形成了我们的PWM信号。

【PWM相关公式&函数】

Fpwm = Tclk / ((arr + 1) * (psc + 1))
pwm频率=时钟频率/(计数器值+1)(预分频值+1)
Duty circle = TIMX -> CCR / arr
占空比 = 用户设定值 / 计数器值

而想要使用PWM信号,则需要设置周期和占空比
例如时钟的上限是200,每次计数1ms,那么计数器值就是200ms,我们设置捕获值(CRR)为100,那么当定时器跑到100时就会拉高/降低电平,也就是说,200ms内有100ms为高电平,那么占空比就是50%,周期就是200ms,脉宽就是100ms。所以通过设置相关参数就可以输出我们想要的PWM方波。

接下来我们用PWM脉宽调制实现LED灯的亮度调整:

通过查询原理图我们发现,TIM5是挂载在ABP1总线上,从时钟的配置我们可以看到,其定时器频率为84Mhz
在这里插入图片描述

我们可以这么理解:定时器每1s中计数84000000次,而预分频系数就是把频率划分,如果预分频系数为84,那么时钟的频率就是84MHZ/84=1MHZ

注,预分频系数应该设定为其数值-1,例如我们想将预分频系数设置为84000,那么在配置时,预分频系数就设置为83999,计时器频率就是1000HZ,即1s内计数1000次,也就是每1ms计数一次。
在这里插入图片描述

掌握了预分频值和重装载值的基本计算和配置,那么我们只需要设置我们需要的脉宽或者占空比即可。

这两天有点摆,主要是作业有点多(doge),接下来准备国庆啦,更新就能快一点点了(对就一点点,多不了)。
PS:因为是边学边做的博客,应该有部分错误,欢迎各位指出,如有侵权相关,请随时联系博主,会第一时间删帖。(虽然纯手打的不大可能侵权吧…)

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
nrf51822并没有PWM模块,但是如果巧妙的结合PPI模块,并加上一个定时器中断就可以轻松的实现了PWM,思路是这样的: 定时器使用三个比较器 cc0、cc1和cc2,当三个比较器任何一产生比较事件的时候都会通过PPI去翻转GPIO的引脚,在初始化的时候这样设置这三个比较器: NRF_TIMER2->CC[0] = MAX_SAMPLE_LEVELS + next_sample_get(); NRF_TIMER2->CC[1] = MAX_SAMPLE_LEVELS; // CC2 will be set on the first CC1 interrupt. NRF_TIMER2->CC[2] = 0; 这是初始化的配置,到这里会有一个思考,这样的话计数器技术到cc0的时候依然会继续的往下计数,那这样的话他的再溢出的值就将回到cc2的时候也就是归零的时候,那这样的波形就分为了三段了,这不是我们所需要的,那这样要实现PWM就要把cc2的比较值往后挪,让他超过cc0,并且cc2到之前的一个比较值是固定的,这样就需要从新设置cc2的值,还有一个办法就是当计数器到cc0的时候请求中断重置计数器,但是这样做有一个问题就是进入中断是需要时间的,而当计数器到达cc0的时候就需要重置,同时计数器的下一个值就是cc2,这样就会造成冲突,所以我们使用了第一种方案。 具体实现是这样的,使能cc1比较中断,在第一次中断中重新设置cc1,让他的值变成了两倍,同时从新设置cc2,让他的值变成了cc1+N,N就是占空比参数,在第二次中断中,也是从新设置cc1,但是和上一次中断不同的是这时候设置的是cc0,而不是cc2 这样造成的计数器溢出值是这样的:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SZTU_ELIAS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值