標(biāo)題: STM32控制步進(jìn)電機(jī)程序+詳細(xì)解說(shuō)資料(通俗易懂) [打印本頁(yè)]

作者: 尼古拉斯    時(shí)間: 2019-4-16 09:32
標(biāo)題: STM32控制步進(jìn)電機(jī)程序+詳細(xì)解說(shuō)資料(通俗易懂)

步進(jìn)電機(jī)(也稱脈沖電機(jī))(將電脈沖轉(zhuǎn)換為相應(yīng)的角位移或線位移的電磁機(jī)械裝置,具有快速啟動(dòng),停能力,在電機(jī)的負(fù)荷不超過(guò)它能提供的動(dòng)態(tài)轉(zhuǎn)矩時(shí),可以通過(guò)輸入脈沖來(lái)控制它在一瞬間的啟動(dòng)或者停止。在非超載的情況下,步距角和轉(zhuǎn)速只和輸入的脈沖頻率有關(guān),和環(huán)境溫度,氣壓,振動(dòng)無(wú)關(guān),也不受電網(wǎng)電壓的波動(dòng)和負(fù)載變化的影響,因此,控制較為精準(zhǔn))即給電機(jī)一個(gè)脈沖信號(hào),電機(jī)則轉(zhuǎn)過(guò)一個(gè)步距角


步進(jìn)電機(jī)是一種感應(yīng)電機(jī),它的工作原理:利用電子電路,將直流電變成分時(shí)供電的,多相時(shí)序控制電流,用這種電流為步進(jìn)電機(jī)供電,步進(jìn)電機(jī)才能正常工作,驅(qū)動(dòng)器就是為步進(jìn)電機(jī)分時(shí)供電的,多相時(shí)序控制器,就是說(shuō):必須用由雙環(huán)形脈沖信號(hào)功率驅(qū)動(dòng)電路等組成的控制系統(tǒng)方可使用。


步距角:控制系統(tǒng)每發(fā)一個(gè)步進(jìn)脈沖信號(hào),電機(jī)所轉(zhuǎn)動(dòng)的角度。電機(jī)出廠時(shí)給了一個(gè)步距角的值,如:86BYG250A型      電機(jī)的值為0.9、1.8(表示半步工作時(shí)為0.9,整步為1.8),被稱之為“電機(jī)的固有步距角”,但是不一定是      電機(jī)實(shí)際工作時(shí)的真正步距角,真正的步距角和驅(qū)動(dòng)器有關(guān)


相數(shù):電機(jī)內(nèi)部的線圈組數(shù),目前常用的有二相,三相,四相,五相步進(jìn)電機(jī)。電機(jī)相數(shù)不同,其步距角也就不同了,  一般二相電機(jī)的步距角為0.9/1,8,三相為0.36/0.72,五相為0.36/0.72。在沒(méi)有細(xì)分驅(qū)動(dòng)器的情況下,用戶主要 靠選擇不同相數(shù)的步進(jìn)電機(jī)來(lái)滿足自己步距角的要求。如果使用細(xì)分驅(qū)動(dòng)器,那么相數(shù)好像也就沒(méi)有了意義

拍數(shù):完成一個(gè)磁場(chǎng)周期性變化所需脈沖數(shù)或?qū)щ姞顟B(tài),或指電機(jī)轉(zhuǎn)過(guò)一個(gè)步距角所需脈沖數(shù)。以如下的四相電機(jī)為            例,有四相四拍運(yùn)行方式,AB-BC-CD-DA-AB;四相八拍:A-AB-B-BC-C-CD-D-DA-A


失步:電機(jī)運(yùn)轉(zhuǎn)時(shí)運(yùn)轉(zhuǎn)的步數(shù)不等于理論上的步數(shù),稱之為失步


開環(huán)控制與閉環(huán)控制:(主要看系統(tǒng)中有沒(méi)有反饋環(huán)節(jié))(反饋指的是動(dòng)作所引起的效果)

(反饋簡(jiǎn)單的理解就是:“你打了別人一巴掌,我們看到了它的臉是紅的,嗯嗯,這就是眼睛所得到的反饋”)

閉環(huán)控制:存在反饋環(huán)節(jié)的控制,就是當(dāng)前的系統(tǒng)能夠?qū)崟r(shí)的檢測(cè)控制的輸出結(jié)果,并將檢測(cè)到的信息通過(guò)反饋環(huán)節(jié)反映到輸入端,調(diào)整輸入量,達(dá)到修正控制誤差,提高控制精度的目的,(對(duì)外部擾動(dòng)和系統(tǒng)參數(shù)變化不敏感)如:

(閉環(huán))

全自動(dòng)洗衣機(jī),給洗衣機(jī)加水時(shí),里邊有一個(gè)紅外傳感器,掃描到水位高低,當(dāng)水位合適時(shí),洗衣機(jī)自動(dòng)停止加水


家用空調(diào)根據(jù)傳感器采集到當(dāng)前的溫度,然后比較設(shè)定溫度,通過(guò)設(shè)定指令,控制室內(nèi)外機(jī)的工作情況,改變頻率,壓縮機(jī)的轉(zhuǎn)速等進(jìn)行簡(jiǎn)單的調(diào)節(jié),然后不斷地進(jìn)行控制


尋跡小車時(shí),兩邊的紅外傳感器不斷的檢測(cè)黑線,將返回的結(jié)果輸入到相應(yīng)i/o口上,我們對(duì)這些i/o口進(jìn)行中斷檢測(cè)就可以知道,當(dāng)前時(shí)刻的位置,然后可以執(zhí)行相應(yīng)的操作(左轉(zhuǎn),右轉(zhuǎn));


調(diào)節(jié)平衡天平的時(shí)候,其中一種方法就是利用mpu6050獲取當(dāng)前所處位置的角度,調(diào)用PID算法,對(duì)當(dāng)前的位置或者角度進(jìn)行處理,然后對(duì)調(diào)整后的角度再次進(jìn)行反饋處理

(家用空調(diào)調(diào)節(jié)溫度)

家用空調(diào)調(diào)節(jié)指定的溫度,靠的是電子傳感器,(電子傳感器就是一個(gè)熱敏電阻,不同的溫度會(huì)有不同的阻值),利用也可以理解為電子膨脹,不同的溫度會(huì)有不同的阻值。利用對(duì)入風(fēng)口的空氣進(jìn)行取樣,把數(shù)據(jù)傳輸?shù)娇刂瓢迳,然后,在與設(shè)定的溫度進(jìn)行比較,產(chǎn)生一個(gè)指令來(lái)實(shí)現(xiàn)控制。(制冷的話,比較之后:輸出室內(nèi)風(fēng)機(jī)和室外機(jī)的開機(jī)指令,內(nèi)外機(jī)開始工作(室外機(jī)包括壓縮機(jī),室外風(fēng)機(jī),四通閥等部件),工作一定溫度的話,室內(nèi)溫度將會(huì):1,(定頻空調(diào))達(dá)到設(shè)定值,室外機(jī)停止工作,室內(nèi)機(jī)保持工作,保證空氣循環(huán),當(dāng)室內(nèi)溫度逐漸上升,大于設(shè)定值2-3度時(shí),室外機(jī)重新啟動(dòng)制冷,室內(nèi)溫度將又開始下降,重復(fù)這個(gè)過(guò)程,室內(nèi)溫度就能保持在設(shè)定溫度值上下1度左右范圍內(nèi)波動(dòng); 2,(變頻空調(diào))接近設(shè)定值,室外機(jī)的變頻板輸出的頻率下降,壓縮機(jī)轉(zhuǎn)速下降,制冷量也相應(yīng)降低,室內(nèi)溫度保持在與設(shè)定值相同的數(shù)值下。隨著室內(nèi)熱源的變化,室內(nèi)機(jī)溫度傳感器實(shí)時(shí)檢測(cè)溫度的變化,主控板輸出的控制信號(hào)使變頻器跟隨變化調(diào)節(jié)壓縮機(jī)工作頻率,從而改變瞬時(shí)制冷量,確保室內(nèi)溫度穩(wěn)定)



開環(huán)控制:不存在反饋環(huán)節(jié)的控制,也就是控制器與被控制對(duì)象間只有順序作業(yè)而無(wú)反方向聯(lián)系且控制單方向進(jìn)行,

                  ,無(wú)自動(dòng)糾偏能力,不用取輸出量變化信號(hào)控制輸入量。

                  

                   如:在開車的過(guò)程中,我們來(lái)控制方向盤

                   人工轉(zhuǎn)換電扇的檔位實(shí)現(xiàn)轉(zhuǎn)速的控制,不用反饋回來(lái)實(shí)際的轉(zhuǎn)速

                   給洗衣機(jī)加水時(shí):我們通過(guò)來(lái)觀察水位來(lái)確定什么時(shí)候關(guān)掉水龍頭

(所以,簡(jiǎn)單的說(shuō):就是看有沒(méi)有反饋:開環(huán)沒(méi)有,閉環(huán)有,對(duì)于用到機(jī)器上來(lái)說(shuō),每一件事都是有反饋的,只是情況不同而已,當(dāng)反饋是人自己來(lái)判斷的話,那么這個(gè)系統(tǒng)就是開環(huán)的,如果反饋是機(jī)器自己來(lái)判斷的話,那么這個(gè)系統(tǒng)就是閉環(huán)的)

從整體的角度來(lái)看:


單片機(jī)控制電機(jī)正轉(zhuǎn)源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"

  4. //引腳連接
  5. //IN1:PC3、IN2:PC2、IN3:PC0、IN4:PC13、

  6. //步進(jìn)電機(jī)初始化函數(shù)
  7. void Motor_Init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//開啟時(shí)鐘
  12.         
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  17.         
  18.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);//默認(rèn)低電平
  19.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  20.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  21.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  22.         
  23. }

  24. //步進(jìn)電機(jī)正轉(zhuǎn)函數(shù)(反轉(zhuǎn)參考51版本)
  25. void Motorcw(void)
  26. {
  27.         GPIO_SetBits(GPIOC,GPIO_Pin_13);//依次高電平輸出
  28.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  29.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  30.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  31.         delay_ms(10);
  32.         
  33.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  34.         GPIO_SetBits(GPIOC,GPIO_Pin_0);
  35.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  36.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  37.         delay_ms(10);
  38.         
  39.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  40.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  41.         GPIO_SetBits(GPIOC,GPIO_Pin_2);
  42.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  43.         delay_ms(10);
  44.         
  45.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  46.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  47.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  48.         GPIO_SetBits(GPIOC,GPIO_Pin_3);
  49.         delay_ms(10);
  50.         
  51. }

  52. int main(void)
  53. {
  54.         delay_init();//delay初始化函數(shù)
  55.         Motor_Init();
  56. while(1)
  57. {
  58.         Motorcw();
  59. }
  60. }
復(fù)制代碼

正轉(zhuǎn)代碼與芯片資料供大家學(xué)習(xí):
ULN2003步進(jìn)電機(jī)正轉(zhuǎn)代碼與資料.7z (577.56 KB, 下載次數(shù): 1160)


作者: 張先生一個(gè)人    時(shí)間: 2019-8-22 21:03
你好,請(qǐng)問(wèn)怎樣使57步進(jìn)電機(jī)旋轉(zhuǎn)方向發(fā)生改變?
我現(xiàn)在能驅(qū)動(dòng)電機(jī)逆時(shí)針旋轉(zhuǎn),要怎么做能使電機(jī)順時(shí)針旋轉(zhuǎn)呢?
我嘗試過(guò)改變DIR的輸入電平,但是并沒(méi)有發(fā)生改變。

作者: hujj    時(shí)間: 2019-8-23 10:34
張先生一個(gè)人 發(fā)表于 2019-8-22 21:03
你好,請(qǐng)問(wèn)怎樣使57步進(jìn)電機(jī)旋轉(zhuǎn)方向發(fā)生改變?
我現(xiàn)在能驅(qū)動(dòng)電機(jī)逆時(shí)針旋轉(zhuǎn),要怎么做能使電機(jī)順時(shí)針旋轉(zhuǎn) ...

改變時(shí)序就能控制正反轉(zhuǎn)。
作者: zp17777    時(shí)間: 2019-10-21 21:27
謝謝你分享的資料,感謝
作者: yjglan    時(shí)間: 2019-11-4 15:51
看到代碼眼前一亮
這樣就不需要 驅(qū)動(dòng)器了。
學(xué)習(xí)了
作者: zwl911124    時(shí)間: 2019-11-4 22:56
ths...
作者: yzh327    時(shí)間: 2019-11-16 17:57
樓主威武,感謝分享。
作者: 807964046    時(shí)間: 2019-11-19 08:16
感謝分享
作者: 4591314    時(shí)間: 2019-11-19 20:00
f407可以控制么?
作者: kxq    時(shí)間: 2019-12-11 19:19
請(qǐng)問(wèn)那四個(gè)引腳哪個(gè)是脈沖,哪個(gè)是方向
作者: kxq    時(shí)間: 2019-12-11 19:22
hujj 發(fā)表于 2019-8-23 10:34
改變時(shí)序就能控制正反轉(zhuǎn)。

請(qǐng)問(wèn)你有32控制步進(jìn)電機(jī)的程序嗎?

作者: Lee_2019    時(shí)間: 2019-12-14 23:31
有PID的嗎?
作者: 敲敲小木魚    時(shí)間: 2020-1-2 10:18
樓主威武,感謝分享。
作者: 花式虐狗    時(shí)間: 2020-1-2 16:59
樓主威武,感謝分享。
作者: venjo    時(shí)間: 2020-1-8 11:47
樓主威武,感謝分享。
作者: 00750    時(shí)間: 2020-1-19 09:38
我想下來(lái)看看
作者: 156450727    時(shí)間: 2020-1-31 11:19
謝謝你分享的資料
作者: 18710841730    時(shí)間: 2020-3-18 00:10
感謝分享

作者: yaoke7941    時(shí)間: 2020-3-19 10:59
謝謝分享,學(xué)習(xí)一下
作者: yaoke7941    時(shí)間: 2020-3-19 11:20
謝謝分享,學(xué)習(xí)一下
作者: liufeng180840    時(shí)間: 2020-3-23 08:52
謝謝分享,學(xué)習(xí)一下
作者: 海底奇?zhèn)b    時(shí)間: 2020-4-5 12:24
學(xué)習(xí)一下
作者: 華爾街神探    時(shí)間: 2020-5-14 22:42
不懂這個(gè)上位機(jī)的具體原理
作者: 時(shí)光LS    時(shí)間: 2020-5-30 09:44
厲害,感謝分享!
作者: bbcs852    時(shí)間: 2020-6-7 19:48
謝謝分享,學(xué)習(xí)一下
不知道怎么收藏主題,我從51開始轉(zhuǎn)STM32了
作者: 周凱    時(shí)間: 2020-6-15 10:29
正在學(xué)習(xí)STM32,剛好準(zhǔn)備找些例子來(lái)聯(lián)系下,看到樓主的帖子很實(shí)用,超級(jí)簡(jiǎn)單,非常感謝!!
作者: 15532112031    時(shí)間: 2020-7-3 11:19
驅(qū)動(dòng)模塊是什么
作者: LYT123456    時(shí)間: 2020-8-11 14:13
hujj 發(fā)表于 2019-8-23 10:34
改變時(shí)序就能控制正反轉(zhuǎn)。

反轉(zhuǎn):0001 0010 0100 1000
作者: 123456789zhangh    時(shí)間: 2020-9-14 13:27
如何控制進(jìn)行反轉(zhuǎn)
作者: 與我同在    時(shí)間: 2020-9-17 20:54
kxq 發(fā)表于 2019-12-11 19:22
請(qǐng)問(wèn)你有32控制步進(jìn)電機(jī)的程序嗎?

這不就是32的嗎

作者: 774278841    時(shí)間: 2020-9-22 22:18
還以為是A4988的驅(qū)動(dòng)了,2003啊
作者: WSZXAAA    時(shí)間: 2020-12-26 00:02
超級(jí)簡(jiǎn)單,非常感謝!!

作者: GlenXu    時(shí)間: 2021-2-22 20:41
浪費(fèi)資源,照這樣可以用更簡(jiǎn)單的數(shù)字電路搭一個(gè),連程序都不需要。
作者: lzlrsddz    時(shí)間: 2021-4-24 02:43
謝謝,正好需要,下載來(lái)看看
作者: suph007    時(shí)間: 2021-4-28 12:59
有其他更優(yōu)化的算法么?
作者: xcza    時(shí)間: 2021-5-5 10:42
kxq 發(fā)表于 2019-12-11 19:22
請(qǐng)問(wèn)你有32控制步進(jìn)電機(jī)的程序嗎?

他上面有連接
作者: 我為單片機(jī)哭泣    時(shí)間: 2021-5-17 15:42
張先生一個(gè)人 發(fā)表于 2019-8-22 21:03
你好,請(qǐng)問(wèn)怎樣使57步進(jìn)電機(jī)旋轉(zhuǎn)方向發(fā)生改變?
我現(xiàn)在能驅(qū)動(dòng)電機(jī)逆時(shí)針旋轉(zhuǎn),要怎么做能使電機(jī)順時(shí)針旋轉(zhuǎn) ...

57步進(jìn)電機(jī)該怎么連接呢
作者: stm32單片機(jī)哭哭    時(shí)間: 2021-6-11 13:34
周凱 發(fā)表于 2020-6-15 10:29
正在學(xué)習(xí)STM32,剛好準(zhǔn)備找些例子來(lái)聯(lián)系下,看到樓主的帖子很實(shí)用,超級(jí)簡(jiǎn)單,非常感謝!!

你好,請(qǐng)問(wèn)你調(diào)試出來(lái)了嗎?
作者: huand123    時(shí)間: 2021-6-18 10:40
有protues 仿真嗎
作者: huand123    時(shí)間: 2021-6-19 00:10
怎么連接啊,沒(méi)有原理圖或?qū)嵨飯D
作者: 996658355    時(shí)間: 2021-10-18 10:45
我為單片機(jī)哭泣 發(fā)表于 2021-5-17 15:42
57步進(jìn)電機(jī)該怎么連接呢

請(qǐng)問(wèn)你弄清楚了嗎?可以分享一下嗎?
作者: inacdgd    時(shí)間: 2021-10-20 09:08
基于正點(diǎn)原子開發(fā)板的一個(gè)實(shí)驗(yàn)例子,感謝分享!
作者: liudi2526    時(shí)間: 2021-11-19 10:02
言過(guò)其實(shí)!就是原子的例程嘛,哪有按鍵控制功能了?!扣幾個(gè)幣無(wú)所謂,這種做法令人反胃!
作者: xinamofu    時(shí)間: 2021-12-25 08:31
yjglan 發(fā)表于 2019-11-4 15:51
看到代碼眼前一亮
這樣就不需要 驅(qū)動(dòng)器了。
學(xué)習(xí)了

白亮了 ,去學(xué)點(diǎn)基礎(chǔ)的東西吧




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1