1.直流電機介紹
· 直流電機是一種將電能轉換為機械能的裝置。一般的直流電機有兩個電極,當電極正接時,電機正轉,當電極反接時,電機反轉
· 直流電機主要由永磁體(定子)、線圈(轉子)和換向器組成
· 除直流電機外,常見的電機還有步進電機、舵機、無刷電機、空心杯電機等
2.電機驅動
電機的驅動無法直接使用IO口來進行驅動,所以用驅動電路來進行驅動,如大功率器件直接驅動,H橋驅動。本開發(fā)板直接用ULN2300來進行驅動,只需將電機的一端接VCC,另一端接OUT1就可。此時,在IN1輸入1,則OUT1輸出0,電機旋轉;在IN1輸入0,則OUT1輸出1,電機不旋轉
3.PWM介紹
· PWM(Pulse Width Modulation)即脈沖寬度調制,在具有慣性的系統(tǒng)中,可以通過對一系列脈沖的寬度進行調制,來等效地獲得所需要的模擬參量,常應用于電機控速、開關電源等領域
· PWM重要參數(shù):
頻率=1/Ts
占空比=ToN/Ts
精度=占空比變化步距
通過設置不同的占比來進行控制
通常一個周期的時間是相同的
4.LED呼吸燈
LED的IO口為0時,LED亮,為1時,LED滅;10口為1時,LED燈不會立刻熄滅,而是緩慢熄滅(具有慣性)
所以可以通過控制高電平和低電平的寬度即占空比來控制LED燈的亮度
通過逐步增加高電平寬度,減少低電平寬度,可使得LED燈越來越暗;反之,逐步增加低電平寬度,減少高電平寬度,可使得LED燈越來越亮
#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; //LED亮
Delay(Time); //延時Time
LED=1; //LED滅
Delay(100-Time); //延時100-Time
}
}
for(Time=100;Time>0;Time--) //改變亮滅時間,由亮到暗
{
for(i=0;i<20;i++) //計次延時
{
LED=0; //LED亮
Delay(Time); //延時Time
LED=1; //LED滅
Delay(100-Time); //延時100-Time
}
}
}
}
此方案簡單,但是需要占用主循環(huán),不斷翻轉IO口延時,主循環(huán)無法做其他事情
優(yōu)化
LED呼吸燈:定時器版
在實際使用中,都會用定時器來產生PWM,而本51單片機的芯片不具備這一功能,所以用軟件來模擬這個功能
產生PWM方法:
通過自增的計數(shù)器來和預先設定的比較值來進行比較,計數(shù)器的值小于比較值時,輸出0,反之輸出1,也可以相反。
先將定時器修改為100us觸發(fā)一次(電機的頻率一般在10K到20KHz之間)文章來源:http://www.zghlxwxcb.cn/news/detail-828250.html
#include <REGX52.H>
#include "Key.h"
#include "Timer.h"
#include "Nixie.h"
sbit LED = P2^0;
//計數(shù)值和比較值,用于輸出PWM
unsigned char Counter, Compare;
unsigned char KeyNum, Speed;
void main()
{
Timer0Init();
Compare = 5;
while(1)
{
KeyNum = GetKeyNum();
if(KeyNum == 1)
{
Speed++;
Speed %= 4;
if(Speed==0){Compare=0;} //設置比較值,改變PWM占空比
if(Speed==1){Compare=50;}
if(Speed==2){Compare=75;}
if(Speed==3){Compare=100;}
}
NixieShowNum(1,Speed);
}
}
//定時器0的中斷處理函數(shù)
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C; //設置定時初值
TH0 = 0xFF; //設置定時初值
Counter++;
Counter %= 100;
if(Counter < Compare)
{
LED = 0;
}
else
{
LED = 1;
}
}
5.直流電機調速
在原代碼的基礎上改個IO口就行(根據上述分析,Motor=1旋轉)文章來源地址http://www.zghlxwxcb.cn/news/detail-828250.html
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare; //計數(shù)值和比較值,用于輸出PWM
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;} //設置比較值,改變PWM占空比
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; //計數(shù)值變化范圍限制在0~99
if(Counter<Compare) //計數(shù)值小于比較值
{
Motor=1; //輸出1
}
else //計數(shù)值大于比較值
{
Motor=0; //輸出0
}
}
到了這里,關于【51單片機】直流電機驅動(PWM)(江科大)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!