zoukankan      html  css  js  c++  java
  • STM32 CubeMX 学习:004-PWM

    背景

    上一讲,我们介绍了 STM32 CubeMX 学习:定时器 ,并示范了如何使用定时器来定时。这一讲我们来试试PWM(Pulse Width Modulation, 脉冲宽度调制),这是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。

    HOST-OS : Windows-10
    STM32 Cube :v5.6
    MCU : STM32F429
    LIB : stm32cube_fw_f4_v1250

    知识

    基本概念

    脉冲调制有两个重要的参数,(在STM32中,这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX)

    • 输出频率 : 频率越高,则模拟的效果越好。
    • 占空比 : 占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。

    PWM值 :在一个周期内,开关管导通时间长短相加的平均值。导通时间越长,则直流输出的平均值越大。(因此,可以等效于模拟电路)

    例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。

    PWM输出频率 : 指这一次导通到下一次导通的时间的倒数。

    PWM占空比:指的是输出的PWM中,高电平保持的时间 与 该PWM的时钟周期的时间之比。

    如,一个PWM的频率是1000Hz(时钟周期就是1ms,1000us),如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。

    PWM分辨率 :分辨率也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。频率就是这样的,如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80,那么它的分辨率最小就是1:80了,但是它也快了,也就是说PWM的输出频率高了。

    PWM斜率:

    • 假设一个PWM从0计数到80,之后又从0计数到80.这个就是单斜率
    • 假设一个PWM从0计数到80,之后是从80计数到0.这个就是双斜率。可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) =1:160,就是提高了一倍。

    单片机是如何控制产生PWM的:

    • 假设PWM是单斜率,设定最高计数是80,我们再设定一个比较值是10,那么T/C从0计数到10时(这时计数器还是一直往上计数,直到计数到设定值80),单片机就会根据你的设定,控制某个IO口在这个时候是输出1还是输出0还是端口取反,这样,就是PWM的最基本的原理了。

    补充:PWM"死区"(电机控制方面有关:让桥臂上的上面两个管子或下面两个同时给高电平即为刹车。不让同边导通 为 死区。)

    • 通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。
    • 死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。(就是上、下半桥的元件都是关断的)死区时间控制在通常的低端单片机所配备的PWM中是没有的。死区时间是PWM输出时,为了使H桥或半H桥的上下管不会因为开关速度问题发生同时导通而设置的一个保护时段,所以在这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。

    STM32 与 PWM

    在STM32中,每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器值和计数器值比较,通过比较结果输出高低电平,实现PWM信号。
    在PWM输出模式下,除了CNT(计数器当前值)、TIMX_ARR (自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
    上文提到,脉冲调制有两个重要的参数,输出频率分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。

    • TIMX_ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。
    • 在计数时会不停的和TIMX_CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于TIMX_CCRX值的话电平极性反相。所以这也就控制了占空比。
    • 当 CNT 小于 TIMX_ARR 时,TIMx_CHx通道输出低电平;当 CNT 等于或大于 TIMX_CCRX 时,TIMx_CHx通道输出高电平。

    PWM的工作模式:

    • PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件。
    • PWM模式2(向下计数) :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件。

    PWM频率计算
    Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)

    • arr 是计数器值
    • psc 是预分频值

    占空比:

    • duty circle = TIM3->CCR1 / arr(单位:%)
    • TIM3->CCR1 用户设定值

    比如 定时器频率Tclk = 72Mhz arr=499 psc=71。 那么PWM频率就是720000/500/72= 2000Hz,即2KHz。
    arr=499,TIM3->CCR1=250 则pwm的占空比为50%

    CubeMX 配置 PWM (以 TIM4 为例)

    需要配置好 RCC 时钟

    1)在Pinout & Configuration中,选择一个 定时器 (例如 TIM4)
    2)"Mode"

    • "Clock Source" :选择 "Internal CLock"
    • "Channle 1":选择 "PWM Generation CH1"

    3)"Configuration " - "Parameter Settings"中

    • PSC : 167
    • Counter Mode: Up
    • Counter Period: 999
    • auto-reload preload: Enable
    • Trigger Event Selection : Reset
    • Mode : PWM模式
    • Pulse:占空比值 先给0
    • Fast Mode : PWM脉冲快速模式(Disable, 和我们配置无关,不使能)
    • CH Polarity : 通道极性(这个通道的初始电平高低)
    1. "Configuration " - "NVIC Settings"中 : 勾选 "Enabled" (开启中断)
      5)右上角,"GENERATE CODE"
  • 相关阅读:
    记录:VC++中打开保存目录选择对话框操作
    Active Server Pages 错误 ASP 0201 的最终解决办法
    已经阅读过的Ajax文章资源
    Delphi编译/链接过程
    初探Object Pascal的类(四)
    初探Object Pascal的类(九)
    初探Object Pascal的类(十)
    初探Object Pascal的类(五)
    初探Object Pascal的类(八)
    Delphi 7 IDE 界面
  • 原文地址:https://www.cnblogs.com/schips/p/12446707.html
Copyright © 2011-2022 走看看