首页>>科技 >>内容

STM32入门学习笔记之PWM输出实验

发布时间:2023-10-09 09:53:30编辑:温柔的背包来源:

很多朋友对STM32入门学习笔记之PWM输出实验不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

STM32入门学习笔记之PWM输出实验

9.1 PWM简介脉宽调制技术简称PWM调制技术,是一种通过改变脉冲的宽度和频率来改变输出频率的控制方法。采样控制理论中有一个重要的结论:当将冲量相等但形状不同的窄脉冲应用于具有惯性的环节时,其效果基本相同。 PWM控制技术就是以此结论为理论基础的。它控制半导体开关器件的开通和关断,使输出端获得一系列幅度相等但宽度不等的脉冲。这些脉冲用于替代正弦波或其他所需的波形。按照一定的规则调制每个脉冲的宽度,不仅可以改变逆变电路的输出电压,还可以改变输出频率。

STM32定时器除了计数、定时、输入捕捉功能外,还具有PWM输出功能。主要工作原理是在定时器内部设置一个阈值。当CNT计数器的数量小于该阈值时,输出电平。当CNT数据大于该阈值时,输出另一个电平。通过改变这个阈值来改变占空比(因为CNT的最大计数值为65535),通过改变计数频率来改变PWM脉冲频率。

9.2 相关寄存器9.2.1 捕捉/比较寄存器: TIMx_CCMRx1514131211109876543210OC2CEOC2M[2:0]OC2PEOC2FECC2S[1:0]OC1CEOC1M[2:0]OC1PEOC1FECC1S[1:0]OCxCE:输出比较x 清零使能

0:OCxREF 不受ETRF 输入影响1:一旦检测到ETRF 输入高电平,清零OCxREF=0OCxPE:输出比较x 预载使能

0:禁用预载功能,写入的值立即生效1:使能预载功能,当更新事件到来时,TIMx_CCRx 的预载值被加载到当前寄存器注1:一旦LOCK 电平设置为3 并且CC1S=00,该位不可修改

注2:只有在单脉冲模式下,才可以使用PWM模式,无需确认预载寄存器,否则其动作不确定

OCxFE:输出比较x 快速使能(该位用于加速CC 输出对触发输入事件的响应)

0:根据计数器和CCRx 的值,当触发器的输入有有效边沿时,激活CCx 输出的最小延迟为5 个时钟周期1:无论何时,将OC 设置为比较电平比较结果,触发器有效边沿和CCx 输出之间的延迟缩短至3 个时钟周期注3:仅当通道配置为PWM1 或PWM2 模式时有效

OCxM[2:0]:输出比较x模式

CCxS[1:0]:捕捉/比较x选择(用于定义通道x输入或输出)

00:输出模式

01:输入模式,映射在TI1上

10:输入模式,映射在TI2上

11:输入模式,映射到TRC,选择内部触发输入时参考该模式

9.2.2 制动和死区寄存器:TIMx_BDTR 注:该寄存器只需要由两个高级定时器TIM1 和TIM8 控制。

1514131211109876543210MOEAOEBKPBKEOSSROSSILOCK[1:0]DTG[7:0]Bit 15:主输出使能(一旦抱闸输入有效,该位由硬件异步清0)

0:禁止OC 和OCN 输出或强制进入空闲状态1:如果相应的使能位被置位,则使能OC 和OCN 输出。位14:自动输出使能

0:MOE 只能由软件设置为1 1:MOE 可以由软件设置为1,或者在下次更新事件时自动设置为1** 注1**:一旦LOCK 电平设置为1,该位就不能设置被修改

位13:抱闸输入极性

0:抱闸输入低电平有效1:抱闸输入高电平有效** 注2**:一旦LOCK 电平设置为1,该位就不能修改

**注3**:对该位的任何写操作都需要一个APB时钟延迟才能生效。

Bit 12:制动功能使能

0:禁用制动输入1:启用制动输入**注4 **:当LOCK 电平设置为1 时,该位不能修改**注5 **:对此位的任何写操作都需要APB 时钟。延迟后才会生效。 Bit 11:运行模式下“关闭状态”选择(当MOE=1且通道为互补输出时使用该位)

0:定时器不工作时,禁止OC/OCN 输出(OC/OCN 使能输出信号=0)

1:定时器不工作时,一旦CCxE或CCxNE为1,首先打开OC/OCN并输出无效电平,然后将使能输出信号设置为1

注6:一旦LOCK 电平设置为2,该位就不能修改

Bit 10:空闲模式下的“关闭状态”选择(当MOE=0 且通道设置为输出时使用该位)

0:定时器不工作时,禁止OC/OCN 输出(OC/OCN 使能输出信号=0)

1:当定时器不工作时,一旦CCxE或CCxNE为1,OC/OCN首先输出其空闲电平,然后使能输出信号为1

注7:一旦LOCK 电平设置为2,该位就不能修改

Bit 9~Bit 8:锁定设置(该位提供写保护以防止软件错误)

00:锁定关闭,寄存器不写保护

01:锁定级别1,不能写入TIMx_BDTR寄存器的DTG、BKE、BKP、AOE位和TIMx_CR2寄存器的OISx/OISxN位

10:锁定级别2,锁定级别1的位不可写,CC极性位不可写。

11:锁定级别3,锁定级别2的位不能写,CC控制位不能写。

**注8**:系统复位后,LOCK 位只能写入一次。一旦写入TIMx_BDTR 寄存器,其内容将被冻结直至复位。

Bit 7~Bit 0:死区时间发生器设置(定义插入互补输出之间的死区时间持续时间)

9.3 PWM实验例程使用STM32的PA8,输出频率为1KHz、占空比为30%、高电平有源脉冲。

(1)创建一个基础工程以及pwm.c和pwm.h文件,并将pwm.c和pwm.h文件添加到工程中。

(2) 在pwm.h中添加以下代码。

(3) 在pwm.c中添加以下代码。

#include 'pwm.h'/************************************************ *********名称:PWM_Init功能:PWM输出初始化参数:psc:预分频器系数返回:无************************ * **************************/void PWM_Init( u16 psc ){ RCC-APB2ENR |=1CRH |=0x0000000B; //PA8复数使用函数输出RCC-APB2ENR |=1PSC=psc; TIM1-CCMR1 |=7 (4) 1.c 添加代码如下。

#include 'sys.h'#include 'delay.h'#include 'usart1.h'#include 'pwm.h'int main(){ STM32_Clock_Init( 9 ) ; //STM32时钟初始化SysTick_Init( 72 ) ; //SysTick 初始化USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200 PWM_Init( 719 ) ; //PWM初始化PWM_Set( 30 ) ; //设置占空比30% while( 1 ) { }}9.4 扩展:PWM实现DAC输出9.4.1 工作原理由于STM32F1自带2个DAC输出,当DAC不够用时,为了节省成本,需要使用PWM 和RC 滤波器来实现DAC 输出。可以列出PWM 脉冲的波形输出脉冲的时域函数表达式

9.4.2 电路设计我们现在正在设计分辨率为8 位的PWM 信号。事实上,STM32的分辨率可以达到16位甚至32位,但是分辨率越高,速度就越慢。在8位分辨率条件下,接下来我们要求1次谐波对输出电压的影响不能超过1位精度,即3.3/256=0.01289V。假设V~H~为3.3V,V~L~为0V,那么一次谐波的最大值为2*3.3/=2.1V,这就要求我们的RC滤波电路至少提供-20lg(2.1/0.01289)=-44dB 衰减。 STM32定时器的最快计数频率为72Mhz。当分辨率为8时,PWM频率为72M/256=281.25Khz。如果是一阶RC滤波器,则要求截止频率为1.77Khz。如果是二阶RC滤波器,则要求截止频率为22.34Khz。

上图所示的二阶RC滤波器的电路原理是基于二阶RC滤波器截止频率的计算公式。

可得R28C37=R29C38=RC。通过这个公式,我们选择了R和C的参数,得到了实际截止频率为33.8KHz,远远超过了理论截止频率。该电路的测量精度约为0.5LSB。

9.4.3 实验例程这里,我们只需将实验例程中的PWM 频率改为22.34KHz 即可。通过改变占空比,我们可以使用电压表来测量实际的输出电压。

PS:PWM实现DAC输出最常见的功能就是语音合成芯片。

以上知识分享希望能够帮助到大家!