| 24小時熱門版塊排行榜 |
| 3 | 1/1 | 返回列表 |
| 查看: 1074 | 回復(fù): 2 | |||
liweicangz鐵桿木蟲 (小有名氣)
|
[交流]
【求助】單片機控制步進(jìn)電機時遇到的問題
|
|
大家好! 我是單片機的初學(xué)者。 最近想使用單片機控制步進(jìn)電機的運行。 硬件上的結(jié)構(gòu)是這樣的:步進(jìn)電機是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)容為: /*----------------步進(jìn)電機控制程序-----------------*/ #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鍵之后,步進(jìn)電機的轉(zhuǎn)速就變得極慢。我如果程序上不使用加、減變量改變延遲時間,而是直接賦一個其他的固定值的話是沒有問題的。 請教大家造成步進(jì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ù),如果溢出的話,也可能變成負(fù)數(shù)。 |

銀蟲 (小有名氣)

| 3 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 295求調(diào)劑 +3 | 一志愿京區(qū)211 2026-03-18 | 5/250 |
|
|---|---|---|---|---|
|
[教師之家] 焦慮 +8 | 水冰月月野兔 2026-03-13 | 12/600 |
|
|
[考研] 08工科 320總分 求調(diào)劑 +5 | 梨花珞晚風(fēng) 2026-03-17 | 5/250 |
|
|
[考研] 311求調(diào)劑 +6 | 26研0 2026-03-15 | 6/300 |
|
|
[考研] 085601材料工程專碩求調(diào)劑 +6 | 慕寒mio 2026-03-16 | 6/300 |
|
|
[考研] 材料專碩306英一數(shù)二 +10 | z1z2z3879 2026-03-16 | 13/650 |
|
|
[考研] 0703化學(xué)調(diào)劑 ,六級已過,有科研經(jīng)歷 +10 | 曦熙兮 2026-03-15 | 10/500 |
|
|
[考博] 環(huán)境領(lǐng)域全國重點實驗室招收博士1-2名 +3 | QGZDSYS 2026-03-13 | 5/250 |
|
|
[考研] 材料,紡織,生物(0856、0710),化學(xué)招生啦 +3 | Eember. 2026-03-17 | 9/450 |
|
|
[考研] 307求調(diào)劑 +3 | 冷笙123 2026-03-17 | 3/150 |
|
|
[考研] 278求調(diào)劑 +3 | Yy7400 2026-03-13 | 3/150 |
|
|
[考研] 一志愿,福州大學(xué)材料專碩339分求調(diào)劑 +3 | 木子momo青爭 2026-03-15 | 3/150 |
|
|
[考研] 321求調(diào)劑 +5 | 大米飯! 2026-03-15 | 5/250 |
|
|
[考研] 285求調(diào)劑 +6 | ytter 2026-03-12 | 6/300 |
|
|
[考研] 本科南京大學(xué)一志愿川大藥學(xué)327 +3 | 麥田耕者 2026-03-14 | 3/150 |
|
|
[考研] 289求調(diào)劑 +4 | 這么名字咋樣 2026-03-14 | 6/300 |
|
|
[考研] 297求調(diào)劑 +4 | 學(xué)海漂泊 2026-03-13 | 4/200 |
|
|
[考研] 281求調(diào)劑 +9 | Koxui 2026-03-12 | 11/550 |
|
|
[考研] 材料專碩350 求調(diào)劑 +4 | 王金科 2026-03-12 | 4/200 |
|
|
[考研] 085600材料與化工 309分請求調(diào)劑 +7 | dtdxzxx 2026-03-12 | 8/400 |
|