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

发布时间:2024-04-29  

9.1 PWM简介

脉冲宽度调制(Pulse Width Modulation)技术,简称PWM调制技术,是一种通过改变脉冲的宽度以及频率来改变输出频率的一种控制方式。采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。


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


9.2 相关寄存器

9.2.1 捕获/比较寄存器:TIMx_CCMRx

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OC2CE OC2M[2:0] OC2PE OC2FE CC2S[1:0] OC1CE OC1M[2:0] OC1PE OC1FE CC1S[1:0]





OCxCE:输出比较x清0使能


0:OCxREF不受ETRF输入的影响


   1:一旦检测到ETRF输入高电平,清除OCxREF=0

OCxPE:输出比较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这两个高级定时器才需要控制。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MOE AOE BKP BKE OSSR OSSI LOCK[1:0] DTG[7:0]








Bit 15:主输出使能(一旦刹车输入有效,该位被硬件异步清0)


0:禁止OC和OCN输出或强制为空闲状态


   1:如果设置了相应的使能位,则开启OC和OCN输出。

Bit 14:自动输出使能


0:MOE只能被软件置1


   1:MOE能被软件置1或在下一个更新事件被自动置1

** 注1** :一旦LOCK级别设为1,则该位不能被修改


Bit 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"

/***************************************************

Name    :PWM_Init

Function    :PWM输出初始化

Paramater  :

      psc:预分频系数

Return    :None

***************************************************/

void PWM_Init( u16 psc )

{

  RCC->APB2ENR |= 1<<2 ;

  GPIOA->CRH &= 0xFFFFFFF0 ;                  //清除PA8配置

  GPIOA->CRH |= 0x0000000B ;                  //PA8复用功能输出

  RCC->APB2ENR |= 1<<11 ;                    //TIM1时钟开启

  TIM1->ARR = 100 ;

  TIM1->PSC = psc ;

  TIM1->CCMR1 |= 7<<4 ;                    //CH1 PWM2模式

  TIM1->CCMR1 |= 1<<3 ;                    //CH1预装载使能

  TIM1->CCER |= 1<<1 ;                      //OC1低电平有效

  TIM1->CCER |= 1<<0 ;                      //OC1输出使能

  TIM1->BDTR |= 1<<15 ;                    //MOE输出使能

  TIM1->CR1 |= 1<<7 ;                      //自动重装载使能

  TIM1->CR1 |= 1<<0 ;                      //开启定时器1

}

/***************************************************

Name    :PWM_Set

Function    :PWM设置

Paramater  :

      pwm_data:占空比

Return    :None

***************************************************/

void PWM_Set( u8 pwm_data )

{

  TIM1->CCR1 = pwm_data ;

}

(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。如果是1阶RC滤波,则要求截止频率为1.77Khz,如果为2阶RC滤波,则要求截止频率为22.34Khz。


图片

上图所示位二阶RC滤波器的电路原理,根据二阶RC滤波器的截止频率计算公式

图片

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

9.4.3 实验例程

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

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

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>