亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

我們平時都用到電機(jī) , 它是一種把電能轉(zhuǎn)換為機(jī)械能的裝置,下面我們用實(shí)例來說說步進(jìn)電機(jī)和直流電機(jī)在控制方式上有什么不同 。今天我們用兩個實(shí)例來給剛學(xué)單片機(jī)的小伙伴們說明,兩種電機(jī)控制方式的不同 。
一、步進(jìn)電機(jī)的控制
步進(jìn)電機(jī)是以脈沖信號電流來驅(qū)動,例如步進(jìn)電機(jī)每轉(zhuǎn)一周需要200個脈沖信號來激勵,就可以計(jì)算出每個勵磁信號能使步進(jìn)電機(jī)前進(jìn)1.8度,其旋轉(zhuǎn)角度與脈沖的個數(shù)成正比,而步進(jìn)電機(jī)的正反轉(zhuǎn)有勵磁脈沖產(chǎn)生的順序來控制 。通過以上的原理,我們就可以用程序來控制步進(jìn)電機(jī)了,
1)連接:
(一)將P2.0、P2.1、P2.2、P2.3口分別接到P30(在步進(jìn)電機(jī)模塊的左側(cè))的A、B、C、D上 。
(二)將M3(步進(jìn)電機(jī)驅(qū)動模塊輸出)的A、B、C、D分別接到步進(jìn)電機(jī)的A、B、C、D四相上 , 步進(jìn)電機(jī)的COM端接到VCC(M3接口標(biāo)志的VCC)上 。
2)電源:將P35(步進(jìn)電機(jī)驅(qū)動模塊的左下角)接口用短接冒短接 , 電源+5V
3)按鍵命名:與P1低位到高位依次連接的按鍵一下命名為按鍵KEY1~KEY8
4)效果:啟動程序,步進(jìn)電機(jī)默認(rèn)停止?fàn)顟B(tài)
按鍵4:步進(jìn)電機(jī)暫停/繼續(xù)
按鍵5:步進(jìn)電機(jī)停止/運(yùn)行

關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
步進(jìn)電機(jī)控制原理圖
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
步進(jìn)電機(jī)仿真圖
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define T0_COUNT 50 //定時器0的計(jì)數(shù)值
#define KEY P1 //按鍵控制
#define MOTOR P2 //步進(jìn)電機(jī)接口
sbit LED = P3^3; //LED指示燈
uint count; //節(jié)拍計(jì)數(shù)值
uint count_time; //計(jì)時時間
uchar count_beat; //步進(jìn)電機(jī)驅(qū)動數(shù)組中的數(shù)值計(jì)數(shù)/*A AB B BC C CD D DA*/
uchar forward[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍 正轉(zhuǎn)
/* A AD D DC C CB B BA*/
uchar reverse[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03}; //四相八拍 反轉(zhuǎn)
bit forward_flag; //電機(jī)正反轉(zhuǎn)標(biāo)志,1:電機(jī)正轉(zhuǎn) 0:電機(jī)反轉(zhuǎn)
bit stop_flag; //電機(jī)停止/運(yùn)行標(biāo)志 1:停止 0;運(yùn)行
bit suspend_flag; //電機(jī)暫停/繼續(xù)標(biāo)志 1:暫停 0:繼續(xù)
函數(shù)名稱:delay_ms軟件延時 , 延時的單位時間在1ms左右
void delay_ms(uint n)
{
uint i;
uchar j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
函數(shù)名稱:key_scan功 能:按鍵掃描返 回 值:掃描的結(jié)果,”0″為無按鍵按下、非”0″為按鍵值
uchar key_scan()
{
uchar temp = 0;
KEY = 0xff;
if(KEY!=0xff)
{
delay_ms(10); //按鍵消抖
KEY = 0xff;
if(KEY!=0xff)
{
temp = KEY;
while(KEY!=0xff) //等待按鍵釋放
KEY = 0xff;
}
}
return temp;
}
函數(shù)名稱:key_behav形 參:uchar key_val:按鍵值功 能:實(shí)現(xiàn)按鍵功能
void key_behav(uchar key_val)
{
switch(key_val)
{
case 0xfe: //步進(jìn)電機(jī)加速
if((0==stop_flag)&&(0==suspend_flag))
{
count_time -= 10; //減少節(jié)拍之間的時間
if(count_time<40)
count_time = 40;
}
break;
case 0xfd: //步進(jìn)電機(jī)減速
if((0==stop_flag)&&(0==suspend_flag))
{
if(count_time<150)
count_time += 10; //增加節(jié)拍之間的時間
}
break;
case 0xfb: //步進(jìn)電機(jī)正或反轉(zhuǎn)選擇
if((0==stop_flag)&&(0==suspend_flag))
{
forward_flag = ~forward_flag; //切換電機(jī)旋轉(zhuǎn)模式
count_beat = 0; //步進(jìn)電機(jī)驅(qū)動數(shù)組中的數(shù)值計(jì)數(shù)
}
break;
case 0xf7: //步進(jìn)電機(jī) 暫停/繼續(xù)
if(stop_flag==0)
{
suspend_flag = ~suspend_flag;
if(suspend_flag)
TR0 = 0; //暫停
else
TR0 = 1; //繼續(xù)
}
break;
case 0xef: //步進(jìn)電機(jī)停止/運(yùn)行
stop_flag =~ stop_flag;
if(stop_flag)
{ //停止
TR0 = 0; //停止輸出
LED = 1; //關(guān)閉LED指示燈
count_beat = 0;
count_time = 1000;
forward_flag = 1;
suspend_flag = 0;
}
else
{
LED = 0; //點(diǎn)亮LED指示燈
TR0 = 1; //允許輸出
}
break;
default:break;
}
}
函數(shù)名稱:interrupt_init功 能:中斷寄存器初始化 返 回 值:無
void interrupt_init()
{
TMOD = 0x01; //定時器工作方式1
TH0 = (65536-T0_COUNT)/256; //賦值初值
TL0 = (65536-T0_COUNT)%256;
ET0 = 1; //打開定時器 1 中斷
EA = 1; //打開總中斷
}
函數(shù)名稱:variable_init功 能:變量、標(biāo)志初始化
void variable_init() //初始化
{
count_beat = 0; //賦占空比初值
count_time = 100;
forward_flag = 1; //步進(jìn)電機(jī)正轉(zhuǎn)
suspend_flag = 0; //電機(jī)繼續(xù)
stop_flag = 1; //電機(jī)停止
}
void main()/*————-主函數(shù)———-*/
{
uchar key_val; //定義變量
variable_init(); //變量初始化
interrupt_init(); //中斷初始化
while(1)
{
key_val = key_scan(); //按鍵掃描,判斷哪個按鍵按下
key_behav(key_val); //按鍵按下,判斷實(shí)現(xiàn)的功能
}
}
函數(shù)名稱:moto_run功 能:中斷函數(shù);產(chǎn)生控制電機(jī)的PWM波形返 回 值:無
void moto_run() interrupt 1
{
TH0 = (65536-T0_COUNT)/256; //定時器賦初值
TL0 = (65536-T0_COUNT)%256;
count++;
if((count>=count_time))
{
count = 0;
if(forward_flag) //步進(jìn)電機(jī)正轉(zhuǎn)
MOTOR = forward[count_beat];
else //步進(jìn)電機(jī)反轉(zhuǎn)
MOTOR = reverse[count_beat];
count_beat++;
}
if(count_beat>7)
count_beat=0;
}
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
用單片機(jī)仿真板發(fā)出脈沖信號由ULN2003驅(qū)動5伏步進(jìn)電機(jī)
二、直流電機(jī)控制
用單片機(jī)控制直流電機(jī),我們都知道由于單片機(jī)I/O的灌電流僅有10毫安左右,工作電壓為5伏,要驅(qū)動額定電壓為12伏,額定電流為幾百毫安的直流電動機(jī),必須增加驅(qū)動電路,才能提供大的驅(qū)動電流 , 我們常用的直流電動機(jī)驅(qū)動電路有繼電器控制的驅(qū)動電路、有三極管組成的H橋驅(qū)動電路、電機(jī)驅(qū)動芯片、達(dá)林頓管驅(qū)動器等 。我了達(dá)到電機(jī)正反轉(zhuǎn),我焊接了一個由三極管組成的驅(qū)動橋電路,來驅(qū)動電機(jī)的正反轉(zhuǎn) 。
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
微型直流電機(jī)驅(qū)動橋
1)連接:
(1)將P2.0、P2.1口接到P31(在直流電機(jī)模塊的左側(cè))的DC_A、DC_B上 。
(2)將B1(直流電機(jī)驅(qū)動模塊輸出)接到直流電機(jī)上 。
(3)將P3.3口接到某一個LED接口上(P8或P17) 。作為直流電機(jī)狀態(tài)指示燈:亮,直 流電機(jī)運(yùn)行;滅,直流電機(jī)停止
2)電源:將P36(直流電機(jī)驅(qū)動模塊的左上角)接口用短接冒短接 , 電源+5V
3)按鍵命名:與P1低位到高位依次連接的按鍵一下命名為按鍵1~8
4)效果:啟動程序,直流電機(jī)默認(rèn)停止?fàn)顟B(tài),運(yùn)行指示燈熄滅
按鍵1:在直流電機(jī)運(yùn)行的狀態(tài)下,直流電機(jī)加速
按鍵2:在直流電機(jī)運(yùn)行的狀態(tài)下 , 直流電機(jī)減速
按鍵3:在直流電機(jī)運(yùn)行的狀態(tài)下,直流電機(jī)正反轉(zhuǎn)切換
按鍵4:直流電機(jī)暫停/繼續(xù)
按鍵5:直流電機(jī)停止/運(yùn)行
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
直流電機(jī)控制原理圖
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
直流電機(jī)仿真圖
直流電機(jī)控制參考程序
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
#define T0_COUNT 100 //定時器0的計(jì)數(shù)值
#define KEY P1 //按鍵控制
#define PWM 100 //PWM計(jì)數(shù)值的上限值
#define INIT_VAL_PWM 20 //PWM占空比初始值
#define INCREMENT_PWM 10 //PWM控制時的增量大小
sbit DC_Moto_A = P2^0; //脈沖輸入引腳
sbit DC_Moto_B = P2^1;
sbit LED = P3^3; //LED指示燈接口
uchar count_PWM; //PWM計(jì)數(shù)值
uchar val_PWM; //PWM占空比的值(加速可調(diào))
bit forward_flag; //電機(jī)正反轉(zhuǎn)標(biāo)志 ,  1:電機(jī)正轉(zhuǎn) 0:電機(jī)反轉(zhuǎn)
bit stop_flag; //電機(jī)停止/運(yùn)行標(biāo)志 1:停止 0;運(yùn)行
bit suspend_flag; //電機(jī)暫停/繼續(xù)標(biāo)志 1:暫停 0:繼續(xù)
函數(shù)名稱:delay_ms,形參:uint n:延時時間的長度,功能是軟件延時 , 延時的單位時間在1ms左右
void delay_ms(uint n)
{
uint i;
uchar j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
函數(shù)名稱:key_scan , 功能:按鍵掃描,返 回 值:掃描的結(jié)果,”0″為無按鍵按下、非”0″為按鍵值
uchar key_scan() //按鍵檢測
{
uchar temp = 0;
KEY = 0xff;
if(KEY!=0xff) //按鍵消抖
{
delay_ms(10);
KEY = 0xff;
if(KEY!=0xff)
{
temp = KEY;
while(KEY!=0xff) //等待按鍵釋放
KEY = 0xff;
}
}
return temp;
}
函數(shù)名稱:key_behav,形 參:uchar key_val:按鍵值,功能:實(shí)現(xiàn)按鍵功能
void key_behav(uchar key_val)
{
switch(key_val)
{
case 0xfe: //電機(jī)加速
if((0==stop_flag)&&(0==suspend_flag))
{
val_PWM += INCREMENT_PWM; //增加占空比
if(val_PWM>PWM) //PWM表示占空比的上限值
val_PWM = PWM;
}
break;
case 0xfd: //電機(jī)減速
if((0==stop_flag)&&(0==suspend_flag)) //他是如何加速的事通過什么來實(shí)現(xiàn)的呢
{
if(val_PWM>=INCREMENT_PWM)
val_PWM -= INCREMENT_PWM; //增加占空比
}
break;
case 0xfb: //電機(jī)正或反轉(zhuǎn)選擇
if((0==stop_flag)&&(0==suspend_flag))
forward_flag = ~forward_flag; //切換電機(jī)旋轉(zhuǎn)模式
break;
case 0xf7: //電機(jī)暫停/繼續(xù)
if(stop_flag==0)
{
suspend_flag = ~suspend_flag;
if(suspend_flag)
{
TR0 = 0; //暫停
DC_Moto_A = 0;
DC_Moto_B = 0;
}
else
TR0 = 1; //繼續(xù)
}
break;
case 0xef: //電機(jī)停止/運(yùn)行
stop_flag =~ stop_flag;
if(stop_flag)
{ //停止
TR0 = 0; //停止PWM輸出
val_PWM = INIT_VAL_PWM; //初始化變量和標(biāo)志
LED = 1; //關(guān)閉指示燈
forward_flag = 1;
suspend_flag = 0; //停止運(yùn)行的時候初始化一下
DC_Moto_A = 0;
DC_Moto_B = 0;
}
else
{
LED = 0; //點(diǎn)亮指示燈
TR0 = 1; //允許輸出PWM波形
}
break;
default:break;
}
}
函數(shù)名稱:interrupt_init,功能:中斷寄存器初始化
void interrupt_init() //初始化
{
TMOD = 0x01; //選擇定時器/計(jì)數(shù)器工作方式1
TH0 = (65536-T0_COUNT)/256;
TL0 = (65536-T0_COUNT)%256;
ET0 = 1; //開定時器/計(jì)數(shù)器中斷
TR0 = 1;
EA = 1; //開總中斷
}
函數(shù)名稱:variable_init,功能:變量、標(biāo)志初始化
void variable_init() //變量初始化
{
val_PWM = INIT_VAL_PWM;
forward_flag = 1; //電機(jī)正反轉(zhuǎn)標(biāo)志
suspend_flag = 0; //電機(jī)暫停/繼續(xù)標(biāo)志
stop_flag = 1; //電機(jī)停止/運(yùn)行標(biāo)志
LED = 1; //關(guān)閉指示燈
DC_Moto_A = 0; //P2^0口輸入
DC_Moto_B = 0; //P2^1口輸入
}
void main() /*————-主函數(shù)———-*/
{
uchar key_val;
variable_init(); //變量初始化
interrupt_init(); //中斷函數(shù)初始化
while(1)
{
do
key_val = key_scan();
while(0==key_val);
key_behav(key_val);
}
}
函數(shù)名稱:moto_run,功 能:中斷函數(shù);產(chǎn)生控制電機(jī)的PWM波形(定時器1中斷)
void moto_run() interrupt 1 //選擇正轉(zhuǎn)還是反轉(zhuǎn)跳入中斷
{
TH0 = (65536-T0_COUNT)/256; //核心是在中斷里面
TL0 = (65536-T0_COUNT)%256;
count_PWM++; //PWM計(jì)數(shù)值
if(forward_flag)
{ //電機(jī)正轉(zhuǎn)
DC_Moto_B = 0;
if(count_PWM<val_PWM) //產(chǎn)生PWM
DC_Moto_A = 1;
else
DC_Moto_A = 0;
}
else
{ //電機(jī)反轉(zhuǎn)
DC_Moto_A = 0;
if(count_PWM<val_PWM) //產(chǎn)生PWM
DC_Moto_B = 1;
else
DC_Moto_B = 0;
}
if(count_PWM>=PWM)
count_PWM = 0;
}
關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理

文章插圖
用單片機(jī)仿真板發(fā)出PWM波形去控制H橋來驅(qū)動直流小電機(jī)
以上程序我們是用PWM實(shí)現(xiàn)對電機(jī)的調(diào)速的,因?yàn)镻WM信號只有兩種狀態(tài) , 高電平和低電平,對于一個給定的周期來說,高電平所占的時間和周期之比我們稱之為占空比,我們只要改變控制信號的占空比就可以改變電機(jī)的轉(zhuǎn)速 。
【關(guān)于單片機(jī)電機(jī)驅(qū)動模塊 單片機(jī)控制電機(jī)的原理】從以上兩個實(shí)例可以看出,不同的電機(jī),所用的控制方式是不一樣的 。希望通過這兩個實(shí)例的推送對剛學(xué)單片機(jī)的朋友有所幫助 , 有問題歡迎留言討論,共同進(jìn)步 。


    以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

    「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: