一、什么是PWM
PWM 是脉冲宽度调制的缩写,可调制一系列脉冲的宽度以等效地产生所需的波形(包括形状和幅度)。编码是指通过调整占空比的变化来调整信号、能量等的变化。占空比是指信号处于高电平占信号总周期的百分比,例如方波的百分比。空置率为50%。
占空比25%
二、PWM信号输出输出和作用
1. 如果要实现PWM信号输出如何输出呢?
1) 可以通过芯片内部模块直接输出PWM信号。您只需将相应的寄存器传递给该I/O端口即可。 PWM输出有自己的功能模块,使编程更简单,数据更准确。
2)但是,如果IC中没有PWM功能模块或者要求不是很高,那么可以使用I/O口来输出PWM信号,因为PWM信号实际上是一系列电平即可。设置一些参数。一为高,一为低。具体方法是在I/O上添加定时器。如果所需PWM 信号的频率与定时器匹配,则使用定时器中断进行计数。但该方法对精度、频率等没有要求。实现这一目标是完全有可能的。
2. PWM信号应用
PWM信号是将模拟信号转换为数字电路所需编码的信号。目前,数字电路是基础,经常使用PWM信号。
大家经常看到的就是“交流调光电路”,也可以称为无级调速,只不过高电平比例增加,占空比越高变得越亮,占空比越低则越亮它成为了。亮度不是那么亮。前提是PWM频率高于人眼感知的频率。否则会出现闪烁现象。
除了调光电路外,还有直流斩波电路、蜂鸣器驱动、电机驱动、逆变电路、加湿器雾化量等应用。
三、蜂鸣器
蜂鸣器作为发声装置广泛应用于电脑、打印机、复印机、报警器、电子玩具、汽车电子、电话机、定时器等电子产品中。
蜂鸣器
蜂鸣器分为两类:压电式和电磁式。
压电蜂鸣器主要由多谐振荡器、压电蜂鸣器、阻抗匹配盒、谐振盒、外壳等组成。利用压电陶瓷的压电效应使金属板振动而产生声音。电磁蜂鸣器由振荡器、电磁线圈、磁铁、振膜和外壳组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,在电磁线圈中产生磁场。由于电磁线圈和磁铁的相互作用,振膜周期性振动并产生声音。通电时金属膜片被吸住,断电时由于膜片的弹性而弹回。有源蜂鸣器只要施加一定的电压就可以发出声音,而无源蜂鸣器则需要给予特定频率的方波或正弦波才能发出声音。
有源蜂鸣器内置振荡源,因此只要接通电源,蜂鸣器就会发出声音。 无源型没有内部振荡源,因此不能通过直流信号产生啁啾。
有源蜂鸣器通常比无源蜂鸣器更昂贵,因为它们内部有多个振荡电路。
【优点】无源蜂鸣器的优点如下。
廉价声音的频率是可以控制的,可以产生“dramifah 安慰”的效果。在某些特殊情况下,控制端口可以与LED 重复使用。有源蜂鸣器的优点是方便程序控制。 “应用” 风扇、无线电音频按钮和任何模拟值都可以使用PWM 进行编码。
四、fs4412电路图
本例使用fs4412开发板,将蜂鸣器BUZZER连接到pwm。这是电路图:
参考电路
从上面的电路图可以看出,它看起来像这样:
这个蜂鸣器是无源蜂鸣器,想要发声就需要正负极来实现图中晶体管1-2的周期性导通和关断。改变蜂鸣器的两侧以改变电流。晶体管的基极连接到SOC 的GPD0_0 引脚,并生成标记为MOTOR_PWM 的方波。继续寻找MOTOR_PWM。
连接插座
从上图可以看出,MOTOR_PWM 连接到PWM 的XpwmTOUT0,并与LCD 共享引脚GPD0_0。
进入datasheet继续查看GPD0_0的说明。
GPD0CON
从上图可以看出,GPD0_0 配置由寄存器中的GPD0CON[3:0] 位控制。当用作PWM 输出时,必须将其设置为TOUT_0 (0x2)。
同时我们还可以看到该引脚可以设置为外部中断信号[EXT_INT6]功能(0xF)。
五、Exynos 4412 PWM
概述
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 寄存器进行双缓冲,允许在周期内更新定时器参数。在当前定时器周期结束之前,新值才会生效。
Exynos 定时器的特性
1) 五个32 位定时器。
2)2个8位PCLK分频器提供一级预分频,5个二级分频器用于对外部时钟进行预分频。
3) 可编程选择PWM 独立通道。
4) 四个独立的可编程控制和PWM通道支持验证。
5) 静态配置:PWM 停止。
6) 动态配置:PWM启动。
7) 支持自动重装模式和触发脉冲模式。
8) 外部启动引脚。
9) 两路PWM输出可配备死区发生器。
10) 中断发生器。
PWM内部模块图
块
工作流程:
当时钟PCLK 使能时,定时器计数缓冲寄存器(TCNTBn)将计数器的初始值下载到递减计数器。定时器比较缓冲寄存器(TCMPBn)将初始值下载到比较寄存器并与递减计数器值进行比较。如果递减计数器和比较寄存器的值相同,则输出电平将会切换。当递减计数器减至0时,输出电平再次反转,输出周期完成。这种基于TCNTBn 和TCMPBn 的双缓冲功能允许定时器在频率和占空比变化时产生稳定的输出。每个定时器都有一个由定时器时钟驱动的专用16 位递减计数器。 当递减计数器的计数值达到0时,产生定时器中断请求,并通知CPU定时器操作完成。如果设置了自动重载功能,则当定时器递减计数器达到0 时,相应的TCNTBn 值会自动重新加载到递减计数器中并继续下一步操作。然而,如果定时器在运行时被停止,例如通过清零TCON 中的定时器使能位,TCNTBn 中的值将不会被重新加载到递减计数器中。 TCMPBn 的值用于脉宽调制。当定时器递减计数器中的值与比较寄存器中的值匹配时,定时器控制逻辑改变输出电平。因此,比较寄存器决定了PWM 输出的切换时间。
举例
让我们看一下下面的例子。
单周期实例
初始化寄存器TCNTBn=159 (50 + 109),TCMPBn=109。通过设置TCON 中的使能位来打开定时器:寄存器TCNTBn 中的值159 自动加载到减量寄存器递减计数器和输出引脚TOUTn 中。当递减计数器值减至寄存器TCMPBn 中的值109 时,输出引脚从低电平拉至高电平。当递减计数器减至0时,产生中断请求。当设置为自动重载模式时,递减计数器自动将TCNTBn 的值加载到递减计数器中并开始新的周期。占空比可以通过设置TCNTBn和TCMPBn来控制,并且TCNTBn和TCMPBn可以在每个pwm周期后重置为新值。通过执行精确计算和设置死区来设置TCNTBn 和TCMPBn 的值。可以设计各种复杂的方波。
如下所示:
参考波形
在本例中,我们只需要生成规则的方波,因此只需将占空比设置为50%即可。
六、寄存器
从第4章可以看出,我们使用的是PWM控制器的定时器0,对应的寄存器组如下图所示。
注册群
1、TFCG0
定时器配置寄存器0 (TFCG0)。主要用于预分频器设置。
TFCG0
由于我们使用的是定时器0,因此我们只需要设置该寄存器的位[7:0]。最终的输出频率和值方程为:
分频
参见第24.3.1 节。
频率
方波的频率必须在可听范围内,即“20Hz~20KHZ”,但把20Hz~20KHZ的频率给蜂鸣器后,只有某一点的频率才会最响。距离蜂鸣器的谐振频率越远,发出的声音就越安静。
因此,预分频器0 值应“设置为255”,分频器值应为1/16,并且该值由TCFG1 设置。
PWM.TCFG0=PWM.TCFG0(~(0xff))|0xf9;
2、TCFG1
定时器配置寄存器1(TCFG1) 主要用于设置PWM定时器的分频值。
TCFG1
根据上一节的分析,命令是将TCFG1字节[3:0]设置为0100,即0x2。
PWM.TCFG1=PWM.TCFG1(~(0xf))|0x2;
3、TCON
定时器控制寄存器TCON
TCON
bit[3] : 设置定时器是只运行一个周期(一次性)还是定期运行(自动重载) bit[1] : 设置为1 来更新TCNTB0 和TCMPB0 的值bit[0]:开始或stop 定时器可以为每个操作设置不同的值。
PWM.TCON=PWM.TCON(~(0xff))|(10)|(11); 定时器开启时,蜂鸣器响。 PWM.TCON=PWM.TCON(~(0xff))|(10)| ( 13); 关闭定时器并发出蜂鸣声PWM.TCON=PWM.TCON(~(10));
4、TCNTB0
定时器计数设置通过计算缓冲寄存器(TCNTB0)为100
TCNTB0
TCTB0
PWM.TCNTB0=100;
5、TCMPB0
定时器比较缓冲寄存器(TCMPB0)设置为50,占空比为50%。
TCMPB0
PWM.TCMPB0=50;
七、代码
完整代码后台响应**[armprintf]**。
#include’exynos_4412.h’voidlay_ms(unsignedintnum){inti,j;for(i=num;i0;i–)for(j=1000;j0;j–);}voidpwm_init(void){GPD0.CON=GPD0.CON(~(0xf))|0x2;PWM.TCFG0=PWM.TCFG0(~(0xff))|0xf9;PWM.TCFG1=PWM.TCFG1(~(0xf))|0x2;PWM.TCMPB0=50 ;PWM.TCNTB0=100;PWM.TCON=PWM.TCON(~(0xff))|(10)|(11);}voidbeep_on(void){PWM.TCON=PWM.TCON(~(0xff))|( 10)|(13);}voidbeep_off(void){PWM.TCON=PWM.TCON(~(10));}#defineSYS_SET_FREQUENCE25000voidbeep_set_frequence(unsignedintfre){//如果蜂鸣器声音频率为0,则返回if(0==fre)return;PWM.TCMPB0=SYS_SET_FREQUENCE/(fre+fre);//根据设置频率重置计数器比较值PWM.TCNTB0=SYS_SET_FREQUENCE/fre;//根据频率重置计数值}intmain ( void){pwm_init();while(1){beep_on();//发送提示音lay_ms(100);beep_off();//关闭蜂鸣器,每次提示音后有间隔lay_ms(100 ) ;}return0;} 您还可以通过改变频率和发音时间来播放音乐。 有兴趣的读者可以查看【一站式Linux】并找到一站式先生获取源代码。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/84708.html