| 24小時(shí)熱門版塊排行榜 |
| 3 | 1/1 | 返回列表 |
| 查看: 1076 | 回復(fù): 2 | |||
liweicangz鐵桿木蟲(chóng) (小有名氣)
|
[交流]
【求助】單片機(jī)控制步進(jìn)電機(jī)時(shí)遇到的問(wèn)題
|
|
大家好! 我是單片機(jī)的初學(xué)者。 最近想使用單片機(jī)控制步進(jìn)電機(jī)的運(yùn)行。 硬件上的結(jié)構(gòu)是這樣的:步進(jìn)電機(jī)是4相電機(jī),4根引線接到驅(qū)動(dòng)板上,驅(qū)動(dòng)板上的芯片是東芝的TA8435H,驅(qū)動(dòng)板本身12V開(kāi)關(guān)電源供電,驅(qū)動(dòng)板還留了5個(gè)引腳,分別標(biāo)記5V、GND、CK、CW、EN。我用的單片機(jī)是STC89C52RC,將單片機(jī)上的VCC與驅(qū)動(dòng)板5V相連,GND相連,P0端口的P0.0、P0.1、P0.2三個(gè)引腳接CK、CW、EN。 我使用Keil軟件編了一個(gè)控制的程序,是用C語(yǔ)言寫(xiě)的,具體內(nèi)容為: /*----------------步進(jìn)電機(jī)控制程序-----------------*/ #include #define uchar unsigned char #define uint unsigned int //定義引腳 sbit CW=P0^0; //正反轉(zhuǎn) sbit CLK=P0^1; //方波信號(hào) sbit EN=P0^2; //使能,開(kāi)關(guān) /*------------------------------------------------ 函數(shù)聲明 ------------------------------------------------*/ uchar keyscan(void);//鍵盤掃描 void delay(uint i); //延時(shí)程序 /*------------------------------------------------ 主函數(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;//電機(jī)參數(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;//獲得一個(gè)基本速度值 case 0xbe:delay_time2=delay_time2-det_time;break;//加速,停止時(shí)起作用 case 0xbd:delay_time2=delay_time2+det_time;break;//減速,停止時(shí)起作用 default: break; } } } /*------------------------------------------------ 鍵盤掃描程序 ------------------------------------------------*/ uchar keyscan(void) //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 { uchar cord_h,cord_l;//行列值中間變量 P3=0x0f; //行線輸出全為0 cord_h=P3&0x0f; //讀入列線值 if(cord_h!=0x0f) //先檢測(cè)有無(wú)按鍵按下 { 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); //返回該值 } /*------------------------------------------------ 延時(shí)程序 ------------------------------------------------*/ void delay(uint i) //延時(shí)函數(shù) { while(i--); } 以上是C程序,0x7e等對(duì)應(yīng)單片機(jī)開(kāi)發(fā)板上矩陣鍵盤上的按鍵0、 1、 2、 3、 4、 5,我編譯之后沒(méi)有錯(cuò)誤,生成的HEX文件,燒寫(xiě)到單片機(jī)里。 原本的想法是0鍵按下正轉(zhuǎn)連續(xù)運(yùn)行,1鍵反轉(zhuǎn)連續(xù)運(yùn)行,2鍵停止,3鍵設(shè)置初始值,4鍵加速,5鍵減速。 實(shí)際的情況是,不使用4鍵、5鍵的情況下一切正常,符合預(yù)期?墒前催^(guò)4鍵和5鍵之后,步進(jìn)電機(jī)的轉(zhuǎn)速就變得極慢。我如果程序上不使用加、減變量改變延遲時(shí)間,而是直接賦一個(gè)其他的固定值的話是沒(méi)有問(wèn)題的。 請(qǐng)教大家造成步進(jìn)電機(jī)運(yùn)行變慢的原因是什么?怎么寫(xiě)程序能實(shí)現(xiàn)我原來(lái)的功能呢? |
金蟲(chóng) (職業(yè)作家)
|
不是很懂單片機(jī),不過(guò)樓主的程序看起來(lái)怪怪的。 有幾個(gè)問(wèn)題樓主能不能解釋下? 1、CLK、CW和EN是做什么用的? 2、delay_time和轉(zhuǎn)速有什么關(guān)系?是不是delay_time越大就轉(zhuǎn)的越慢? 3、程序運(yùn)行時(shí)對(duì)鍵盤的掃描時(shí)間是多少?也就是:delay(100) 是多長(zhǎng)時(shí)間?當(dāng)keyscan()=0xbe或0xbd時(shí),main()函數(shù)中最外層的while循環(huán),執(zhí)行一次是多長(zhǎng)時(shí)間? 下面是我的猜測(cè): 如果delay_time越大就轉(zhuǎn)的越慢,并且main函數(shù)中while循環(huán)的時(shí)間很短(也就是對(duì)鍵盤的掃描頻率很高)的話,那可能就是溢出了。 main函數(shù)中的delay_time是int類型的,如果while循環(huán)的時(shí)間很短,那么按4鍵很短的時(shí)間case 0xbe就可能會(huì)執(zhí)行很多遍,delay_time2就可能<0。比如程序20ms就掃描一次,按4鍵1s后放開(kāi),case 0xbe就被執(zhí)行了50次,delay_time就變成了-750。 delay()函數(shù)的參數(shù)是uint型的,把delay_time當(dāng)參數(shù)傳給delay()時(shí),會(huì)把delay_time由int型轉(zhuǎn)換成uint型。如果delay_time<0,轉(zhuǎn)換成uint型就是一個(gè)很大的數(shù)了(數(shù)值要看int的位數(shù)了,假設(shè)是16位,int的-750轉(zhuǎn)換成uint就是64768了)。 同樣道理,按5鍵的話,delay_time可能變成一個(gè)很大的正數(shù),如果溢出的話,也可能變成負(fù)數(shù)。 |

銀蟲(chóng) (小有名氣)

| 3 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 一志愿吉林大學(xué)材料學(xué)碩321求調(diào)劑 +5 | Ymlll 2026-03-18 | 8/400 |
|
|---|---|---|---|---|
|
[考研] 本科鄭州大學(xué)物理學(xué)院,一志愿華科070200學(xué)碩,346求調(diào)劑 +4 | 我不是一根蔥 2026-03-18 | 4/200 |
|
|
[考研] 能源材料化學(xué)課題組招收碩士研究生8-10名 +4 | 脫穎而出 2026-03-16 | 11/550 |
|
|
[考研] 0703化學(xué) 305求調(diào)劑 +4 | FY_yy 2026-03-14 | 4/200 |
|
|
[考研] 一志愿天大材料與化工(085600)總分338 +4 | 蔡大美女 2026-03-13 | 4/200 |
|
|
[考研] 311求調(diào)劑 +6 | 26研0 2026-03-15 | 6/300 |
|
|
[考研] 0703化學(xué)調(diào)劑 ,六級(jí)已過(guò),有科研經(jīng)歷 +10 | 曦熙兮 2026-03-15 | 10/500 |
|
|
[考研] 材料與化工求調(diào)劑 +6 | 為學(xué)666 2026-03-16 | 6/300 |
|
|
[考研] 本人考085602 化學(xué)工程 專碩 +16 | 不知道叫什么! 2026-03-15 | 18/900 |
|
|
[考研]
|
zhouzhen654 2026-03-16 | 3/150 |
|
|
[考研] 東南大學(xué)364求調(diào)劑 +5 | JasonYuiui 2026-03-15 | 5/250 |
|
|
[考研] 一志愿華中師范071000,325求調(diào)劑 +6 | RuitingC 2026-03-12 | 6/300 |
|
|
[考研] 327求調(diào)劑 +6 | 拾光任染 2026-03-15 | 11/550 |
|
|
[考研] 085601材料工程315分求調(diào)劑 +3 | yang_0104 2026-03-15 | 3/150 |
|
|
[考研] 080500,材料學(xué)碩302分求調(diào)劑學(xué)校 +4 | 初識(shí)可樂(lè) 2026-03-14 | 5/250 |
|
|
[考研] 265求調(diào)劑 +4 | 威化餅07 2026-03-12 | 4/200 |
|
|
[考研] 材料080500調(diào)劑求收留 +3 | 一顆meteor 2026-03-13 | 3/150 |
|
|
[考研] 材料與化工(0856)304求B區(qū)調(diào)劑 +6 | 邱gl 2026-03-12 | 7/350 |
|
|
[考研] 材料與化工求調(diào)劑一志愿 985 總分 295 +8 | dream…… 2026-03-12 | 8/400 |
|
|
[考研] 328化工專碩求調(diào)劑 +4 | 。,。,。,。i 2026-03-12 | 4/200 |
|