PWM

89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。

1 软件延时法

利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。

程序如下:

#include<reg52.h>
sbit pwm=P1^0;
main()
{
while(1)
{
 
pwm=1;
delayus(60);//置高电平后延时60us,占空比60%
pwm=0;
delayus(40);
}
}
void delayus(uint x)
{
while(x--);
}

proteus软件仿真结果如下:

51单片机产生PWM方法

可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是这种方法的缺点也相当明显。当程序除了要输出pwm波还要执行其他操作比如键盘扫描、显示等操作时,需要占用CPU一定的机器周期,这样就会影响pwm的准确度。现在很少会用到这种方法,接下来要介绍的是比较常用的方法。

2 定时器产生pwm

这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。

2.1 注意事项

2.2.1中断服务程序的内容。

一般来说中断服务程序只完成改变标志位、转换高低电平的功能,如果中断服务程序中有太多的操作会影响pwm波的输出,尤其是除法、取余、浮点数运算会占用大量的机器周期,应在中断外完成运算。
2.2.2定时器装入初值的问题。

装入初值不能太接近于定时器的溢出值。如我们使用定时器方式1,最多能计65536个数,假设我们转入的初值为65534,那么定时器计两个数就会进入中断,这样会使程序紊乱而其他功能无法正常地执行,所以一般要留50-100个数的裕量。

2.2 定时器工作方式

在定时器工作方式的选择上,可以选择定时器的工作方式0、1、2都可以,本文采用的是工作方式1,即16位定时器,这样可以获得较宽的调频范围。

2.3 定时器初值的计算

设占空比为α,频率为f

产生高电平时装入定时器高8位的值应为

产生高电平时装入定时器低8位的值应为

显然,产生低电平时的公式只要把α换成(1-α)就行了。

然而在51单片机中,浮点数运算需要消耗cpu很长的时间,为了提高程序效率,通常用100倍的占空比来计算。同时,要注意数据类型,避免超出范围,影响计算结果。关于C51的乘除法问题,可以看以下这篇文章: http://blog.163.com/ssou_1985/blog/static/295320362010311102232210/

修改后的公式如下:
a为100倍占空比,fr为0.01倍频率
TH0 = (65535-a*100/fr)/256; //高位初值
TL0 = (65535-a*100/fr)%256;
同样,低电平的公式只需把a换成(100-a)即可。

2.4 例程

本例程采用定时器T0在工作方式1下产生一路PWM,用独立键盘控制频率、占空比的加减,频率可调范围100Hz-10kHz,占空比0-100%(均为理论值,实际值略低)
部分代码如下:

51单片机产生PWM方法

注:T0_H , T0_L , T1_H , T1_L 均用于暂时存储初值,进入中断服务程序后直接给寄存器TH0、TL0赋值,避免了在中断中计算。
51单片机产生PWM方法

注:flag为pwm输出标志,flag=1输出高电平,flag=0输出低电平

2.5 软件仿真结果

2.5.1 频率为100Hz

a.占空比约15%

51单片机产生PWM方法

b.占空比95%

51单片机产生PWM方法

2.5.2 频率为10KHz

a.占空比15%

51单片机产生PWM方法

b.占空比90%

51单片机产生PWM方法

转自: 玩转单片机

围观 382

脉宽调制(PWM:(Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。只要带宽足够,任何模拟值都可以使用PWM进行编码。本文提出AVR单片机ATmega128的PWM的设计方法。

1.定时/计数器PWM设计要点

根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:

1)首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。

2)然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(或相位)调整PWM两大类。

3)快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

4)快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。

5)频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))

6)相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM的相位也相应的跟着变化(Phase
Correct)。

7)频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。此时应注意:不仅调整占空比时,PWM的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase
and Frequency Correct)。

8)在PWM方式中,计数器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)。或由用户设定的0x0000-0xFFFF,设定值在16位T/C的ICP或OCRA寄存器中。而比较匹配寄存器的值与计数器上限值之比即为占空比。

2.PWM应用设计参考

下面给出一个设计示例,在示例中使用PWM方式来产生一个1KHz左右的正弦波,幅度为0-Vcc/2。

首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为128个点,每点按7位量化(127对应最高幅值Vcc/2):

f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]

如果在一个正弦波周期中采用128个样点,那么对应1KHz的正弦波PWM的频率为128KHz。实际上,按照采样频率至少为信号频率的2倍的取样定理来计算,PWM的频率的理论值为2KHz即可。考虑尽量提高PWM的输出精度,实际设计使用PWM的频率为16KHz,即一个正弦波周期(1KHz)中输出16个正弦波样本值。这意味着在128点的正弦波样本表中,每隔8点取出一点作为PWM的输出。

程序中使用ATmega128的8位T/C0,工作模式为相位调整PWM模式输出,系统时钟为8MHz,分频系数为1,其可以产生最高PWM频率为:

8000000Hz / 510 =15686Hz。

每16次输出构成一个周期正弦波,正弦波的频率为980.4Hz。PWM由OC0(PB4)引脚输出。参考程序如下(ICCAVR)。

//ICC-AVR application builder : 2004-08

// Target : M128

// Crystal: 8.0000Mhz

#include

#include

#pragma data:code

// 128点正弦波样本表

const unsigned char auc_SinParam[128] = {

64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,

118,120,121,123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,

124,123,121,120,118,117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,

79,76,73,70,67,64,60,57,54,51,48,45,42,39,36,33,31,28,25,23,21,18,16,14,12,

10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,25,28,31,33,

36,39,42,45,48,51,54,57,60};

#pragma data:data

unsigned char x_SW = 8,X_LUT = 0;

#pragma interrupt_handler timer0_ovf_isr:17

void timer0_ovf_isr(void)

{

X_LUT += x_SW; // 新样点指针

if (X_LUT > 127) X_LUT -= 128; // 样点指针调整

OCR0 = auc_SinParam[X_LUT]; // 取样点指针到比较匹配寄存器

}

void main(void)

{

DDRB |= 0x10; // PB4(OC0)输出

TCCR0 = 0x71; // 相位调整PWM模式,分频系数=1,正向控制OC0

TIMSK = 0x01; // T/C0溢出中断允许

SEI(); // 使能全局中断

while(1)

{……};

}

每次计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM的脉冲宽度,这样在PB4引脚上输出了按正弦波调制的PWM方波。当PB4的输出通过一个低通滤波器后,便得到一个980.4Hz的正弦波了。如要得到更精确的1KHz的正弦波,可使用定时/计数器T/C1,选择工作模式10,设置ICR1=250为计数器的上限值。

结束语:

本文以ATmega128为例介绍了AVR单片机的PWM设计方法。随着电力电子技术,微电子技术和自动控制技术的发展PWM技术获得了空前的发展,被广泛应用在测量、通信到功率控制与变换的许多领域中。

来源: eechina.com

围观 465

一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:

1、使能TIM3时钟

详解STM32的PWM输出及频率和脉宽(占空比)的计算

RCC->APB1ENR |= 1 << 1;
2、配置对应引脚(PA6)的复用输出功能

详解STM32的PWM输出及频率和脉宽(占空比)的计算

GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 6;//PA6上拉

3、设定计数器自动重装值及是否分频

TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器,0为不分频

4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

详解STM32的PWM输出及频率和脉宽(占空比)的计算

注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

详解STM32的PWM输出及频率和脉宽(占空比)的计算

//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式
TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
TIM3->CCMR1 |= 1 << 3;//CH1预装载使能

5、输出使能设置

详解STM32的PWM输出及频率和脉宽(占空比)的计算

TIM3->CCER |= 1 << 0;//输入/捕获1输出使能

6、自动重装载预装载允许位(ARPE) 及定时器使能

详解STM32的PWM输出及频率和脉宽(占空比)的计算

TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
TIM3->CR1 |= 0X01;//使能定时器3

下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:
void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
{
//1、使能TIM3时钟
RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
//2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 6;//PA6上拉
//3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器 0为不分频
//4、设置PWM的模式
TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
TIM3->CCMR1 |= 1 << 3;//CH1预装载使能
//5、输出使能设置
TIM3->CCER |= 1 << 0;//输入/捕获1输出使能
//6、自动重装载预装载允许位(ARPE) 及 定时器 使能
TIM3->CR1 = 0X0080;//ARPE使能
TIM3->CR1 |= 0X01;//使能定时器3
}
void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
{
RCC->APB1ENR |= 1 << 1;//使能TIM3时钟

GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 7;//PA7上拉
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
TIM3->PSC = psc;//预分频器 不分频
TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
TIM3->CCMR1 |= 1 << 11;//CH2预装载使能
TIM3->CCER |= 1 << 4;//输入/捕获2输出使能
TIM3->CR1 = 0X0080;//ARPE使能
TIM3->CR1 |= 0X01;//使能定时器3
}
频率:
//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
占空比:
//duty circle = TIM3->CCR1 / arr(单位:%)
注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!

转自: akunainiannian的专栏

围观 557

脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

理论基础

• 冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同
• 冲量指窄脉冲的面积
• 效果基本相同,是指环节的输出响应波形基本相同
• 波形基本相同含义:低频段非常接近,仅在高频段略有差异

模拟电路

模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。

模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。

尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

数字控制

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。

简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

PWM的原理以及应用

图1显示了三种不同的PWM信号。图1a是一个占空比为10%的PWM输出,即在信号周期中,10%的时间通,其余90%的时间断。图1b和图1c显示的分别是占空比为50%和90%的PWM输出。这三种PWM输出编码的分别是强度为满度值的10%、50%和90%的三种不同模拟信号值。例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号。
PWM的原理以及应用

图2是一个可以使用PWM进行驱动的简单电路。图中使用9V电池来给一个白炽灯泡供电。如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。如果在1秒钟内将此过程重复10次,灯泡将会点亮并象连接到了一个4.5V电池(9V的50%)上一样。这种情况下,占空比为50%,调制频率为10Hz。

大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。要让灯泡取得4.5V电压的供电效果,通断循环周期与负载对开关状态变化的响应时间相比必须足够短。要想取得调光灯(但保持点亮)的效果,必须提高调制频率。在其他PWM应用场合也有同样的要求。通常调制频率为1kHz到200kHz之间。

硬件控制器

许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM操作之前,这种微处理器要求在软件中完成以下工作:

• 设置提供调制方波的片上定时器/计数器的周期
• 在PWM控制寄存器中设置接通时间
• 设置PWM输出的方向,这个输出是一个通用I/O管脚
• 启动定时器
• 使能PWM控制器

虽然具体的PWM控制器在编程细节上会有所不同,但它们的基本思想通常是相同的。

通信与控制

PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。

PWM广泛应用在多种系统中。作为一个具体的例子,我们来考察一种用PWM控制的制动器。简单地说,制动器是紧夹住某种东西的一种装置。许多制动器使用模拟输入信号来控制夹紧压力(或制动功率)的大小。加在制动器上的电压或电流越大,制动器产生的压力就越大。

可以将PWM控制器的输出连接到电源与制动器之间的一个开关。要产生更大的制动功率,只需通过软件加大PWM输出的占空比就可以了。如果要产生一个特定大小的制动压力,需要通过测量来确定占空比和压力之间的数学关系(所得的公式或查找表经过变换可用于控制温度、表面磨损等等)。

例如,假设要将制动器上的压力设定为100psi,软件将作一次反向查找,以确定产生这个大小的压力的占空比应该是多少。然后再将PWM占空比设置为这个新值,制动器就可以相应地进行响应了。如果系统中有一个传感器,则可以通过闭环控制来调节占空比,直到精确产生所需的压力。

总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。

来源: 电子工程专辑

围观 397

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM最基本的调节就是频率和占空比,通过调节频率和占空比对外部元件进行控制或者捕捉外部信号源。

在大功率电机、变频器、开关电源等方案中,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。

MM32L0系列MCU有多达9个定时器,高级定时器TIM1可以产生互补的PWM,高级定时器TIM1是1 个 16 位 4 通道高级控制定时器,有 4 通道 PWM 输出,以及死区生成和紧急停止功能,可以通过相关寄存器的设置使能或关闭PWM的输出。

高级控制定时器(TIM1)能够输出两路互补信号,并且能够管理输出的瞬时关断和接通。这段时间通常被称为死区,用户应该根据连接的输出器件和它们的特性(电平转换的延时、电源开关的延时等)来调整死区时间。

使用紧急停止功能,使能输出信号和无效电平都会被改变,关闭PWM输出,能够有效的预防突发事件造成外部电机等不可控的状态,刹车源既可以是刹车输入管脚又可以是一个时钟失败事件。时钟失败事件由复位时钟控制器中的时钟安全系统产生。在安全方面,你可以把刹车输入连到电源驱动的报警输出、热敏传感器或者其他安全器件上。

在编写电机的驱动程序时,需要利用TIM1的Channel1,2,3三个通道生成三路互补的PWM波形,TIM1需要配置的寄存器有:捕捉/比较模式寄存器 1(TIMx_CCMR1)、捕捉/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~3)和刹车和死区寄存器(TIMx_BDTR).
程序配置流程如下:

void TIM1_PWM_Init(u16 arr,u16 psc)
{ 
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
      
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB , ENABLE);
 
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; //TIM3_CH1  TIM3_CH1N
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
      
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //TIM3_CH1  TIM3_CH1N
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
      
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //TIM3_CH1  TIM3_CH1N
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
      
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2);
             
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_2);
             
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_2);
      
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
TIM_BDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStruct.TIM_DeadTime = 0x99;
//TDTS = 125nS(8MHz)
//DTG[7: 5] = 0xx => DT = DTG[7: 0] * Tdtg, Tdtg = TDTS;
//DTG[7: 5] = 10x => DT =(64+DTG[5: 0]) * Tdtg, Tdtg = 2 * TDTS;
//DTG[7: 5] = 110 => DT =(32+DTG[4: 0]) * Tdtg, Tdtg = 8 * TDTS;
//DTG[7: 5] = 111=> DT =(32 + DTG[4: 0]) *  Tdtg, Tdtg = 16 * TDTS;
 
TIM_BDTRInitStruct.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStruct.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig( TIM1, &TIM_BDTRInitStruct);     
      
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
             
TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
TIM_OC2Init(TIM1, &TIM_OCInitStructure); 
TIM_OC3Init(TIM1, &TIM_OCInitStructure); 
 
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  
 
TIM_ARRPreloadConfig(TIM1, ENABLE);
 
TIM_Cmd(TIM1, ENABLE);
      
}

第一步:开定时器TIM1的时钟和GPIOA\GPIOB的时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB , ENABLE);

第二步:配置GPIO的模式,根据UM_MM32L0系列产品手册的8.1.11外设的 GPIO 配置查表可以知配置CHx的输出比较通道x和互补输出通道x功能时,需将GPIO配置成推挽复用输出模式,配置定时器的刹车输入功能时GPIO需配置成浮空输入功能。

MM32 MCU互补PWM输出使能带死区、刹车功能

根据DS_MM32L0系列产品手册的表4和表5的端口功能复用列表可知,PA8\PA9\PA10的AF2是TIM1的CH1\CH2\CH3通道,PB13\PB14\PB15的AF2是TIM1的CH1N\CH2N\CH3N通道,所以在配置GPIO的复用功能选择时通过软件写入配置IO的复用功能为AF2。

在本试验中,通过配置PB12作为刹车信号源的输入脚。根据端口功能复用列表可知,PB12的AF2是TIM1的刹车输入功能。

MM32 MCU互补PWM输出使能带死区、刹车功能

MM32 MCU互补PWM输出使能带死区、刹车功能

第三步:配置定时器的基本功能,首先来了解定时器初始化参数结构体指针,结构体类型是TIM_TimeBaseInitTypeDef,该结构体主要包含5个成员变量:

typedef struct
{
        uint32_t TIM_Prescaler;
        uint32_t TIM_CounterMode;
uint32_t TIM_Period;
        uint32_t TIM_ClockDivision;
        uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;

第一个参数TIM_Prescaler是用来设置分频系数的,MM32L0系列产品的高级定时器TIM1是挂在APB2上。在MM32所有例程中,在每次一启动时,在程序中就已经帮助客户配置好了APB的时钟,在system_MM32L0系列.c中如果您配置相对应的系统时钟,在时钟配置函数中,您可以看到已经对APB1\APB2\AHB的时钟做了配置,默认APB2的时钟是48MHz,所以定时器的时钟需用户根据自己的实际需求进行分频或者不分频操作。

MM32 MCU互补PWM输出使能带死区、刹车功能

第二个参数是TIM_CounterMode用来配置PWM模式,MM32L0系列产品的PWM模式有三种:向上计数模式、向下计数模式和中央对齐模式。
1、向上计数模式:例:当 TIMx_CNT < TIMx_CCRx 时,PWM 参考信号 OCxREF 为高,
否则低。如果 TIMx_CCRx 中的比较值大于自动重装载值(TIMx_ARR),则 OCxREF 保持为‘1’。
2、向下计数模式:当 TIMx_CNT > TIMx_CCRx 时参考信号 OCxREF 为低,否则为高。如果 TIMx_CCRx中的比较值大于 TIMx_ARR 中的自动重装载值,则 OCxREF 保持为‘1’。
3、中央对齐模式:中央对齐模式又分为三种模式,根据不同的 CMS 位的设置,比较标志可以在计数器向上计数时被置‘1’、在计数器向下计数时被置‘1’、或在计数器向上和向下计数时被置‘1’。

中央对齐模式选择
MM32 MCU互补PWM输出使能带死区、刹车功能

第三个参数是TIM_Period用来设置自动重载计数周期值,自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在 TIMx_CR1 寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件 UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1 寄存器中的 UDIS位等于 0 时,产生更新事件。

第四个参数是TIM_ClockDivision用来设置时钟分频因子,该变量与后面死区持续时间配置有关,该变量是设置控制寄存器1(TIMx_CR1)的时钟分频因子CKD[1:0],这 2 位定义在定时器时钟(CK_INT) 频率、死区时间和由死区发生器与数字滤波器(ETR,TIx) 所用的采样时钟之间的分频比例。

第五个参数是TIM_RepetitionCounter用来设置重复计数值,该功能在上一篇文章有详细讲解。

第四步:配置定时器的刹车和死区,首先来了解定时器刹车和死区参数结构体指针,结构体类型是TIM_BDTRInitTypeDef,共7个成员变量:

    typedef struct
    {
        uint16_t TIM_OSSRState;
        uint16_t TIM_OSSIState;
        uint16_t TIM_LOCKLevel;
        uint16_t TIM_DeadTime;
        uint16_t TIM_Break;
        uint16_t TIM_BreakPolarity;
        uint16_t TIM_AutomaticOutput;
} TIM_BDTRInitTypeDef;

第一个参数是TIM_OSSRState用来配置运行模式下“关闭状态”选择。
第二个参数是TIM_OSSIState用来配置空闲模式下“关闭状态”选择。
第三个参数是TIM_LOCKLevel用来定时器的寄存器锁定保护,锁定级别分为3个级别,只能写入一次LOCK位,一旦写入TIMx_BDTR寄存器,则内容冻结至复位。
第四个参数是TIM_DeadTime设置死区时间,用户可根据UM_MM32L0xx手册的刹车和死区寄存器(TIM1x_BDTR)寄存器计算死区时间。
第五个参数是TIM_Break设置是否使能刹车功能。
第六个参数是TIM_BreakPolarity用来设置刹车输入电平。
第七个参数是TIM_AutomaticOutput设置BDTR寄存器的主输出使能(MOE)位。

第五步:配置定时器的PWM输出功能,

 typedef struct
    {
        uint16_t TIM_OCMode;
        uint16_t TIM_OutputState; 
        uint16_t TIM_OutputNState;          
        uint16_t TIM_Pulse;
        uint16_t TIM_OCPolarity;
        uint16_t TIM_OCNPolarity;
        uint16_t TIM_OCIdleState;
        uint16_t TIM_OCNIdleState;
    } TIM_OCInitTypeDef;

第一个参数是TIM_OCMode用来设置模式是输入捕获功能或者输出比较功能。
PWM 模式 1 - 在向上计数时,一旦 TIMx_CNT < TIMx_CCR1 时通道 1 为有效电平,否则为 无效电平;在向下计数时,一旦 TIMx_CNT > TIMx_CCR1 时通道 1 为无效电平(OC1REF= 0) ,否 则为有效电平(OC1REF = 1)
PWM 模式 2 - 在向上计数时,一旦 TIMx_CNT < TIMx_CCR1 时通道 1 为无效电平,否则为有效电平;在向下计数时,一旦 TIMx_CNT > TIMx_CCR1 时通道 1 为有效电平,否则为无效电平。
第二个和第三个参数TIM_OutputState和TIM_OutputNState是配置互补通道输出使能。
第四个参数是TIM_Pulse用来设置待装入捕获比较寄存器的脉冲值,它的取值必须在 0x0000 和 0xFFFF之间。
第五和第六个参数TIM_OCPolarity和TIM_OCNPolarity是设置互补通道的极性是高还是低。
第七和第八个参数是TIM_OCIdleState和TIM_OCNIdleState用来设置刹车后的互补通道的电平状态。

第六步:初始化TIM1的OC1\OC2\OC3通道,使能定时TIM1。

逻辑分析仪抓取PWM波形
MM32 MCU互补PWM输出使能带死区、刹车功能
(逻辑分析仪精度不高,建议使用示波器抓波性)

小结:

1、PWM的频率和占空比计算:
//Fpwm = 48M / ((arr+1)*(psc+1))(单位:Hz)
//duty circle = TIM1->CCR1 / arr(单位:%)
本次配置参数:arr=999,psc=47,Pulse=500
Fpwm = 48M / ((arr+1)*(psc+1))=48M/ ((999+1)*(47+1))=1KHz
duty circle = (TIM1->CCR1 / arr )*100= (500/999)*100 = 50%

2、PWM互补通道电平设置:
通过上面截图可以看到互补通道的输出电平极性是相反的,如果用户需要配置互补通道输出相同的电平极性,需要配置的TIMx_CCER寄存器,通过库函数设置TIM_OCPolarity和TIM_OCNPolarity即可改变互补通道的电平输出极性。

MM32 MCU互补PWM输出使能带死区、刹车功能

3、刹车电平配置:
在配置刹车输入有效电平时,需先配置刹车和死区寄存器(TIMx_BDTR)的BKP位,配置为0时表示刹车输入低电平有效,配置为1时表示刹车输入高电平有效,在库函数中通过设置TIM_BreakPolarity变量即可实现有效电平设置,用户需根据外面信号来源配置对应的极性。

MM32 MCU互补PWM输出使能带死区、刹车功能

如上图所示,中间表示有刹车信号输入,关断PWM输出。在刹车信号关闭时,PWM又恢复输出,用户可以根据实际需求在刹车信号后是否恢复PWM输出,需要配置寄存器刹车和死区寄存器(TIMx_BDTR)的AOE位,在设置AOE位为0的情况下,触发刹车时,MOE关断,不再开启。

4、死区时间设置:
用户如果需要配置插入互补输出之间的死区持续时,需要配置刹车和死区寄存器(TIMx_BDTR)的死区发生器设置DTG[7:0],如下图所示,DT表示死区持续时间,Tdts为系统时钟周期,Tdtg表示乘以倍数后死区设置时间步进值。

MM32 MCU互补PWM输出使能带死区、刹车功能

Tdts = 1/48M = 20.83ns,TIM1_BDTR = 0xFF,高三位是0,所以选择第一个公式:
DT=(32+0x1F)*16* Tdts=(32+32)*16*20.83 = 21.3us。

MM32 MCU互补PWM输出使能带死区、刹车功能
(逻辑分析仪精度不高,建议使用示波器抓波性)

转自: 灵动微电子

围观 1726

我们大多数人都知道PWM DAC(数模转换器)。它们很容易实现,也很便宜,非常适合一些低性能的应用。

实现它们的方法是滤除PWM信号中的高频分量,只留下正比于占空比的低频或直流分量。但是低通滤波器并不能完全滤除PWM频率,因此低频/直流信号中通常都会有一定程度的纹波。

减少PWM DAC纹波的方法一般有两种。一种是降低低通滤波器的截止频率,另一种是提高PWM信号的频率。然而不可避免的是,更低的截止频率会延长上升时间;如果是在给定时钟频率点通过减小计数器尺寸实现的,那么更快的PWM频率会降低分辨率。

下面要讨论的设计实例非常有趣,着重介绍了另外一种降低PWM DAC纹波的方法。

事实上,我们可以使用相位差为180°的两个PWM信号来降低上述纹波。从直觉上,当两个相同频率的正弦波的相位相差180°时,它们会相互抵消,因此我们使用相位差为180°的两个PWM信号也能将彼此的谐波分量抵消干净,是这样吗?确实是这样,但并不是PWM信号的所有谐波分量都能抵消,有些分量可以抵消,有些却抵消不了。这与傅里叶级数有关,比较复杂,这里就不罗列一大堆数学公式来进行解释了。

两个PWM信号之间180°的相位差是如何实现的呢?我使用了TI的MSP320FR5969 LaunchPad,这种方法很常用。为了实现相位移动,需要两个定时器。其中一个定时器必须包含两个比较-捕获-PWM(CCP)模块,另一个只需要一个CCP模块。

在包含两个CCP模块的定时器中,可以用一个CCP模块来设置该定时器的PWM频率和占空比,另一个CCP模块产生中断,用于启动另一个定时器,两者的延时等于PWM周期的一半。另一个定时器中的CCP模块用于设置相同的PWM频率和占空比。你还必须对这个延时进行“微调”,因为软件会在PWM信号之间增加额外的时间。举例来说,在我的代码的102行,我将比较寄存器的值从(timer_period+1)/2改为了(timer_period+1)/2-27。

我做了一些小调查,想看看其它微控制器是否具有相同的硬件和能力来实现我所用的方法:许多Atmel微控制器都有1个以上的定时器,每种控制器通常都有两个CCP(比如ATmega 328),因此实现这种方法应该是可能的。另外一个常见的例子是STM32F051R8(这是一些流行的ST电路板使用的微控制器),它有11个定时器,其中许多定时器都有1个以上的CCP。TI基于ARM的微控制器通常有独立的PWM和定时器模块(如TM4C123GH6PM),因此应该更容易实现相移。使用其中一个定时器,两个PWM模块就可以以一半PWM周期的延时开启。

如何使微处理器的PWM频率和分辨率翻倍
图1:单路和双路PWM电路。

在相移DAC的Vout端,两个PWM信号被累加在一起,结果有些谐波分量彼此抵消,最终实现了降低纹波的效果。

我们看看使用三种不同电阻值时的情况。每个PWM信号都是占空比为25%、频率为100kHz。

如何使微处理器的PWM频率和分辨率翻倍
图2:上面的波形是传统PWM,下面的波形是双路相移PWM。从左到右每格的电压递减100mV、50mV、4mV。

从图中的结果可以看出:首先,峰-峰纹波降低了;其次,传统PWM DAC的纹波基频等于 PWM信号的频率(100kHz)。相移PWM DAC的纹波基频等于PWM信号的二次谐波(200kHz),这意味着我们用相移DAC成功地删除了PWM信号的一次谐波。

这种方法的一个优点是不用增加上升时间也能降低纹波(或者相同的纹波只需一半的上升时间)。

另外一个潜在优点是,将两个PWM设置为相隔一个计数值可以获得中间值,进而实现DAC有效分辨率的翻倍。虽然这会导致少许的不对称并增加纹波,但是影响很小可以忽略不计。

来源: 中国电子技术网

围观 408

脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,从测量、通信到功率控制与变换的许多领域中广泛应用,以其控制简单,灵活和动态响应好的优点而成为电力电子技术最常见的控制方式。

一、PWM原理

脉宽调制(PWM)控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率,如REF _Ref465597749 \h \* MERGEFORMAT图1所示为脉宽调制原理图。

PWM信号在LED驱动电源中的应用
图1 脉宽调制原理图

例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的,如图2所示为正弦波PWM调制波形。

PWM信号在LED驱动电源中的应用
图2 正弦波PWM调制

二、PWM在LED驱动电源中的作用

PWM信号驱动是LED驱动电源中的一种。许多LED应用都需要具备调光功能,比如LED背光或建筑照明调光。通过调整LED的亮度和对比度可以实现调光功能。简单地降低器件的电流也许能够对LED发光进行调整,但是让LED在低于额定电流的情况下工作会造成许多不良后果,比如色差问题。取代简单电流调整的方法是在LED驱动器中集成脉宽调制(PWM)控制器。

PWM的信号并不直接用于控制LED,而是控制一个开关,例如一个MOSFET,以向LED提供所需的电流。PWM控制器通常在一个固定频率上工作并且对脉宽进行调整,以匹配所需的占空比,应用者的系统只需要提供宽、窄不同的数字式脉冲,即可简单地实现改变输出电流,从而调节LED的亮度。当前大多数LED芯片都使用PWM来控制LED发光,为了确保人们不会感到明显的闪烁,PWM脉冲的频率必须大于100HZ。PWM控制的主要优点是通过PWM的调光电流更加精确,最大程度地降低LED发光时的色差,如图3所示为脉宽调制(PWM)LED驱动器控制电路。

PWM信号在LED驱动电源中的应用
图3 脉宽调制(PWM)LED驱动器控制电路

三、如何准确分析LED驱动电源中的PWM信号

PWM信号在LED驱动电源中的作用已经不言而喻了,那么如何才能做出高质量的PWM驱动电源呢?广州致远电子ZDS4054PLUS示波器基于512M的存储深度,可以长时间观测PWM驱动器控制LED灯光变化时的脉宽长度变化,便于工程师对灯光亮度进行准确的调节。100万次每秒的波形刷新率和丰富的触发方式快速捕获PWM信号,并且在ZOOM放大模式下,可对波形细节进行重点分析。如REF _Ref465598033 \h \* MERGEFORMAT图4所示为PWM信号调制波形。

PWM信号在LED驱动电源中的应用
图4 PWM调制信号

同时在LED驱动电源中最重要的就是对脉宽信号进行准确的测量,ZDS4054PLUS示波器基于51种参数测量可对脉冲宽度、幅值、信号的上升时间等参数准确测量,大大加快研发进程,而且可以通过分段存储方式对每次触发到的PWM波形进行存储,便于分析。如图5为使用ZDS4054Plus示波器测得的PWM信号放大波形。

PWM信号在LED驱动电源中的应用
图5 PWM信号ZOOM放大波形

来源:中国电子技术网

围观 469

前言

电机控制单电阻采样机制是在一个PWM波形内采集两相电流ADC数据,但某些扇区边界条件下只能获得一路电流ADC数据, 需要对PWM波形进行变形用于构造电流采样区域。

背景介绍

根据电机控制拓扑结构,单电阻采样在一个PWM控制周期内可以取得两相电流数据:
电机控制单电阻采样PWM变形信号的产生
电机控制单电阻采样PWM变形信号的产生

在扇区边沿无法获得两相电流信号。
电机控制单电阻采样PWM变形信号的产生
波形产生

ST专利的方法是在波形的中间部分产生变形波形,在变形后的波形上就可以得到两相电流ADC数据;
当然还有目前比较流行的波形移位方法也可以做到相同效果。波形如下:
电机控制单电阻采样PWM变形信号的产生
STM32系列单片机Timer有足够的功能,可以产生上面两种波形,机制如下:

PWM波中间变形
电机控制单电阻采样PWM变形信号的产生

1. 设定CCR4的DMA通道,并且设定此时Timer1的preload为禁止状态;
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Disable);
2. 在CCR4比较值部分产生DMA事件;

DMA_InitStructure.DMA_PeripheralBaseAddr= (uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr= (uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize= 2u;
….
TIM_DMACmd(TIM1,TIM_DMA_CC4,ENABLE);

3. 在1点上将CCR1数据直接修改为周期数据+1;
4. 在2点上将CCR1数据修改为CCR1’的数据;
5. 时间计算上按照上面的图示设定,中间凹陷时间为两边补充波形时间之和。
波形移位变形
电机控制单电阻采样PWM变形信号的产生

1. 设定Timer1的update事件的DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 2u;
……
TIM_DMACmd(TIM1,TIM_DMA_Update,ENABLE);

2. 在1点上更新CCR1数据为CCR1数据;
3. 在2点上更新CCR1数据为CCR1’数据;
4. 保证前后的移位时间相同。

来源: STM32单片机

围观 492

学过单片机的同学,对PWM应该不陌生,一般学习单片机的第二个例程就是用PWM技术调节占空比来控制LED亮度。然而PWM控制技术在逆变电路中应用最广,正是有赖于其在逆变电路中的应用,才确定了它在电力电子技术中的重要地位。因此,本文将详细阐述pwm的原理:PWM(PulseWidthModulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。

PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆变电路中的应用,才确定了它在电力电子技术中的重要地位。

1、PWM控制的基本原理

理论基础:

冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。

图1形状不同而冲量相同的各种窄脉冲

面积等效原理:

分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。

图2冲量相同的各种窄脉冲的响应波形

用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N等分,看成N个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。

SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。

图3用PWM波代替正弦半波

要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。
PWM电流波:电流型逆变电路进行PWM控制,得到的就是PWM电流波。

PWM波形可等效的各种波形:

直流斩波电路:等效直流波形

SPWM波:等效正弦波形,还可以等效成其他所需波形,如等效所需非正弦交流波形等,其基本原理和SPWM控制相同,也基于等效面积原理。

2、PWM相关概念

占空比:就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比

如,一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。

分辨率也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。

频率就是这样的,如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80.......,那么它的分辨率最小就是1:80了,但是,它也快了,也就是说PWM的输出频率高了。

双斜率/单斜率

假设一个PWM从0计数到80,之后又从0计数到80.......这个就是单斜率。

假设一个PWM从0计数到80,之后是从80计数到0.......这个就是双斜率。

可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80)=1:160,就是提高了一倍。

假设PWM是单斜率,设定最高计数是80,我们再设定一个比较值是10,那么T/C从0计数到10时(这时计数器还是一直往上计数,直到计数到设定值80),单片机就会根据你的设定,控制某个IO口在这个时候是输出1还是输出0还是端口取反,这样,就是PWM的最基本的原理了。

围观 760

页面

订阅 RSS - PWM