13.1 項目分析
脈寬調制(PWM)基本原理 :控制方式就是對逆變電路開關器件的通斷進行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。 也就是在輸出波形的半個周期中產生多個脈沖,使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。 按一定的規則對各脈沖的寬度進行調制,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
例如,把正弦半波波形分成N等份,就可把正弦半波看成由N個彼此相連的脈沖所組成的波形。 這些脈沖寬度相等,都等于∏/n,但幅值不等,且脈沖頂部不是水平直線,而是曲線,各脈沖的幅值按正弦規律變化。 如果把上述脈沖序列用同樣數量的等幅而不等寬的矩形脈沖序列代替,使矩形脈沖的中點和相應正弦等分的中點重合,且使矩形脈沖和相應正弦部分面積(即沖量)相等,就得到一組脈沖序列,這就是PWM波形。 可以看出,各脈沖寬度是按正弦規律變化的。 根據沖量相等效果相同的原理,PWM波形和正弦半波是等效的。 對于正弦的負半周,也可以用同樣的方法得到PWM波形。
在PWM波形中,各脈沖的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例系數改變各脈沖的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈沖電壓就是直流側電壓的幅值。 根據上述原理,在給出了正弦波頻率,幅值和半個周期內的脈沖數后,PWM波形各脈沖的寬度和間隔就可以準確計算出來。 按照計算結果控制電路中各開關器件的通斷,就可以得到所需要的PWM波形。
采樣控制理論中有一個重要結論:沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同. PWM控制技術就是以該結論為理論基礎,對半導體開關器件的導通和關斷進行控制,使輸出端得到一系列幅值相等而寬度不相等的脈沖,用這些脈沖來代替正弦波或其他所需要的波形. 按一定的規則對各脈沖的寬度進行調制,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
PWM技術在生活中的應用非常廣,最常用的就是開關電源,通過改變脈寬來改變輸出的電壓,擴展的還有LED調光,直流電機調速,以及顯示器中的顏色合成等。
13.2 原理圖
**13.3 **源代碼
正規的PWM調速的過程應該是用戶輸入指定的轉速,由電機上面的轉速傳感器采集當前轉速輸入單片機進行比較,根據轉速的差值計算出PWM的占空比,這個占空比是需要提前進行數學建模,將電機的轉速與PWM占空比的數學關系推導出來,采用查表法或者數據查詢的方式將占空比增大,這里就不進行數學建模,直接采用默認的數據,占空比1%~100% 對應的轉速平均分布。 PWM的頻率和占空比由定時器0確定,設置頻率1000Hz,采用按鍵設置占空比,源代碼如下圖所示。
/*********************************************************************************************************
頭 文 件 引 用
*********************************************************************************************************/
#include <reg51.h> //導入51單片機頭文件
#include <intrins.h>
/*********************************************************************************************************
數 據 類 型 定 義
*********************************************************************************************************/
#define u8 unsigned char //定義無符號字符型數據(0~255)
#define u16 unsigned int //定義無符號整型數據(0~65535)
/*********************************************************************************************************
變 量 定 義
*********************************************************************************************************/
u8 Duty; //占空比
u8 TIM0_Count ;
u8 LED_Data[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F } ;
/*********************************************************************************************************
端 口 定 義
*********************************************************************************************************/
sbit OUT = P2^7 ; //電機接口
/********************************************************
Name :delay_ms
Function :毫秒級別延時函數
Paramater :
ms:延時的ms數
Return :None
********************************************************/
void delay_ms( u16 ms )
{
u8 i ;
while( --ms )
for( i=0; i<110; i++ ) ;
}
/********************************************************
Name :EXIT0_IRQHandler
Function :外部中斷0中斷服務函數
Paramater :None
Return :None
********************************************************/
void EXIT0_IRQHandler() interrupt 0
{
do
{
Duty ++ ;
if( Duty==100 )
{
TR0 = 0 ;
Duty = 0 ;
}
else
TR0 = 1 ;
P2 = 0xFE ;
P0 = LED_Data[ Duty/10 ] ;
delay_ms( 2 ) ;
P2 = 0xFD ;
P0 = LED_Data[ Duty%10 ] ;
delay_ms( 2 ) ;
delay_ms( 500 ) ;
}while( ( P3&0x04 )!=0x04 ) ;
}
/********************************************************
Name :TIM0_IRQHandler
Function :定時器0中斷服務函數
Paramater :None
Return :None
********************************************************/
void TIM0_IRQHandler() interrupt 1
{
TH0 = ( 65535-10 )/256 ; //計數器設置頻率1000Hz
TL0 = ( 65535-10 )/256 ;
TIM0_Count ++ ;
if( TIM0_Count<=Duty )
OUT = 0 ;
else if( ( TIM0_Count<100 )&&( TIM0_Count>Duty ) )
OUT = 1 ;
else
{
OUT = 0 ;
TIM0_Count = 0 ;
}
}
/********************************************************
Name :KEY_Scan
Function :鍵盤掃描
Paramater :None
Return :None
********************************************************/
void PWM_Init()
{
Duty = 0 ;
TIM0_Count = 0 ;
IE = 0x83 ; //開啟EA+EX0+ET0
TMOD = 0x01 ; //定時器設置16位模式
TH0 = ( 65535-10 )/256 ; //計數器設置頻率1000Hz
TL0 = ( 65535-10 )/256 ;
IT0 = 1 ; //下降沿觸發
}
/*********************************************************************************************************
主 函 數
*********************************************************************************************************/
void main()
{
PWM_Init() ;
while( 1 )
{
P2 = 0xFE ;
P0 = LED_Data[ Duty/10 ] ;
delay_ms( 2 ) ;
P2 = 0xFD ;
P0 = LED_Data[ Duty%10 ] ;
delay_ms( 2 ) ;
}
}
13.4 仿真截圖
-
單片機
+關注
關注
6042文章
44617瀏覽量
637480 -
PWM
+關注
關注
114文章
5197瀏覽量
214538 -
51單片機
+關注
關注
274文章
5705瀏覽量
124059 -
脈寬調制
+關注
關注
3文章
219瀏覽量
38374 -
逆變電路
+關注
關注
19文章
297瀏覽量
39507
發布評論請先 登錄
相關推薦
評論