0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PWM输出实验

汽车电子技术 来源:滑小稽笔记 作者:电子技术园地 2023-03-01 15:55 次阅读

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:输入模式,映射在TI110:输入模式,映射在TI211:输入模式,映射在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滤波器的截止频率计算公式

图片

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

9.4.3 实验例程

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

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

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

    关注

    114

    文章

    4901

    浏览量

    209917
  • 频率
    +关注

    关注

    4

    文章

    1272

    浏览量

    58484
  • 脉冲宽度调制

    关注

    7

    文章

    74

    浏览量

    13571
收藏 人收藏

    评论

    相关推荐

    转:基础篇--STM32视频 13.STM32 PWM输出实验

    【众想】大黄蜂STM32视频教程 ----刘洋边讲边写基础篇-- 13.STM32 PWM输出实验http://www.stmcu.org/module/forum/thread-606825-1-1.html
    发表于 07-14 16:56

    请问哪位大神可以分享一个简单的PWM输出实验

    求求你们了,我真的不会写PWM输出实验
    发表于 07-23 08:37

    PWM输出实验程序,发现输出PWM不正确?

    我直接用实验8 PWM输出实验程序,然后只设置TIM3->ARR=4,TIM3->CCR2=2,TIM3->SC=71,其他程序不变。 目地是想输出
    发表于 06-15 04:35

    利用电位器模拟值采样和PWM输出实验

    风扇转速调节实验实验现象使用电位器调节直流电机转速理论学习利用学过的电位器模拟值采样和PWM输出实验,结合直流电机驱动,达到电机调速的效果原
    发表于 09-08 06:49

    ALIENTEK_MINISTM32_实验8_PWM输出实验

    ALIENTEK MINISTM32 实验8 PWM输出实验,很好的资料,快来学习吧
    发表于 02-18 14:57 15次下载

    pwm输出实验

    基于STM32的pwm输出实验,用DS0灯的亮度观察pwm输出的大小
    发表于 09-09 16:58 37次下载

    PWM输出实验_标准例程

    stm32开发板,标准例程-寄存器版本,PWM输出实验
    发表于 11-18 15:42 9次下载

    实验9 PWM输出实验

    正点原子战舰最新的PWM实验
    发表于 01-22 13:13 7次下载

    基于STM32单片机进行PWM输出实验的详细资料说明

    本文档的主要内容详细介绍的是基于STM32单片机进行PWM输出实验的详细资料说明包括了:1.通用定时器PWM概述,2.常用寄存器和库函数配置,3.手把手写
    发表于 03-18 08:00 18次下载
    基于STM32单片机进行<b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>的详细资料说明

    PWM输出实验详细源代码免费下载

    本文档的主要内容详细介绍的是PWM输出实验详细源代码免费下载。
    发表于 04-23 17:17 20次下载
    <b class='flag-5'>PWM</b>的<b class='flag-5'>输出</b><b class='flag-5'>实验</b>详细源代码免费下载

    PWM输出实验的程序和工程文件免费下载

    本文档的主要内容详细介绍的是PWM输出实验的程序和工程文件免费下载。
    发表于 07-08 08:00 2次下载
    <b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>的程序和工程文件免费下载

    使用STM32F103RCT6和RBT6核心板实现PWM输出实验的程序和工程文件

    本文档的主要内容详细介绍的是使用STM32F103RCT6和RBT6核心板实现PWM输出实验的程序和工程文件免费下载。
    发表于 08-01 08:00 26次下载
    使用STM32F103RCT6和RBT6核心板实现<b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>的程序和工程文件

    使用12位ADC实现PWM输出实验的程序和工程文件免费下载

    本文档的主要内容详细介绍的是使用12位ADC实现PWM输出实验的程序和工程文件免费下载。
    发表于 08-01 08:00 4次下载
    使用12位ADC实现<b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>的程序和工程文件免费下载

    无人机电调调试的PWM输出实验资料免费下载

    本文档的主要内容详细介绍的是无人机电调调试的PWM输出实验资料免费下载。
    发表于 06-08 08:00 4次下载
    无人机电调调试的<b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>资料免费下载

    PWM输出实验详细示例

    目录PWM输出实验PWM的工作原理(以向上计数为例)PWM与AFIO引脚重映射综合实验库函数使用
    发表于 12-20 18:58 2次下载
    <b class='flag-5'>PWM</b><b class='flag-5'>输出</b><b class='flag-5'>实验</b>详细示例