直流電機驅動(PWM)
直流電機介紹
直流電機是一種將電能轉換為(wei) 機械能的裝置。一般的直流電機有兩(liang) 個(ge) 電極,當電極正接時,電機正轉,當電極反接時,電機反轉,直流電機主要由永磁體(ti) (定子)、線圈(轉子)和換向器組成,除直流電機外,常見的電機還有步進電機、舵機、無刷電機、空心杯電機等
PWM介紹
PWM(Pulse Width Modulation)即脈衝(chong) 寬度調製,在具有慣性的係統中,可以通過對一係列脈衝(chong) 的寬度進行調製,來等效地獲得所需要的模擬參量,常應用於(yu) 電機控速、開關(guan) 電源等領域。因為(wei) 利用的是數字信號的寬度變量,而不是模擬信號的寬度變量,因此對於(yu) 單片機之類的物品而言,更容易產(chan) 生對應寬度變量來控製。
PWM重要參數:
頻率 = 1 / TS
占空比 = TON / TS
精度 = 占空比變化步距
頻率越高,電平變化越快,越能等效出連續的模擬信號曲線。(如果頻率較低,應用於(yu) 電機控製時,會(hui) 導致電機運行斷斷續續——因為(wei) 電平是0跟1之間變化)
占空比指的是在一個(ge) 頻率段(一個(ge) 高電平加一個(ge) 低電平)中,高(低)電平所用的時間占據總頻率段時間的百分比;
也可用TON:TOFF來進行表示(但是不常用,因為(wei) 這種表示的是比值,沒有百分比直觀)
精度指的是相鄰占空比的變化步距。舉(ju) 個(ge) 例子來講,第一個(ge) 占空比為(wei) 1%,第二個(ge) 為(wei) 2%,第三個(ge) 為(wei) 3%,那麽(me) 其精度就為(wei) 1%;而即第一個(ge) 占空比為(wei) 0.1%,第二個(ge) 為(wei) 0.2%,第三個(ge) 為(wei) 0.3%,那麽(me) 其精度為(wei) 0.1%;但是,前者的精度沒有後者高,精度越高,占空比調節越細致。
在電機所在電路直接接一個(ge) 電位器進行調速是不可行的,因為(wei) 電機運行時,電位器隻能接入幾歐的電阻,而電位器為(wei) 純電阻電路部件,因此全部電能轉化為(wei) 熱能,最終會(hui) 導致電位器燒壞,但是電機不會(hui) 燒壞,因為(wei) 它是非純電阻。為(wei) 了讓電機的速度得以調控或更好地保護電路,我們(men) 可以利用PWM控製電機的導通,利用1ms通電,1ms斷開的思路,來進行操作電機。
代碼
呼吸燈代碼
#include <REGX52.H>sbit LED=P2^0;
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<100;Time++)
{
for(i=0;i<20;i++)
{
LED=0;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
for(Time=100;Time>0;Time--)
{
for(i=0;i<20;i++)
{
LED=0;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
}
}
直流電機調速代碼
#include <REGX52.H>
#include "Key.h"
#include "Delay.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
Compare=5;
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;} //電機速度的調節
if(Speed==1){Compare=50;}
if(Speed==2){Compare=75;}
if(Speed==3){Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C; //設置定時初值
TH0 = 0xFF; //設置定時初值
Counter++;
Counter%=100;
if(Counter<Compare)
{
Motor=1;
}
else
{
Motor=0;
}
}