一、什么是PWM
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值)。对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。

二、PWM信号输出输出和作用
1、如何实现PWM信号输出如何输出呢?
- 可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成的pwm控制器,只需要通过对应的寄存器即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。
- 但是如果IC内部没有PWM功能模块,或者要求不是很高的话可以利用I/O口设置一些参数来输出PWM信号,因为PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器,对于你要求输出的PWM信号频率与你的定时器一致,用定时器中断来计数,但是这种方法一般不采用,除非对于精度、频率等要求不是很高可以这样实现。
2、PWM信号应用
PWM信号可以把模拟信号转化为数字电路所需要的编码,现在基本是采用数字电路,因此在很多场合都采用PWM信号。
我们经常见到的就是交流调光电路,也可以说是无级调速,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率,要不然会出现闪烁现象。
除了在调光电路应用,还有在直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等都会有应用。

三、蜂鸣器
蜂鸣器广泛用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。实物如下图所示

蜂鸣器分为压电式及电磁式的二大类:
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。它是以压电陶瓷的压电效应,来带动金属片的振动而发声;
电磁式的蜂鸣器,由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。通电时将金属振动膜吸下,不通电时依振动膜的弹力弹回。
有源蜂鸣器, 只要给它加上恒定的电压, 就能发声;无源蜂鸣器, 必须给它加上一定频率的方波或正弦波才能发声
有源蜂鸣器内部带震荡源,所以一通电就会叫。 而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。
四、PWM调制

配置PWM前,先了解定时器、比较器、周期以及占空比等。
定时器图:

这个时钟信号10Hz等价于这块芯片的心跳,一块芯片主频,每隔0.1s会被计数器接收,而计数器则会每次减一,直到0为止,如果周期是0.1s,而计数器是100,则定时时间为10s,当计数器完毕后则会产生一个中断。
如果这个定时器是一个PWM定时器,则会多一个比较器和一个输出管脚pin,在工作的时候就会输出电平,这个图中输入信号是10Hz,计数器的值是100,比较器的值是50,问从100减到50需要花多长时间? 答案是5s。
也就是5s后计数器的值和比较器的值相等,输出管脚pin输出的电平就会进行反转,从低电平跳到了高电平,刚才计数器100减到50,现在还有50,50减到0需要5s,输出管脚pin又从低电平跳转到高电平。
如果想让高电平的值为8s,那么应该将比较器的值设置为多少?设置比较器的值为80。由此可以得出结论——通过控制比较器的值就可以决定这个周期内高电平时间(占空比),控制时钟频率和计数器则决定了输出的信号频率。

输出频率会比输入频率高吗?不会,输出频率只会小于等于输入频率
f = 1 / T;
T = 1 / f;

面积等效原理:
冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同
从高电平到低电平,再到回到高电平所花的时间叫周期;
而一秒钟内有多少个这样的周期叫PWM的频率;
周期的单位是秒;
频率的单位是Hz;
周期0.02秒的频率是50Hz;
1/0.02 = 50Hz,一秒内变化50次;
占空比:高电平所占的时间比例;
五、fs4412电路图
在核心板原理图中搜索Hz可以看到这个电路,其中24MHz是对应的晶振,而这个电路PLL则是锁相环,作用是将外部时钟信号进行倍频

本例采用fs4412开发板,pwm外接了一个蜂鸣器BUZZER,电路图如下:

从上面电路图可知:
- 该BUZZER是无源蜂鸣器,如果要想发出声音,需要正负极产生电流变化,我们通过生成方波,从而实现图中三极管1->2周期性导通和关闭来让BUZZER俩边电压产生变化,从而实现电流变化;
- C73这个电容的功能是实现滤波的作用,将交流电转换为直流电;
- 三极管的基极连接的是SOC的GPD0_0引脚;
- 产生方波我们借助的是PWM,标号为MOTOR_PWM。
在核心板中继续查找MOTOR_PWM:

由上图可知,MOTOR_PWM连接的是PWM的XpwmTOUT0,和LCD一起复用引脚GPD0_0,去datasheet继续查看GPD0_0说明,

由上图可知,GPD0_0配置由寄存器的GPD0CON[3:0]位控制,要想作为PWM输出,要设置为TOUT_0即0x2。
//1.配置GPD0为定时器输出
GPD0.CON = (GPD0.CON & ~0xf) | 0x2;
同时也可以看到,该引脚还可以设置为外部中断信号[EXT_INT6]功能即0xF。
五、Exynos 4412 PWM
1、概述
Exynos 4412 SCP有五个32位脉冲宽度调制(PWM)定时器。这些定时器产生内部中断对于ARM子系统。此外,定时器0、1、2和3包括驱动外部I/O的PWM功能信号。定时器0中的PWM有一个可选的死区发生器功能,以支持大量的设备。定时器4是一个没有输出引脚的内部定时器。
定时器使用APB-PCLK作为源时钟。定时器0和1共享可编程8位预分频器为PCLK提供第一级分频。定时器2、3和4共享不同的8位预分频器。每个计时器都有它自己的专用时钟分频器,提供第二级时钟划分频(预分频器除以2、4、8或16)。
每个定时器都有它的32位递减计数器;定时器时钟驱动这个计数器。定时器计数缓冲寄存器(TCNTBn)加载递减计数器的初始值。如果递减计数器达到零,它将生成计时器中断请求,通知CPU定时器操作完成。如果定时器下降计数器达到零,相应TCNTBn的值自动重新加载到下一个循环开始。但是,如果定时器停止,例如,在定时器运行模式下,通过清除TCONn的定时器使能位,TCNTBn的值将不会重新加载到计数器中。
PWM功能使用TCMPBn寄存器的值。定时器控制逻辑改变输出电平下计数器值与定时器控制逻辑中比较寄存器的值相匹配。因此,比较寄存器决定PWM输出的开启时间或关闭时间。
每个定时器都是双缓冲结构,带有TCNTBn和TCMPBn寄存器,允许定时器参数在周期中更新。新值在当前计时器周期完成之前不会生效。

2、Exynos PWM定时器的特性
- 5个32位定时器;
- 2个8位PCLK分频器提供一级预分,5个2级分频器用来预分外部时钟;
- 可编程选择PWM独立通道。
- 4个独立的可编程的控制及支持校验的PWM通道。
- 静态配置:PWM停止;
- 动态配置:PWM启动;
- 支持自动重装模式及触发脉冲模式;
- 一个外部启动引脚。
- 两个PWM输出可带Dead-Zone 发生器。
- 中断发生器。
3、PWM内部模块图

工作的步骤:
- 当时钟PCLK被使能后,定时器计数缓冲寄存器(TCNTBn)把计数器初始值下载到递减计数器中。
- 定时器比较缓冲寄存器(TCMPBn)把其初始值下载到比较寄存器中,并将该值与递减计数器的值进行比较。当递减计数器和比较寄存器值相同时,输出电平翻转。
- 递减计数器减至0后,输出电平再次翻转,完成一个输出周期。这种基于TCNTBn和TCMPBn的双缓冲特性使定时器在频率和占空比变化时能产生稳定的输出。
- 每个定时器都有一个专用的由定时器时钟驱动的16位递减计数器。当递减计数器的计数值达到0时,就会产生定时器中断请求来通知CPU定时器操作完成。当定时器递减计数器达到0的时候,如果设置了Auto-Reload 功能,相应的TCNTBn的值会自动重载到递减计数器中以继续下次操作。
- 然而,如果定时器停止了,比如在定时器运行时清除TCON中定时器使能位,TCNTBn的值不会被重载到递减计数器中。
- TCMPBn 的值用于脉冲宽度调制。当定时器的递减计数器的值和比较寄存器的值相匹配的时候,定时器控制逻辑将改变输出电平。因此,比较寄存器决定了PWM 输出的开关时间。
4、举例
下面我们举个实例来看下,

- 初始化寄存器 TCNTBn = 159 (50 + 109) ,TCMPBn =109.
- 开启定时器: 通过设置TCON的开启位.寄存器TCNTBn 的值159将自动加载到递减寄存器down-counter, 同时输出引脚TOUTn 设置为低电平.
- 当down-counter 的值递减打破和寄存器TCMPBn 的值109相同时, 输出引脚将从低拉到高.
- 当down-counter递减到0时, 产生一个中断请求.
- 如果我们设置成autoreload模式,那么down-counter会自动加载。
TCNTBn的值到down-counter,开启新的一个周期。我们可以通过设置TCNTBn、TCMPBn来控制占空比,而每个pwm周期后都可以重新设置新的值到TCNTBn、TCMPBn,我们通过精确的计算来设置TCNTBn、TCMPBn的值并通过设置dead zone我们可以设计出各种复杂的矩形波。
如下图所示:

本例我们只需要产生规则的举行方波即可,所以我们只需要设置占空比为50%即可。
六、寄存器
由第四章可知,我们使用PWM控制器的timer 0,对应的寄存器组如下图所示:

1、TFCG0
定时器配置寄存器0(TFCG0) ,主要用于预分频设置。

本例使用的是timer 0,所以只需要设置该寄存器的bite【7:0】即可,最终的输出频率和value的公式如下:

示例如下:

通过用户手册第七章节Clock Management Unit可查询到PWM的系统时钟频率。

然后就可以根据公式设置输入定时器的时钟频率了
需求:
让beep发出声音,声音频率:523HZ
<1>确定定时器工作的时钟信号
100MHZ----->一级分频----->二级分频------>定时器的时钟信号
Timer Input Clock Frequency = PCLK/({prescaler value + 1})/{divider value}
= 100MHZ/(199 + 1) / 2
= 250KHZ
TCFG0 = TCFG0 & ~(0xff << 0); // 一级分频 预分频 输入时钟频率
TCFG0 = TCFG0 | (C7 << 0);
TCFG1 = TCFG1 & ~(0xf << 0); //二级分频 分频 1/16
TCFG1 = TCFG1 | (0x1 << 0);
<2>确定计数器和比较器的值
TCNTB0 = 478 // 250 * 1000 / 523 = 478
TCMPB0 = 239
<3>让定时器工作
A.将buffer的值加载到计数器和比较器
TCON = TCON | (1 << 1);
TCON = TCON & ~(1 << 1);
B.开启定时器
TCON = TCON | (1 << 0) | (1 << 3);
2、TCFG1
定时器配置寄存器1(TCFG1) 主要用于PWM定时器的divider value设置。

由上一节分析,设置TCFG1 bite【3:0】为0100即0x2即可。
PWM.TCFG1 = PWM.TCFG1 & (~(0xf)) | 0x2;
3、TCON
timer控制寄存器TCON
设置好PWM的输入输出频率后,接下来就是对定时器timer0的相关功能配置了

- bite[3] : 设置定时器是只执行一个周期(One-shot)还是周期执行(auto-reload),开启自动重载。
- bite[1]: 置为1,则更新TCNTB0 、TCMPB0 的值,就是更新计数器和比较器的值,由于第一次计数器和比较器中,没有值,需要手动把值写进入,写入之后,我们可以关闭手动更新,之后设置为自动更新,系统会自动的把值给加载到计数器和比较器中。
- bit[0]:开启或者停止定时器
具体配置如下:
//5.配置为手动更新,第一次设置的时候,需要手动更新。
PWM.TCON = (PWM.TCON ) |(1 << 1);
//6.配置为关闭手动更新
PWM.TCON = (PWM.TCON ) & ~(1 << 1);
//7.开始自动重载
PWM.TCON = (PWM.TCON) | (1 << 3);
4、TCNTB0
定时器计数缓冲寄存器(TCNTB0)根据测算,设置为100

PWM.TCNTB0 = 100;
5、TCMPB0
定时器比较缓冲寄存器(TCMPB0 )设置为50,占空比为50%

PWM.TCMPB0 = 50;


被折叠的 条评论
为什么被折叠?



