直流電機(jī)驅(qū)動(PWM)
直流電機(jī)介紹
直流電機(jī)是一種將電能轉(zhuǎn)換為機(jī)械能的裝置。一般的直流電機(jī)有兩個(gè)電極,當(dāng)電極正接時(shí),電機(jī)正轉(zhuǎn),當(dāng)電極反接時(shí),電機(jī)反轉(zhuǎn),直流電機(jī)主要由永磁體(定子)、線圈(轉(zhuǎn)子)和換向器組成,除直流電機(jī)外,常見的電機(jī)還有步進(jìn)電機(jī)、舵機(jī)、無刷電機(jī)、空心杯電機(jī)等
PWM介紹
PWM(Pulse Width Modulation)即脈沖寬度調(diào)制,在具有慣性的系統(tǒng)中,可以通過對一系列脈沖的寬度進(jìn)行調(diào)制,來等效地獲得所需要的模擬參量,常應(yīng)用于電機(jī)控速、開關(guān)電源等領(lǐng)域。因?yàn)槔玫氖菙?shù)字信號的寬度變量,而不是模擬信號的寬度變量,因此對于單片機(jī)之類的物品而言,更容易產(chǎn)生對應(yīng)寬度變量來控制。
PWM重要參數(shù):
頻率 = 1 / TS
占空比 = TON / TS
精度 = 占空比變化步距
頻率越高,電平變化越快,越能等效出連續(xù)的模擬信號曲線。(如果頻率較低,應(yīng)用于電機(jī)控制時(shí),會導(dǎo)致電機(jī)運(yùn)行斷斷續(xù)續(xù)——因?yàn)殡娖绞?跟1之間變化)
占空比指的是在一個(gè)頻率段(一個(gè)高電平加一個(gè)低電平)中,高(低)電平所用的時(shí)間占據(jù)總頻率段時(shí)間的百分比;
也可用TON:TOFF來進(jìn)行表示(但是不常用,因?yàn)檫@種表示的是比值,沒有百分比直觀)
精度指的是相鄰占空比的變化步距。舉個(gè)例子來講,第一個(gè)占空比為1%,第二個(gè)為2%,第三個(gè)為3%,那么其精度就為1%;而即第一個(gè)占空比為0.1%,第二個(gè)為0.2%,第三個(gè)為0.3%,那么其精度為0.1%;但是,前者的精度沒有后者高,精度越高,占空比調(diào)節(jié)越細(xì)致。
在電機(jī)所在電路直接接一個(gè)電位器進(jìn)行調(diào)速是不可行的,因?yàn)殡姍C(jī)運(yùn)行時(shí),電位器只能接入幾歐的電阻,而電位器為純電阻電路部件,因此全部電能轉(zhuǎn)化為熱能,最終會導(dǎo)致電位器燒壞,但是電機(jī)不會燒壞,因?yàn)樗欠羌冸娮琛榱俗岆姍C(jī)的速度得以調(diào)控或更好地保護(hù)電路,我們可以利用PWM控制電機(jī)的導(dǎo)通,利用1ms通電,1ms斷開的思路,來進(jìn)行操作電機(jī)。
代碼
呼吸燈代碼
#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);
}
}
}
}
直流電機(jī)調(diào)速代碼
#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;} //電機(jī)速度的調(diào)節(jié)
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; //設(shè)置定時(shí)初值
TH0 = 0xFF; //設(shè)置定時(shí)初值
Counter++;
Counter%=100;
if(Counter<Compare)
{
Motor=1;
}
else
{
Motor=0;
}
}