在三相PWM 整流器的功率管驱动信号中加入死区时间可防止电压直通,但这会对变换器的电压电流波形产生影响,称之为死区效应。为此,详细描述了死区时间内变换器的工作过程,提出了三相PWM 整流器的死区电压效应和电流效应,并分别进行了定量分析。然后结合空间矢量调制策略,引入了死区效应空间矢量的概念,统一并从本质上解释了死区的两种效应。为了克服死区效应的不良影响,提出了两种补偿措施,并详细介绍了利用DSP 的数字实现方法,这两种措施均不需要改变硬件电路,也不会增加控制器的复杂度和负担。最后,通过实验验证了理论分析的正确性和补偿措施的有效性,还指明了进一步研究的方向。
上传时间: 2013-10-21
上传用户:Aeray
摘要:本文以两相双极式步进电机为例,介绍了一种利用单片机自带的PWM模块实现步进电机细分驱动的方法。该方法充分利用单片机的PWM硬件资源,通过配置硬件PWM模块,产生占空比不同的方波,在电机线圈内产生近似正弦波的阶梯型电流。与常用的恒频脉宽调制方式相比,该方法不需要EI/A转换器和锯齿波发生器,不仅有利于简化电路和节约成本,而且能提高细分精度和电机运行平稳性,适用于需要精密控制的仪器仪表。关键词:PWM;细分驱动;步进电机;单片机
上传时间: 2014-01-21
上传用户:dalidala
摘要:本文介绍应用8098单片机丰富的接口功能,采用数字调制的方法来实现直流伺服电机的PWM调速控制。关键词:单片机 PWM调制波 数字调制
上传时间: 2014-12-27
上传用户:wsq921779565
提出一种高性能全数字式正弦波逆变电源的设计方案。该方案分为前后两级,前级采用推挽升压电路将输入的直流电升压到350 V左右的母线电压,后级采用全桥逆变电路,逆变桥输出经滤波器滤波后,用隔离变压器进行电压采样,电流互感器进行电流采样,以形成反馈环节,增加电源输出的稳定性。升压级PWM驱动及逆变级SPWM驱动均由STM32单片机产生,减小了硬件开支。基于上述方案试制的400 W样机,具有输出短路保护、过流保护及输入过压保护、欠压保护功能,50 Hz输出时频率偏差小于0.05 Hz,满载(400 W)效率高于87%,电压精度为220 V±1%,THD小于1.5%。
上传时间: 2013-11-17
上传用户:guojin_0704
注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言. 2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\ 所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。
上传时间: 2013-10-08
上传用户:dingdingcandy
注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言. 2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\ 所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。
上传时间: 2013-10-23
上传用户:mqien
AC-DC-AC双pwm逆变器的Matlab/Simulink仿真源程序。包括两个电路:一个是50Hz三相 AC(PWM整流)->DC->50Hz三相AC(PWM逆变),驱动三相对称电阻负载;一个是60Hz 三相AC(全波整流)->DC->50Hz三相AC(PWM逆变),驱动一个永磁同步电动机。(本源码基于王军(xiaohongchen@163.com)上载的double_pwm_inverter.mdl改进而来,适用于matlab7.3.0(R2006)版本)
标签: PWM AC-DC-AC Simulink Matlab
上传时间: 2016-01-24
上传用户:dongbaobao
关于PWM单片机编程的源程序,实现PWM的 方波输出,对电机进行控制。
上传时间: 2014-01-14
上传用户:cxl274287265
PWM控制就是产生一定周期,占空比不同的方波信号,当占空比较大时,电机转速较高,否则电机转速较低。当采用FPGA产生pwm波形时,只需FPGA内部资源就可以实现,数字比较器的一端接设定值输出,另一端接线性递增计数器输出。当线性计数器的计数值小于设定值时输出低电平,当计数器大于设定值时输出高电平,这样就可通过改变设定值,产生占空比不同的方波信号,从而达到控制直流电机转速的目的。 直流电机控制电路主要由2部分组成,如图1所示: FPGA中PWM脉宽调制信号产生电路; FPGA中正/反转方向控制电路
上传时间: 2017-05-19
上传用户:colinal
LED 一般是恒流操作的,如何改变 LED 的亮度呢?答案就是 PWM 控制。在一定的 频率的方波中,调整高电平和低电平的占空比,即可实现。比如我们用低电平点亮一个 LED 灯,我们假设把一个频率周期分为 10 个时间等份,如果方波中的高低电平占空比是 9:1, 这是就是一个比较暗的亮度,如果方波中高低电平占空比是 10:0,这时,全部是高电平, 灯是灭的。如果占空比是 5:5,就是一个中间亮度,如果高低比是 1:9,是一个比较亮的 亮度,如果高低是 0:10,这时全部是低电平,就是最亮的。 实际上应用中,电视屏幕墙中的几十百万 LED 象素都是这样控制的,而且每一个象素 都有红绿蓝 3 个 LED,每个 LED 可以变化的亮度是几百到几万或者更多的级别,以实现真 彩色的显示。还有在您的手机中,背光灯的亮度如果是可以变化的,也应该是这种工作方式。 目前的城市彩灯也有很多都使用了 LED,需要控制亮度是也是 PWM 控制。 下面来分析我们的例程,在这个例程中,我们将定时器 2 溢出定为 1/1200 秒。每 10 次脉冲输出一个 120HZ 频率。这每 10 次脉冲再用来控制高低电平的 10 个比值。这样,在 每个 1/120 秒的方波周期中,我们都可以改变方波的输出占空比,从而控制 LED 灯的 10 个 级别的亮度。 为什么输出方波的频率要 120HZ 这么高?因为如果频率太低,人眼就会看到闪烁感 觉。一般起码要在 60HZ 以上才感觉好点,120HZ 就基本上看不到闪烁,只能看到亮度的变 化了。 下面请看程序,程序中有比较多的注释: ――――――――――――――――――――――― #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一个 52 标准内核的头文件 sbit P10 = P1^0; //要控制的 LED 灯 sbit K1= P3^2; //按键 K1 uchar scale;//用于保存占空比的输出 0 的时间份额,总共 10 份 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 //模拟 PWM 输出控制灯的 10 个亮度级别 void main(void) // 主程序 { uint n; RCAP2H =0xF3; //赋 T2 的预置值,溢出 1 次是 1/1200 秒钟 RCAP2L =0x98; TR2=1; //启动定时器 ET2=1; //打开定时器 2 中断 EA=1; //打开总中断 while(1) //程序循环 { ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作 for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度 scale++; if(scale==10)scale=0; } } //1/1200 秒定时器 2 中断 timer2() interrupt 5 { static uchar tt; //tt 用来保存当前时间在一秒中的比例位置 TF2=0; tt++; if(tt==10) //每 1/120 秒整开始输出低电平 { tt=0; if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影 P10=0; } if(scale==tt) //按照当前占空比切换输出高电平 P10=1; } ―――――――――――――――――― 在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。 编译,运行,看结果。 可以看到,LED 的亮度以每种亮度 1 秒左右不断变化,共有 10 个级别。
上传时间: 2017-11-06
上传用户:szcyclone