| 5 | 1/1 | 返回列表 |
| 查看: 1075 | 回復(fù): 2 | |||
| 當(dāng)前只顯示滿足指定條件的回帖,點擊這里查看本話題的所有回帖 | |||
liweicangz鐵桿木蟲 (小有名氣)
|
[交流]
【求助】單片機控制步進電機時遇到的問題
|
||
|
大家好! 我是單片機的初學(xué)者。 最近想使用單片機控制步進電機的運行。 硬件上的結(jié)構(gòu)是這樣的:步進電機是4相電機,4根引線接到驅(qū)動板上,驅(qū)動板上的芯片是東芝的TA8435H,驅(qū)動板本身12V開關(guān)電源供電,驅(qū)動板還留了5個引腳,分別標(biāo)記5V、GND、CK、CW、EN。我用的單片機是STC89C52RC,將單片機上的VCC與驅(qū)動板5V相連,GND相連,P0端口的P0.0、P0.1、P0.2三個引腳接CK、CW、EN。 我使用Keil軟件編了一個控制的程序,是用C語言寫的,具體內(nèi)容為: /*----------------步進電機控制程序-----------------*/ #include #define uchar unsigned char #define uint unsigned int //定義引腳 sbit CW=P0^0; //正反轉(zhuǎn) sbit CLK=P0^1; //方波信號 sbit EN=P0^2; //使能,開關(guān) /*------------------------------------------------ 函數(shù)聲明 ------------------------------------------------*/ uchar keyscan(void);//鍵盤掃描 void delay(uint i); //延時程序 /*------------------------------------------------ 主函數(shù) ------------------------------------------------*/ void main() { int delay_time1=500; int delay_time2=500; int det_time=25; uchar key; int i=0; while(1) { CW=0; CLK=0; EN=0;//電機參數(shù)賦初值 delay_time1=delay_time2; key=keyscan(); //調(diào)用鍵盤掃描, switch(key) { case 0x7e: while(1) { CW=0; //正轉(zhuǎn) CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 } break; case 0x7d: while(1) { CW=1; //反轉(zhuǎn) CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 } break; case 0x77:delay_time2=500;break;//獲得一個基本速度值 case 0xbe:delay_time2=delay_time2-det_time;break;//加速,停止時起作用 case 0xbd:delay_time2=delay_time2+det_time;break;//減速,停止時起作用 default: break; } } } /*------------------------------------------------ 鍵盤掃描程序 ------------------------------------------------*/ uchar keyscan(void) //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 { uchar cord_h,cord_l;//行列值中間變量 P3=0x0f; //行線輸出全為0 cord_h=P3&0x0f; //讀入列線值 if(cord_h!=0x0f) //先檢測有無按鍵按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //讀入列線值 P3=cord_h|0xf0; //輸出當(dāng)前列線值 cord_l=P3&0xf0; //讀入行線值 return(cord_h+cord_l);//鍵盤最后組合碼值 } }return(0xff); //返回該值 } /*------------------------------------------------ 延時程序 ------------------------------------------------*/ void delay(uint i) //延時函數(shù) { while(i--); } 以上是C程序,0x7e等對應(yīng)單片機開發(fā)板上矩陣鍵盤上的按鍵0、 1、 2、 3、 4、 5,我編譯之后沒有錯誤,生成的HEX文件,燒寫到單片機里。 原本的想法是0鍵按下正轉(zhuǎn)連續(xù)運行,1鍵反轉(zhuǎn)連續(xù)運行,2鍵停止,3鍵設(shè)置初始值,4鍵加速,5鍵減速。 實際的情況是,不使用4鍵、5鍵的情況下一切正常,符合預(yù)期?墒前催^4鍵和5鍵之后,步進電機的轉(zhuǎn)速就變得極慢。我如果程序上不使用加、減變量改變延遲時間,而是直接賦一個其他的固定值的話是沒有問題的。 請教大家造成步進電機運行變慢的原因是什么?怎么寫程序能實現(xiàn)我原來的功能呢? |
銀蟲 (小有名氣)

|
不是很懂單片機,不過樓主的程序看起來怪怪的。 有幾個問題樓主能不能解釋下? 1、CLK、CW和EN是做什么用的啊? 2、delay_time和轉(zhuǎn)速有什么關(guān)系?是不是delay_time越大就轉(zhuǎn)的越慢? 3、程序運行時對鍵盤的掃描時間是多少?也就是:delay(100) 是多長時間?當(dāng)keyscan()=0xbe或0xbd時,main()函數(shù)中最外層的while循環(huán),執(zhí)行一次是多長時間? 下面是我的猜測: 如果delay_time越大就轉(zhuǎn)的越慢,并且main函數(shù)中while循環(huán)的時間很短(也就是對鍵盤的掃描頻率很高)的話,那可能就是溢出了。 main函數(shù)中的delay_time是int類型的,如果while循環(huán)的時間很短,那么按4鍵很短的時間case 0xbe就可能會執(zhí)行很多遍,delay_time2就可能<0。比如程序20ms就掃描一次,按4鍵1s后放開,case 0xbe就被執(zhí)行了50次,delay_time就變成了-750。 delay()函數(shù)的參數(shù)是uint型的,把delay_time當(dāng)參數(shù)傳給delay()時,會把delay_time由int型轉(zhuǎn)換成uint型。如果delay_time<0,轉(zhuǎn)換成uint型就是一個很大的數(shù)了(數(shù)值要看int的位數(shù)了,假設(shè)是16位,int的-750轉(zhuǎn)換成uint就是64768了)。 同樣道理,按5鍵的話,delay_time可能變成一個很大的正數(shù),如果溢出的話,也可能變成負數(shù)。 |

| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 一志愿華中科技大學(xué),080502,354分求調(diào)劑 +4 | 守候夕陽CF 2026-03-18 | 4/200 |
|
|---|---|---|---|---|
|
[考研] 一志愿吉林大學(xué)材料學(xué)碩321求調(diào)劑 +4 | Ymlll 2026-03-18 | 6/300 |
|
|
[考研] 能源材料化學(xué)課題組招收碩士研究生8-10名 +4 | 脫穎而出 2026-03-16 | 10/500 |
|
|
[考研] 0703化學(xué)調(diào)劑 +4 | pupcoco 2026-03-17 | 7/350 |
|
|
[考研] 材料,紡織,生物(0856、0710),化學(xué)招生啦 +3 | Eember. 2026-03-17 | 9/450 |
|
|
[考研] 334求調(diào)劑 +3 | 志存高遠意在機?/a> 2026-03-16 | 3/150 |
|
|
[考研] 考研求調(diào)劑 +3 | 橘頌. 2026-03-17 | 4/200 |
|
|
[考研] 332求調(diào)劑 +6 | Zz版 2026-03-13 | 6/300 |
|
|
[考研] 26考研求調(diào)劑 +6 | 丶宏Sir 2026-03-13 | 6/300 |
|
|
[考研] 211本,11408一志愿中科院277分,曾在中科院自動化所實習(xí) +6 | Losir 2026-03-12 | 7/350 |
|
|
[考研] 304求調(diào)劑 +5 | 素年祭語 2026-03-15 | 5/250 |
|
|
[考研] 085600調(diào)劑 +5 | 漾漾123sun 2026-03-12 | 6/300 |
|
|
[考研] 285求調(diào)劑 +6 | ytter 2026-03-12 | 6/300 |
|
|
[考研] 294求調(diào)劑 +3 | Zys010410@ 2026-03-13 | 4/200 |
|
|
[考研] 288求調(diào)劑 +4 | 奇點0314 2026-03-14 | 4/200 |
|
|
[考研] 中科大材料專碩319求調(diào)劑 +3 | 孟鑫材料 2026-03-13 | 3/150 |
|
|
[考研] 材料與化工(0856)304求B區(qū)調(diào)劑 +6 | 邱gl 2026-03-12 | 7/350 |
|
|
[考研] 求材料調(diào)劑 085600英一數(shù)二總分302 前三科235 精通機器學(xué)習(xí) 一志愿哈工大 +4 | 林yaxin 2026-03-12 | 4/200 |
|
|
[考研] 308求調(diào)劑 +3 | 是Lupa啊 2026-03-12 | 3/150 |
|
|
[考研] 333求調(diào)劑 +3 | 152697 2026-03-12 | 4/200 |
|