如何实现PWM功能
Leon
|
2020.01.04
|
0
+关注

PWM基本配置

脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。在新能源汽车行业中PWM经常用到电机控制以及充电功能的场景的当中。

我们下面就以NXP的一款芯片为例,详细讲解一下如何实现PWM的控制工程,

首先想要了了解PWM我们首先要明确两个概念,

1. 占空比,这种概念完全可以网上直接搜一下,但为了方便大家阅读我还是直接贴出来了(占空比是指电路被接通的时间占整个电路工作周期的百分比。比如说,一个电路在它一个工作周期中有一半时间被接通了,那么它的占空比就是50%。如果加在该工作元件上的信号电压为5V,则实际的工作电压平均值或电压有效值就是2.5V。假设该元件为一个电子阀门,当电路全部接通时,阀门全开;当占空比为50%时,阀门状态为半开。同理,当占空比设置为20%时,阀门的开度显然应该为20%。这样,这个阀门就可以在0%(全闭)到100%(全开)的范围内任意调节。

2. 死区时间:死区时间是PWM输出时,为了使H桥或半H桥的上下管不会因为 开关速度问题发生同时导通而设置的一个保护时间段,所以在这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。

下面我们以NXP系列芯片详细讲解一下如何实现PWM的输出与捕获功能,PWM的是有自己的模块的,也可以通过其他模块来实现,例如eTimer,NXP给的SDK包中就是用eTimer模块来实现的,具体用哪个模块需要看你所需要的引脚包含什么模块。

例如:

D1这个引脚,只有输入时没有PWM模块,所以可以用eTimer来实现PWM功能

D2 这个引脚包含PWM与eTimer功能,所以PWM可以又这两个模块来实现:

说到这里我们又要引入一个引脚复用的问题,对于已经用过NXP芯片的师兄来说应该都知道,但对于没用过的人还是简单的科普一下,MSCR寄存器就是控制你当前这个引脚选择的是那种模式,每个引脚对应的MSCR寄存器都是不一样的,具体是如何对应的请参照Datasheet。

下面我们就根据代码的配置以及手册中的介绍来简单讲解一下如何实现PWM功能

1. 首先要配置时钟,关于时钟的配置我这里就不详细的说了,这里完全可以单独拉出来讲很长时间,后续我这里会有单独的文章讲如何配置时钟

如果大家对时钟配置感兴趣,可以根据手册中的demo自己配置几种模式,但是初学的话还是有一定难度的,重要的是如何搞好变频,分频,以及时钟的选择,各重要的是要搞懂为何要这么做,很多的时候是决定于你们公司产品的需求,这块可以详细的和你们公司的硬件工程师去详细讨论一下,以及怎么选的晶振.

2. 接下来就是管脚的配置了,将你所需要的端口配置成PWM的输出与输入

3. PW模块的配置,这里面主要就是详细的去配置如何去实现PWM功能了,寄存器有很多每个实现的功能也不一样,每个寄存器包含的每一位可能都是决定不同的功能了,在这里就不详细的展开了(因为很多不经常用的功能其实我现在也没有搞懂)。

PS:建议大家根据代码中的例子去对照着看芯片手册中的寄存器,这样相对看起来会轻松一点,否则直接去芯片手册中看寄存器的话,肯定看的云里雾里的。

4. PWM的实现

/* Loop forever */

for (;;)

{

FLEXPWM_0.SUB[0].CAPTCTRLX.B.ARMX = 1; // starts the input capture process

while(!(0x0080 & FLEXPWM_0.SUB[0].STS.R)){}; // wait for capture flag X1

rising_edge = FLEXPWM_0.SUB[0].CVAL0.R; // read captured value for rising edge

falling_edge = FLEXPWM_0.SUB[0].CVAL1.R; // read captured value for falling edge

pulseH = falling_edge-rising_edge;

duty = (float)(pulseH*100)/PWM_MODULO;

LEXPWM_0.SUB[0].STS.R = 0x00C0; // clear CFX1/CFX0 flags

总结:在这里只是简单的讲了一下如何实现PWM,包括在捕获的时候都没有用到中断,在这里个人建议如果实现PWM捕获功能最后去中中断来实现,这样会减少占用CPU资源

精选留言
延伸阅读
更多报告干货
写留言
3580
阅读
收藏
回到顶部