步进电机控制器的设计
本文檔作備份用。
摘 要: 設計了一種具有多模式的步進電機控制裝置,本裝置基于STC的一款單片機STC89C52,軟件部分由C51編寫,包含啟停中斷程序、轉向中斷程序、步進電機調速程序以及鍵盤信號檢測與顯示程序等設計 ,硬件部分包含單片機最小系統電路、步進電機及其驅動電路、顯示與按鍵處理電路等設計。
關鍵詞: 多模式;步進電機;單片機;顯示參數
1 設計任務與要求
(1)可控制步進電機的啟動與停止、正轉與反轉
(2)10 檔速度調節
(3)點動控制
(4)可顯示電機運行參數
2 設計方案
2.1總體設計思路
在該控制裝置中由單片機輸出電機的各相控制脈沖序列,由ULN2003D驅動模塊帶動步進電機轉動,用按鍵輸入的方式控制電機的工作方式,同時數碼管會顯示電機運行狀態。
2.2步進電機的控制方式
采用延時方法進行控制。
延時方法是在每次換向之后調用一個延時子程序,待延時結束后再次執行換向,這樣周而復始就可發出一定頻率的CP脈沖或換向周期。延時子程序的延時時間與換向程序所用的時間和,就是CP脈沖的周期。
2.3 鍵盤的工作方式
矩形鍵盤編程工作在鍵盤掃描輸入方式,其原理為在某一時刻只讓一條列線處于低電平,其余列線均處于高電平,則當這一列有鍵按下時,該鍵所在的行電平將會由高電平變為低電平,可判定該列相應的行有鍵按下。讀入鍵盤時具有軟件延時去抖動功能,避免誤觸發。
3 硬件設計
3.1 單片機最小系統電路的設計
控制芯片采用STC89C52,是STC公司生產的一種低功耗、高性能CMOS8位微控制器,具有8k字節Flash,512字節RAM, 32 位I/O 口線,看門狗定時器,內置4KB EEPROM,MAX810復位電路,3個16 位定時器/計數器,4個外部中斷,一個7向量4級中斷結構(兼容傳統51的5向量2級中斷結構),全雙工串行口。由于單片機內部的資源豐富,性價比高,能夠滿足該設計的要求,而且減少了硬件電路的設計,提高了工作效率。單片機的外部引腳定義如圖所示:
復位電路采用手動按鍵復位方式。當接通電源的瞬間,RST端與VCC同電位,隨著電容上的電壓逐漸上升,RST端的電壓逐漸下降,于是在RST端便形成了一個正脈沖,只要該正脈沖的寬度持續兩個機器周期的高電平,就可實現系統自動復位。
時鐘電路采用的是內部時鐘方式。晶振電路是由兩個30PF的電容和一個12M的晶體振蕩器組成的,兩端分別跨接在單片機的XTAL1和XTAL2的兩個端口上。
3.2 顯示與按鍵處理電路的設計
為實現交互,該系統設計擴展了獨立鍵盤、4x4按鈕矩陣鍵盤和8段LED數碼管,可手動直接操作該控制裝置。
系統上電后,通過獨立鍵盤輸入步進電機的啟停和轉向,矩陣鍵盤控制電機轉速,由LED管顯示步進電機的轉速和轉向。鍵盤的輸入和LED管的輸出由8279進行控制,減少單片機工作負擔。
數碼管采用74LS138進行硬件譯碼,并進行動態顯示,其原理為所有LED的段選線共同連接在一起共用一個 8位I/O口,而每個LED的位選分別由一根相應的I/O口線控制。因此必須采用動態掃描顯示方式,每一個時刻只選通其中一個LED,同時在段選口送出該位LED的字型碼。
矩形鍵盤編程工作在鍵盤掃描輸入方式,其原理為在某一時刻只讓一條列線處于低電平,其余列線均處于高電平,則當這一列有鍵按下時,該鍵所在的行電平將會由高電平變為低電平,可判定該列相應的行有鍵按下。讀入鍵盤時具有軟件延時去抖動功能,避免誤觸發。
3.3 步進電機及其驅動電路的設計
步進電機采用28BYJ-48,該電機為四相五線制,是可將電脈沖轉化為角位移的執行機構。當步進驅動模塊接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的步進角。通過控制脈沖個數可以控制角位移量,從而達到準確定位的目的;通過控制脈沖頻率可以控制電機轉動的速度和加速度,從而達到調速的目的。
每一個脈沖信號對應步進電機的某一相或兩相繞組的通電狀態改變一次,四相步進電機可以在不同的通電方式下運行,常見的通電方式有四拍,雙四拍,八拍,本設計采用八拍。
步進電機的驅動模塊采用ULN2003D,是高耐壓、大電流復合晶體管陣列,由七個硅NPN 復合晶體管組成,每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據。
3.4電氣原理圖
4 軟件設計
本實驗中設立電機啟停標志位和轉向標志位,采用兩個外部中斷來改變標志位,主程序識別到不同的標志位會改變電機的運行模式,同時采用定時器中斷鍵盤掃描的方式讀取用戶輸入的速度值,并在數碼管中顯示。
4.1 流程圖
4.2 源程序
#include <reg52.h> typedef unsigned char uchar; uchar direction = 0; //0為正轉,1為反轉 uchar onoff = 0; //關為0,開為1 uchar index = 0; //通過index指示電機轉動,八拍 uchar tmp; uchar keyval; sbit P14=P1^4; sbit P15=P1^5; sbit P16=P1^6; sbit P17=P1^7; sbit P22=P2^2; sbit P23=P2^3; sbit P24=P2^4; uchar code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數字0~9的段碼 unsigned char code beatCode[ ] = { 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; unsigned char code beatCode_r[ ] = { 0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};void delay(unsigned int i)//延時 {while(--i); }void led_delay(void)//數碼管動態掃描延時 {uchar j; for(j=0;j<200;j++) ;}void display(uchar k)//按鍵值的數碼管顯示子程序 {P22=1; P23=1;P24=1; P0=table[k/10]; led_delay(); P22=0; P23=1;P24=1; P0=table[k%10]; led_delay(); }void delay20ms(void)//軟件延時子程序 {uchar i,j; for(i=0;i<100;i++) for(j=0;j<60;j++);}void main(){/* LED */P0 = 0xff;/* 初始化中斷 */EA = 1;EX0 = 1; //要用到的中斷是兩個外部中斷和定時器中斷0IT0 = 1;EX1 = 1;IT1 = 1;/* 定時器0 */ET0=1; TMOD=0x01; TH0=(65536-10000)/256; //65536-500TL0=(65536-10000)%256; TR0=1; keyval=0x00; while(1){display(keyval);if(onoff==1){if(direction==0){tmp = P1; //讀取端口值tmp = tmp & 0xF0; //高4位不變tmp = tmp | beatCode[index]; //低四位變為相應節拍(低四位與電機相連)P1 = tmp; //輸出時序index++; index= index & 0x07; //準備輸出下一節拍delay(keyval*40); //max speed standard:150 延遲越小(脈沖間隔越小)速度越快}else if(direction==1){P2=0X00; //NEWtmp = P1;tmp = tmp & 0xF0;tmp = tmp | beatCode_r[index];P1 = tmp;index++;index= index & 0x07;delay(keyval*40); }} } } void Stop()interrupt 0 //k3 電機啟停 {onoff++;if (onoff > 1)onoff = 0; } void int1()interrupt 2 //k4 按一下控制電機反轉,再按正轉 {direction++;if (direction > 1)direction = 0; }void time1_interserve(void) interrupt 1 //鍵盤掃描中斷(定時器0) {TR0=0; P1=0xf0; if((P1&0xf0)!=0xf0) delay20ms(); if((P1&0xf0)!=0xf0) {P1=0xfe; if(P14==0) keyval=1; if(P15==0) keyval=2; if(P16==0) keyval=3; if(P17==0) keyval=4; P1=0xfd; if(P14==0) keyval=5; if(P15==0) keyval=6; if(P16==0) keyval=7; if(P17==0) keyval=8; P1=0xfb; if(P14==0) keyval=9; if(P15==0) keyval=10; if(P16==0) keyval=11; if(P17==0) keyval=12; P1=0xf7; if(P14==0) keyval=13; if(P15==0) keyval=14; if(P16==0) keyval=15; if(P17==0) keyval=16; }TR0=1; TH0=(65536-10000)/256; TL0=(65536-10000)%256; }5 調試中出現的問題及解決的辦法
5.1 步進電機抖動但不旋轉
推測可能的原因:
1.兩個脈沖間隔太小導致力矩變小無法旋轉:當步進電機轉動時,電機各相繞組的電感將形成一個反向電動勢;頻率越高,反向電動勢越大。在它的作用下,電機隨頻率(或速度)的增大而相電流減小,從而導致力矩下降。
解決辦法:增加延時
2.電機的通電時序表有錯誤:四相步進電機驅動方式有四拍,雙四拍,八拍,通電順序錯誤會導致電機運行異常
解決辦法:檢查時序表
3程序問題
解決辦法:將單獨的控制電機轉動的程序提取測試。若正常則擴大程序提取范圍,若異常則進行修改
4電機損壞
解決辦法:當上述原因不成立時,考慮更換電機
根據上述羅列順序進行測試,發現為程序以及時序表問題,查閱資料進行表的修改,并重新編寫程序后進行測試,電機運轉正常。
5.2外部中斷無法控制啟停
推測可能的原因:
解決辦法:重新檢查是否正常初始化和開放中斷,外部中斷是否改變標志,主程序是否正常識別標志
按照上述羅列順序進行測試,發現中斷運行正常,則歸類為程序錯誤,排查錯誤時發現將語句onoff==1寫為onoff=1,導致程序不能正常運行。
6 參考資料
[1]高玉芹.單片機原理與應用及C51編程技術[M].北京:機械工業出版社,2017.
[2]張元良.單片機開發技術實例[M].北京:機械工業出版社,2010.
總結
以上是生活随笔為你收集整理的步进电机控制器的设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scons环境搭建和编译原理概述及嵌入式
- 下一篇: vad唤醒算法_唤醒算法经济后公司需要考