直流電機驅(qū)動資料包:
0.png (42.06 KB, 下載次數(shù): 190)
下載附件
2018-12-5 17:18 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (23.56 KB, 下載次數(shù): 150)
下載附件
2018-12-5 17:22 上傳
0.png (12.8 KB, 下載次數(shù): 111)
下載附件
2018-12-5 17:22 上傳
電子系統(tǒng)設(shè)計報告
課題名稱 直流電動機驅(qū)動 專 業(yè) 電子信息工程技術(shù)
目錄 第1章 設(shè)計題目與要求 第2章 設(shè)計方案 2.1 設(shè)計方案 2.2 方案選擇 2.3 系統(tǒng)框圖 第3章 硬件設(shè)計 3.1 總體硬件設(shè)計 3.2 晶體振蕩器電路 3.3 復(fù)位電路 3.4 按鍵輸入電路 3.5 顯示電路 3.6 電機驅(qū)動電路 3.7 電機模塊 第4章 圖形界面設(shè)計 4.1 圖形界面設(shè)計 第5章 軟件設(shè)計 5.1 程序流程圖 第6章 制作與調(diào)試 6.1 硬件調(diào)試 6.2 程序調(diào)試 6.3 心得體會 參考文獻
設(shè)計題目:直流電機驅(qū)動。 設(shè)計要求: - 設(shè)計直流電機驅(qū)動。
- 設(shè)計液晶屏(LCD1602)顯示電路和獨立鍵盤輸入電路。
- 能準確顯示電機狀態(tài)及轉(zhuǎn)速。
- 能通過按鍵控制電機狀態(tài)及轉(zhuǎn)速。
2.1 設(shè)計方案方案一:單片機的四組并行口(P0、P1、P2、P3)在復(fù)位時是高電平,那么在設(shè)計按鍵接口時可以設(shè)計為低電平有效。當?shù)碗娖綍r判斷按鍵被按下去,執(zhí)行相關(guān)的操作。 按鍵按下去會存在抖動現(xiàn)象。如果對按鍵進行計數(shù),會發(fā)現(xiàn)雖然只按下去一次,所計的數(shù)卻不一致。這樣會導(dǎo)致錯誤的操作。因此需要對按鍵進行消抖,按鍵接口只是執(zhí)行單純的被檢測功能,需要特殊的功能寄存器,所以使用P1口。 顯示模塊采用LCD1602液晶屏,使用單片機的P0口。P0比較特殊,需要外接上拉電阻才能正常進行輸出?紤]到簡化仿真圖的設(shè)計,故使用P0口作為LCD1602液晶屏是數(shù)據(jù)端口。 由于需要對電機進行測速和狀態(tài)測,P3存在一些特殊寄存器可以使用,故保留P3口。其它接口均接在除P3口以外的接口。 直流電機的轉(zhuǎn)速與正向電流持續(xù)時間成正比,使用PWM方式產(chǎn)生脈沖,電機轉(zhuǎn)速進行調(diào)節(jié)。具體如何產(chǎn)生則使用定時器T0產(chǎn)生中斷。 測速則使用T1定時器、外中斷INT1組合測量。通過外中斷INT1的負跳變來開啟T1計時器,通過測量兩次負脈沖的時間間隔即可得到轉(zhuǎn)速(電機轉(zhuǎn)動一圈發(fā)出一定時長的高電平)。 狀態(tài)的測量則在再次使用外中斷0、1來完成。狀態(tài)測量采用這樣的測量方式只需要測量一次即可,占用時間很短,并且準確。 方案二:對方案一的部分進行修改。按鍵部分為了響應(yīng)準確,采用外接高電平的方法。 電機測速模塊:仍然不變。 狀態(tài)測量改成通過內(nèi)部編程完成測量,不需要外中斷0、1的參與。 方案三:仍然對方案一進行修改。按鍵部分為確保準確性,按鍵外部接上高電平。 PWM波形產(chǎn)生模塊使用數(shù)據(jù)選擇器對電機的正反轉(zhuǎn)進行控制,降低編程難度。 2.2 方案選擇方案一過于追求準確性,編程復(fù)雜,過多的開啟中斷實現(xiàn)功能與其它方案是一樣的,但是大量標志位的開啟需要特別注意,同時要小心時序問題。對編程能力、協(xié)調(diào)有比較高的要求。 方案二準確的提高了按鍵的準確性部分,通過仔細考慮,與開外中斷測量比較,編程變簡單。全部實現(xiàn)比較容易,但為保證準確性、需要通過編程進行調(diào)整。 方案三經(jīng)過仔細考慮,使用數(shù)據(jù)選擇器雖然降低了變成難度,在選擇芯片、了解芯片可能需要多花時間。 最終認為方案二比較可行。 2.3 系統(tǒng)框圖整個系統(tǒng)以單片機為核心,處理信息。 - 鍵盤:有7個鍵盤,每個鍵盤有不同的功能。鍵盤的輸入信號流入單片機需要進行消抖,避免產(chǎn)生預(yù)期外的結(jié)果。
- STC89C51:負責(zé)整個系統(tǒng)的信息處理。包括鍵盤的輸入信號處理、根據(jù)鍵盤的信號發(fā)出電機驅(qū)動信號、對電機的速度和轉(zhuǎn)向進行測量、測量完成將信息送給顯示。
- 電機驅(qū)動芯片:電機所需要的驅(qū)動電流相對于STC89C51直接輸出的電流要打的多,對電機的控制不理想。反過來同樣會影響到單片機的正常工作。所以需要通過驅(qū)動芯片來驅(qū)動直流電機。
- 電機:電機為MOTOR-ENCODER,有五條線。其中的兩條用來輸入電流驅(qū)動電機,剩余的三條為電機的編碼輸出。中間的線輸出特征為電機轉(zhuǎn)動一圈輸出一個正脈沖。邊上兩個根線輸出的脈沖可調(diào),脈沖的相位相差90度,反應(yīng)了電機的正反轉(zhuǎn)。
- 顯示:顯示所用器件為LCD1602顯示器,顯示電機轉(zhuǎn)速,正反轉(zhuǎn)狀態(tài)。
3.1 總體硬件設(shè)計總體硬件分為:晶體振蕩器電路、復(fù)位電路、按鍵輸入模塊、顯示電路、電機驅(qū)動電路、電機模塊。如下圖 3.1?1所示 圖 3.1?1 3.2 晶體振蕩器電路晶振X1采用11.0592MHZ,電容C1、C2采用典型值22pF。如圖 3.2?1。該電路的功能是為單片機提供11.0529MHZ的時鐘。 圖 3.2?1 3.3 復(fù)位電路電路圖 3.3?1如所示。復(fù)位電路電源為+5V、電容(極性電容)C3采用典型值10uF、電阻R7為820歐姆、按鍵。該電路為單片機復(fù)位端口提供一定時間的高電平,當單片機發(fā)生異常時可以通過按鍵使單片機復(fù)位。然后正常運行。其中EA/引腳在此電路中不需要使用,只是接上去了而已。 圖 3.3?1 3.4 按鍵輸入電路電路圖如圖 3.4?1所示。按鍵共有6個,分別有不同的功能。按鍵的功能在圖上已經(jīng)標出。圖中的六個電阻阻值為1K歐姆,為限流電阻、還有降壓的作用。電壓沒有標出統(tǒng)一為+5V。只有按下按鍵1才能啟動其他按鍵。 圖 3.4?1 3.5 顯示電路電路圖如圖 3.5?1所示。液晶顯示模塊數(shù)據(jù)口與單片機的P0口連接,其它端口通過標號與P2.0、P2.1連接。P0口與液晶顯示模塊交換信息、P2.0、P2.1口對液晶進行讀寫、使能控制。 圖 3.5?1 3.6 電機驅(qū)動電路電路圖如圖 3.6?1所示。驅(qū)動芯片型號為L298其驅(qū)動能力很強。VCC為芯片的電源+5V、VS為電機驅(qū)動電壓,最高為45V。IN1、IN2接TTL電平、與單片機標號為ON、OFF的端口(電機控制流的輸出端口)連接,ON、OFF端口如圖 3.4?1所示。ENA、ENB為芯片的使能端,高電平時芯片工作。ENA控制端口IN1、IN2、OUT1、OUT2。低電平時端口無法工作,無法控制電機。OUT1、OUT2接直流電機輸入端。圖中接地的端口在圖中用不到。 圖 3.6?1 3.7 電機模塊電路圖如圖 3.7?1所示。電機的輸入端口為1、2。1為高電平時,電機正轉(zhuǎn)2為高電平時,電機反轉(zhuǎn)。1、2同為高或者低電平則不轉(zhuǎn),ENA低電平也不轉(zhuǎn)。電機的A、B與單片機的A、B連接,用于電機狀態(tài)的測量。IN1與單片機的IN1相連,用于測速。具體連接與標號在圖中已標注。 圖 3.7?1 4.1 圖形界面設(shè)計4.1.1 按鍵界面設(shè)計如圖 4.1?1所示
按鍵掃描模塊中有6個按鍵,每個按鍵會調(diào)動相應(yīng)的模塊。并對數(shù)據(jù)處理。 4.1.2 LCD1602模塊界面界面設(shè)計如圖 4.1?2所示: 顯示模塊會顯示電機的相關(guān)信息(正轉(zhuǎn)、反轉(zhuǎn)、速度、可以加上電機是否加速的、減速的測試、以及顯示),顯示前將依據(jù)按鍵輸入的信號進行運算,處理后送入液晶中。 5.1 程序流程圖主程序流程圖如圖 5.1?1所示。 6.1 硬件調(diào)試在確定方案后,便開始搭建硬件。從難易程度來看,該課題是比較簡單的所以硬件部分搭建容易,搭建完成即可。開始方案是選擇方案一,需要使用多個中斷,需要修改的僅僅是電路的連接。后面發(fā)現(xiàn)方案一過于復(fù)雜,改用方案二,對需要修改的連接電路增加標號即可。 6.2 程序調(diào)試由于是自己寫程序,經(jīng)驗不足、速度慢,容易出現(xiàn)問題。為了保證每一個環(huán)節(jié)到位,采用邊寫程序、邊調(diào)試的方法。 最先開始的模塊是顯示模塊。顯示模塊使用器件為LCD1602,在單片機的課程中學(xué)過做過關(guān)于這個器件的實驗,對器件了解有一些,但不是很熟悉。對原來的程序沒有進行封裝,最開始出現(xiàn)數(shù)據(jù)送入位置錯誤,造成預(yù)期之外的結(jié)果。而后通過仔細查看課本上的資料,通過位置對照,修改后,液晶顯示模塊初步?jīng)]有問題。 電機控制模塊:對電機控制需要使用中斷、在中斷里面產(chǎn)生方波信號,并且方波的占空比可調(diào),電機控制流輸出通道選擇也在這個模塊。在這個模塊完成前需要完成一部分鍵盤掃描函數(shù)的設(shè)計。當以上程序完成并運行后,通道選擇和占空比都出現(xiàn)了問題。最開始是無論按什么鍵電機都不轉(zhuǎn),于是乎調(diào)整程序,首先發(fā)現(xiàn)單片機四組端口復(fù)位后輸出為高電平,即表示電機停轉(zhuǎn),需要對電機輸出端口初始化,都為低電平。然后進行控制。脈沖波形的占空比的調(diào)節(jié),設(shè)立多個全局變量,設(shè)置上下限,這樣波形占空比調(diào)節(jié)沒有問題。電機輸出信號通道選擇,由于寫程序經(jīng)驗不足,邏輯上出現(xiàn)了錯誤,導(dǎo)致想要外接數(shù)據(jù)選擇器來調(diào)節(jié)信號輸出,進而控制電機正反轉(zhuǎn)。最后經(jīng)過實驗發(fā)現(xiàn)這個方法實現(xiàn)起來比較困難,思路沒有。還是從中斷里面進行調(diào)節(jié)好一些。最終實現(xiàn)了電機的調(diào)節(jié)。 電機轉(zhuǎn)向測量模塊:此模塊完成后在多次的調(diào)試過程中發(fā)現(xiàn)使用while語句莫名奇妙對電極控制模塊產(chǎn)生了影響。為了保證電機控制模塊沒有問題,對轉(zhuǎn)向模塊重新進行了設(shè)計,理論分析。但是由于時間問題,沒能完成。 測速模塊的調(diào)節(jié):測速模塊需要定時器1和外中斷1完成。測速模塊完成后需要與顯示模塊共同完成。由于此前在選擇方案的時候,過分依賴中斷和定時器,進行了較長時間的論證,電機控制模塊的調(diào)試由于是個人編程思想和能力問題導(dǎo)致花費了大量的時間。測速模塊雖然完成,但是沒有時間調(diào)試。 6.3 心得體會在一周的實訓(xùn)中,發(fā)現(xiàn)了很多的問題,也收獲了很多。最開始是方案的確定很困難,方案的確定需要對單片機的各個資源非常了解。這從側(cè)面反映了個人對單片機不熟悉,以及特點的不了解,最終方案的敲定花費了大量的時間,導(dǎo)致后面編程、其它問題的解決時間不足。 從定時器T0的編程中發(fā)現(xiàn)自身的寫程序能力非常薄弱,程序的結(jié)構(gòu)很亂,在一定程度上來說完全是想到什么就寫什么,毫無章法。更沒有將程序封裝起來、留做下次便以稍加修改即可使用。 總之,在這次實訓(xùn)中讓我看到了自己各個方面的不足,這些不足通過平時的鍛煉是可以補起來的,反映出學(xué)習(xí)方法存在問題,需要加以改進。通過實訓(xùn),對單片機的部分硬件有了進一步的了解、熟悉。單片機實訓(xùn)是一個比較綜合的課程,結(jié)合了C語言、單片機常識、模擬電路、數(shù)字電路、硬件設(shè)計、軟件的使用、軟件設(shè)計。對培養(yǎng)獨立解決問題的能力、自主學(xué)習(xí)能力、創(chuàng)新思維能力有較大影響。
單片機源程序如下:
- #include <reg52.h>
- #include<string.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit lcdrs=P2^0; //寄存器選擇,0:數(shù)據(jù)寄存器。1:為狀態(tài)/命令寄存器
- sbit lcden=P2^1; //--LCD控制引腳
- sbit speed=P3^2; //測速端口
- sbit ENA=P2^2; //電機使能控制端
- sbit key1=P1^0; //啟動按鍵
- sbit key2=P1^1; //正轉(zhuǎn)按鍵
- sbit key3=P1^2; //反轉(zhuǎn)按鍵
- sbit key4=P1^3; //加速按鍵
- sbit key5=P1^4; //減速按鍵
- sbit key6=P1^5; //停止按鍵
- sbit Zheng=P1^6; //正轉(zhuǎn)輸出端口
- sbit Fan=P1^7; //反轉(zhuǎn)輸出端口
- uchar Timer0_flag=4;
- uchar Timer0_BiaoZhi=0;//初始化占空比為1:3(高:低)
- uchar gewei;
- uchar shiwei;
- uchar baiwei;
- /******標志位設(shè)置*****/
- uchar KEY1=0;//優(yōu)先級標志
- uchar KEY2=0;//加速標志
- uchar INT1_FLAG=0;
- uchar COUNTER_high=0;
- uchar COUNTER_low=0;
- uchar SUM=0;
- uint TIMER1_COUNTER=0;
- uint INT1_tingzhi=0; //在要測速時置0
- /****面板顯示****/
- uchar code lcd_desktop11[]="stop";//停止
- uchar code lcd_desktop12[]="ford";//正轉(zhuǎn)
- uchar code lcd_desktop13[]="fanz";//反轉(zhuǎn)
- uchar code lcd_desktop21[]="speedup";//加速
- uchar code lcd_desktop22[]="speeddn";//減速
- uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};//要顯示的轉(zhuǎn)速數(shù)字。
- //-----lcd液晶屏頭文件-----//
- /**延時函數(shù)**/
- void delayms(uchar xms)
- {
- uchar i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /****LCD寫命令******/
- void write_command(uchar com)//com寫入命令
- {
- lcdrs=0;
- P0=com;
- delayms(2);
- lcden=1;
- delayms(2);
- lcden=0;
- }
- /**************LCD寫數(shù)據(jù)*********/
- void write_data(uchar date)//數(shù)據(jù)為DATA
- {
- lcdrs=1;
- P0=date;
- delayms(2);
- lcden=1;
- delayms(2);
- lcden=0;
- }
- /********LCD初始化****************/
- void lcd_init()//顯示模式設(shè)置
- {
- lcden=0;
- write_command(0x38);
- write_command(0x0c);
- write_command(0x06);
- write_command(0x01);
- }
- /**電機初始化函數(shù)**/
- void motor_init(void)
- {
- ENA=0; // 停止
- }
- void ZhongDuanKaiQi(void)
- {
- EA=1;
- ET0=1; //計時器0允許中斷。產(chǎn)生脈沖。
- ET1=1; //計時器1允許中斷。對低電平進行計時。
- //EX1=1; //INT0允許中斷。測速。由外部來啟動。
- IT1=1; //低電平觸發(fā)。
- PX1=0; //低級中斷。
- PT0=1;
- PT1=0;
- TMOD=0x12;//定時器工作方式控制
- }
- /***定時器T1初始化。!等待外部脈沖的到來***/
- void Timer1_init(void)
- {
- TH1=0;
- TL1=0; //等待外部脈的到來。INT1
- }
- /*****定時T0初始化*****/
- void Timer0_init(void)
- {
- TH0=0;
- TL0=0;
- TR0=1;
- }
- /********測速模塊,顯示速度*******/
- void speed_test(void)
- {
- // TIMER1_COUNTER;
- COUNTER_high=TH1;
- COUNTER_low=TL1;
- SUM=COUNTER_high*256+COUNTER_low+TIMER1_COUNTER*65536;//得到的是多少us。
- SUM=SUM/1000; //化為毫秒。
- SUM=1000/SUM; //圈每秒。
- SUM=SUM*60; //圈每分鐘;三位數(shù)。
- gewei=SUM%10;
- shiwei=SUM/10%10;
- baiwei=SUM/100;
- write_command(0xc0);
- write_data(baiwei);
- write_command(0xc1);
- write_data(shiwei);
- write_command(0xc2);
- write_data(gewei);
- SUM=0;
- TIMER1_COUNTER=0;
- }
- /********外中斷1函數(shù)**********/
- void INT1_QIDONG() interrupt 2
- {
- INT1_tingzhi++;
- if(INT1_tingzhi==5)
- {
- INT1_tingzhi=5;EX1=0;//關(guān)閉中斷。
- }
- if(INT1_tingzhi<=4)
- {
- INT1_FLAG++;
- if(INT1_FLAG==2)
- {
- INT1_FLAG=0;TR1=0;speed_test();
- }
- else
- {
- Timer1_init();
- TR1=1;
- }
- }
- }
- /******定時器T1計數(shù)*******/
- void Timer1_QIDONG() interrupt 3
- {
- TIMER1_COUNTER++;
- }
- /**相位測量并輸出!!!!!出現(xiàn)問題???**/
- void xiangwei_test(void)
- {
- uchar i=0,j=0;
- //while((P2^3==0)&&(P2^4==0));
- //if((P2^3==0)&&(P2^4==0))
- {
- //delayms(5);
- if(P2^3==1)
- {
- write_command(0x01);
- write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop13[i]);//反轉(zhuǎn)。
- j++;//反轉(zhuǎn)
- }
-
- if(P2^4==1)
- {
- write_command(0x01);
- write_command(0x80);for(i=0;i<=3;i++) write_data(lcd_desktop12[i]);//正轉(zhuǎn)。
- j++;
- }
- }
- }
- /****T0中斷發(fā)出信號并進行通道選擇****/
- void Timer0() interrupt 1
- {
- Timer0_flag--;
- if((Timer0_BiaoZhi)>=(Timer0_flag))
- {
- if(KEY2==0)
- {
- Zheng=1;Fan=0;
- }
- else
- {
- Zheng=0;Fan=1;
- }
- }
- else
- {
- Zheng=0;Fan=0;
- }
- if(Timer0_flag==0) Timer0_flag=5;
- }
- void Guan(void)
- {
- ET0=0;
- EX1=0;
- ET1=0;
- }
- void keyscan() //按鍵掃描函數(shù)
- {
- uint i=0;
- if(key1==0) //按鍵K1啟動按鈕。只有該位啟動時,后面的幾位才有效。啟動T0計數(shù)開始發(fā)出脈沖。
- {
- delayms(10);
- if(key1==0)
- {
- while(!key1);
- KEY1=5;
- Fan=0;
- Zheng=0;
- ENA=1;
- KEY2=0;//初始化為正轉(zhuǎn)。
- Timer0_BiaoZhi=0;
- Timer0_flag=4;
-
- ZhongDuanKaiQi();//開啟中斷
- Timer0_init();// 初始化并開始發(fā)出脈場外中斷已經(jīng)開啟。
- EX1=1; //外中斷開啟;測速,顯示速度。五次后結(jié)束關(guān)閉外中斷1。出現(xiàn)問題。!
-
- write_command(0x80);
- for(i=0;i<strlen(lcd_desktop11);i++)//顯示正轉(zhuǎn)。
- write_data(lcd_desktop12[i]);
- }
- }
-
- if((key2==0)&&(KEY1=5)) //按鍵K2按下,(正轉(zhuǎn))只改變轉(zhuǎn)向(標志位改變輸出端口)
- {
- delayms(10);
- if(key2==0)
- {
- while(!key2);
- KEY2=0; //正轉(zhuǎn)標志,電機正向旋轉(zhuǎn)。
- //KEY2=(~1);
- xiangwei_test();
- KEY1=5;
- }
- }
-
- if((key3==0)&&(KEY1=5)) //按鍵K3按下,(反轉(zhuǎn))只改變轉(zhuǎn)向
- {
- delayms(10);
- if(key3==0)
- {
- while(!key3);
- KEY2=~0; //反轉(zhuǎn)標志。
- //KEY2=(~0);
- xiangwei_test();
- KEY1=5;
- }
- }
- if((key4==0)&&(KEY1==5)) //按鍵K4按下,(加速)改變裝入的數(shù)值?循環(huán)次數(shù)?執(zhí)行if里面的語句,通過size++來改變幅值的頻率
- {
- delayms(10);
- if(key4==0)
- {
- while(!key4);
- if(Timer0_BiaoZhi<4)
- {
- Timer0_BiaoZhi++;
- }
- else
- {
- Timer0_BiaoZhi=4;
- }
- EX1=1;
- KEY1=5;
- }
-
- }
-
- if((key5==0)&&(KEY1==5)) //按鍵K5按下,(減速)對其它標志位沒有影響。
- {
- delayms(5);
- if(key5==0)
- {
- while(!key5);
- if(Timer0_BiaoZhi==0)
- {
- Timer0_BiaoZhi=0;
- }
- else
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
直流電機驅(qū)動.zip
(2.68 MB, 下載次數(shù): 916)
2018-12-5 09:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|