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

电子说

1.2w人已加入

描述

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模式

PWM

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文件添加进工程。

PWM

(2)pwm.h添加代码如下。

PWM

(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脉冲的波形可以列写出脉冲的时域函数表达式

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。

PWM

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

PWM

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

9.4.3 实验例程

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

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分