10.2 PWM的原理与控制程序

本文档详细介绍了PWM的工作原理,并提供了一段基于单片机的PWM配置和控制程序,涵盖了频率设置、占空比调整以及中断服务函数的实现,以实现不同占空比的PWM输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PWM 在单片机中的应用是非常广泛的,它的基本原理很简单,但往往应用于不同场合上意义也不完全一样,这里我先把基本概念和基本原理给大家介绍一下,后边遇到用的时候起码知道是个什么东西。

PWM 是 Pulse Width Modulation 的缩写,它的中文名字是脉冲宽度调制,一种说法是它利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术,其实就是使用数字信号达到一个模拟信号的效果。这是个什么概念呢?我们一步步来介绍。

首先从它的名字来看,脉冲宽度调制,就是改变脉冲宽度来实现不同的效果。我们先来看三组不同的脉冲信号,如图 10-1 所示。
图 10-1  PWM 波形
图 10-1  PWM 波形

这是一个周期是 10ms,即频率是 100Hz 的波形,但是每个周期内,高低电平脉冲宽度各不相同,这就是 PWM 的本质。在这里大家要记住一个概念,叫做“占空比”。占空比是指高电平的时间占整个周期的比例。比如第一部分波形的占空比是 40%,第二部分波形占空比是 60%,第三部分波形占空比是 80%,这就是 PWM 的解释。

那为何它能对模拟电路进行控制呢?大家想一想,我们数字电路里,只有 0 和 1 两种状态,比如我们第 2 章学会的点亮 LED 小灯那个程序,当我们写一个 LED = 0;小灯就会长亮,当我们写一个 LED = 1;小灯就会灭掉。当我们让小灯亮和灭间隔运行的时候,小灯是闪烁。

如果我们把这个间隔不断的减小,减小到我们的肉眼分辨不出来,也就是 100Hz 以上的频率,这个时候小灯表现出来的现象就是既保持亮的状态,但亮度又没有 LED = 0;时的亮度高。那我们不断改变时间参数,让 LED = 0;的时间大于或者小于 LED = 1;的时间,会发现亮度都不一样,这就是模拟电路的感觉了,不再是纯粹的 0 和 1,还有亮度不断变化。大家会发现,如果我们用 100Hz 的信号,如图 10-1 所示,假如高电平熄灭小灯,低电平点亮小灯的话,第一部分波形熄灭 4ms,点亮 6ms,亮度最高,第二部分熄灭 6ms,点亮 4ms,亮度次之,第三部分熄灭 8ms,点亮 2ms,亮度最低。那么用程序验证一下我们的理论,我们用定时器T0 定时改变 P0.0 的输出来实现 PWM,与纯定时不同的是,这里我们每周期内都要重载两次定时器初值,即用两个不同的初值来控制高低电平的不同持续时间。为了使亮度的变化更加明显,程序中使用的占空比差距更大。
   
   
  1. #include <reg52.h>
  2. sbit PWMOUT = P0^0;
  3. sbit ADDR0 = P1^0;
  4. sbit ADDR1 = P1^1;
  5. sbit ADDR2 = P1^2;
  6. sbit ADDR3 = P1^3;
  7. sbit ENLED = P1^4;
  8. unsigned char HighRH = 0; //高电平重载值的高字节
  9. unsigned char HighRL = 0; //高电平重载值的低字节
  10. unsigned char LowRH = 0; //低电平重载值的高字节
  11. unsigned char LowRL = 0; //低电平重载值的低字节
  12. void ConfigPWM(unsigned int fr, unsigned char dc);
  13. void ClosePWM();
  14. void main(){
  15. unsigned int i;
  16. EA = 1; //开总中断
  17. ENLED = 0; //使能独立 LED
  18. ADDR3 = 1;
  19. ADDR2 = 1;
  20. ADDR1 = 1;
  21. ADDR0 = 0;
  22. while (1){
  23. ConfigPWM(100, 10); //频率 100Hz,占空比 10%
  24. for (i=0; i<40000; i++);
  25. ClosePWM();
  26. ConfigPWM(100, 40); //频率 100Hz,占空比 40%
  27. for (i=0; i<40000; i++);
  28. ClosePWM();
10. 10PWM 模块 芯片包含一个 10PWM 模块,可配置为 4 路共用周期、独立占空比的输出,和 1 路独立周期、独立占 空比的输出,或 2 组互补输出。 10.1 引脚配置 应通过将对应的 TRIS 控制位置 0 来将相应的 PWM 引脚配置为输出。 10.2 相关寄存器说明 PWM 控制寄存器 PWMCON0(15H) 15H Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PWMCON0 CLKDIV[2:0] PWM4EN PWM3EN PWM2EN PWM1EN PWM0EN R/W R/W R/W R/W R/W R/W R/W R/W R/W 复位值 0 0 0 0 0 0 0 0 Bit7~Bit5 CLKDIV[2:0]: PWM时钟分频 111= FHSI/128 110= FHSI/64 101= FHSI/32 100= FHSI/16 011= FHSI/8 010= FHSI/4 001= FHSI/2 000= FHSI/1 Bit4~Bit0 PWM0/1/2/3/4EN: PWM0/1/2/3/4使能位 1= 使能PWM0/1/2/3/4 0= 禁止PWM0/1/2/3/4 PWM 控制寄存器 PWMCON1(16H) 16H Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PWMCON1 --- --- PWM2DTEN PWM0DTEN --- --- DT_DIV<1:0> R/W --- --- R/W R/W --- --- R/W R/W 复位值 --- --- 0 0 --- --- 0 0 Bit7~Bit6 未用 Bit5 PWM2DTEN: PWM2死区使能位 1= 使能PWM2死区功能,PWM2PWM3组成一对互补输出 0= 禁止PWM2死区功能 Bit4 PWM0DTEN: PWM0死区使能位 1= 使能PWM0死区功能,PWM0和PWM1组成一对互补输出 0= 禁止PWM0死区功能 Bit3~Bit2 未用 Bit1~Bit0 DT_DIV[1:0] 死区时钟源分频 11= FHSI/8 10= FHSI/4 01= FHSI/2 00= FH9.2 TIMER2 的工作原理 TIMER2 模块的输入时钟是系统指令时钟(FSYS/4)。时钟被输入到 TIMER2 预分频器,有如下几种分频 比可供选择:1:1、1:4 或 1:16。预分频器的输出随后用于使 TMR2 寄存器递增。 持续将 TMR2 和 PR2 的值做比较以确定它们何时匹配。TMR2 将从 00h 开始递增直至 PR2 中的值匹 配。匹配发生时,会发生以下两个事件: ⚫ TMR2 在下一递增周期被复位为 00h ⚫ TIMER2 后分频器递增 TIMER2 PR2 比较器的匹配输出随后输入给 TIMER2 的后分频器,后分频器具有 1:1 至 1:16 的后分频 比可供选择。TIMER2 后分频器的输出用于使 PIR1 寄存器的 TMR2IF 中断标志位置 1。 TMR2 和 PR2 寄存器均可读写。任何复位时,TMR2 寄存器均被设置为 00h 且 PR2 寄存器被设置为 FFh。 通过将 T2CON 寄存器的 TMR2ON 位置 1 使能 TIMER2;通过将 TMR2ON 位清零禁止 TIMER2。 TIMER2 预分频器由 T2CON 寄存器的 T2CKPS 位控制;TIMER2 后分频器由 T2CON 寄存器的 TOUTPS 位控制。 预分频器和后分频器计数器在以下情况下被清零: 1. 对 TMR2ON=0 时。 2. 发生任何器件复位(上电复位、看门狗定时器复位或欠压复位)。 注:写 T2CON 不会将 TMR2 清零,在 TMR2ON=0 时,TMR2 寄存器不能进行写操作。根据上面再次配置中微sc8p8022pwm程序
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值