轉是轉了,但是不是感覺有點不太對勁呢?太慢了?別急,咱們繼續(xù)。根據(jù)本章開頭講解的原理,八拍模式時,步進電機轉過一圈是需要64個節(jié)拍,而我們程序中是每個節(jié)拍持續(xù) 2 ms,那么轉一圈就應該是 128 ms,即1秒鐘轉7圈多,可怎么看上去它好像是7秒多才轉了一圈呢?
那么,是時候來了解“永磁式減速步進電機”中這個“減速”的概念了。圖9-7是這個 28BYJ-48 步進電機的拆解圖,從圖中可以看到,位于最中心的那個白色小齒輪才是步進電機的轉子輸出,64個節(jié)拍只是讓這個小齒輪轉了一圈,然后它帶動那個淺藍色的大齒輪,這就是一級減速。大家看一下右上方的白色齒輪的結構,除電機轉子和最終輸出軸外的3個傳動齒輪都是這樣的結構,由一層多齒和一層少齒構成,而每一個齒輪都用自己的少齒層去驅動下一個齒輪的多齒層,這樣每2個齒輪都構成一級減速,一共就有了4級減速,那么總的減速比是多少呢?即轉子要轉多少圈最終輸出軸才轉一圈呢?
圖9-7 步進電機內部齒輪示意圖
回頭看一下電機參數(shù)表中的減速比這個參數(shù)吧——1:64,轉子轉64圈,最終輸出軸才會轉一圈,也就是需要6464=4096個節(jié)拍輸出軸才轉過一圈,2 ms4096=8192 ms,8秒多才轉一圈呢,是不是跟剛才的實驗結果正好吻合了?4096個節(jié)拍轉動一圈,那么一個節(jié)拍轉動的角度——步進角度就是360/4096,看一下表中的步進角度參數(shù)5.625/64,算一下就知道這兩個值是相等的,一切都已吻合了。
關于基本的控制原理本該到這里就全部結束了,但是,我們希望大家都能培養(yǎng)一種“實踐是檢驗真理的唯一標準”的思維方式!回想一下,步進電機最大的特點是什么?精確控制轉動量!那么我們是不是應該檢驗一下它到底是不是能精確呢?精確到什么程度呢?怎么來檢驗呢?讓它轉過90度,然后量一下準不準?也行,但是如果它只差了1度甚至不到1度,你能準確測量出來嗎?在沒有精密儀器的情況很難。我們還是讓它多轉幾個整圈,看看它最后停下的位置還是不是原來的位置。對應的,我們把程序修改一下,以方便控制電機轉過任意的圈數(shù)。
#includevoidTurnMotor(unsignedlongangle);voidmain(){TurnMotor(360*25);//360度*25,即25圈while(1);}/*軟件延時函數(shù),延時約2ms*/voiddelay(){unsignedinti=200;while(i--);}/*步進電機轉動函數(shù),angle-需轉過的角度*/voidTurnMotor(unsignedlongangle){unsignedchartmp;//臨時變量unsignedcharindex=0;//節(jié)拍輸出索引unsignedlongbeats=0;//所需節(jié)拍總數(shù)//步進電機節(jié)拍對應的IO控制代碼unsignedcharcodeBeatCode[8]={0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6};//計算需要的節(jié)拍總數(shù),4096拍對應一圈beats=(angle*4096)/360;//判斷beats不為0時執(zhí)行循環(huán),然后自減1while(beats--){tmp=P1;//用tmp把P1口當前值暫存tmp=tmp&0xF0;//用&操作清零低4位tmp=tmp"BeatCode[index];//用|操作把節(jié)拍代碼寫到低4位P1=tmp;//把低4位的節(jié)拍代碼和高4位的原值送回P1index++;//節(jié)拍輸出索引遞增index=index&0x07;//用&操作實現(xiàn)到8歸零delay();//延時2ms,即2ms執(zhí)行一拍}P1=P1|0x0F;//關閉電機所有的相}
上述程序中,我們先編寫了一個控制電機轉過指定角度的函數(shù),這個角度值由函數(shù)的形式參數(shù)給出,然后在主函數(shù)中就可以方便的通過更改調用時的實際參數(shù)來控制電機轉過任意的角度了。我們用了36025,也就是25圈,當然你也可以隨意改為其它的值,看看是什么結果。我們的程序會執(zhí)行258=200秒的時間,先記下輸出軸的初始位置,然后上電并耐心等它執(zhí)行完畢,看一下,是不是??有誤差?怎么回事,哪兒出問題了,不是說能精確控制轉動量嗎?
這個問題其實是出在了減速比上,再來看一下,廠家給出的減速比是1:64,不管是哪個廠家生產(chǎn)的電機,只要型號是 28BYJ-48,其標稱的減速比就都是1:64。但實際上呢?經(jīng)過我們的拆解計算發(fā)現(xiàn):真實準確的減速比并不是這個值1:64,而是1:63.684!得出這個數(shù)據(jù)的方法也很簡單,實際數(shù)一下每個齒輪的齒數(shù),然后將各級減速比相乘,就可以得出結果了,實測的減速比為(32/9)(22/11)(26/9)(31/10)≈63.684,從而得出實際誤差為0.0049,即約為百分之0.5,轉100圈就會差出半圈,那么我們剛才轉了25圈,是不是就差了八分之一圈了,也就是45度,看一下剛才的誤差是45度吧。那么按照1:63.684 的實際減速比,可以得出轉過一圈所需要節(jié)拍數(shù)是6463.684≈4076。那么就把上面程序中電機驅動函數(shù)里的4096改成4076再試一下吧。是不是看不出絲毫的誤差了?但實際上誤差還是存在的,因為上面的計算結果都是約等得出的,實際誤差大約是0.000056,即萬分之0.56,轉一萬圈才會差出半圈,已經(jīng)可以忽略不計了。
那么廠家的參數(shù)為什么會有誤差呢?難道廠家不知道嗎?要解釋這個問題,我們得回到實際應用中,步進電機最通常的目的是控制目標轉過一定的角度,通常都是在360度以內的,而這個 28BYJ-48 最初的設計目的是用來控制空調的扇葉的,扇葉的活動范圍是不會超過180度的,所以在這種應用場合下,廠商給出一個近似的整數(shù)減速比1:64已經(jīng)足夠精確了,這也是合情合理的。然而,正如我們的程序那樣,我們不一定是要用它來驅動空調扇葉,我們可以讓它轉動很多圈來干別的,這個時候就需要更為精確的數(shù)據(jù)了,這也是我們希望同學們都能了解并掌握的,就是說我們要能自己“設計”系統(tǒng)并解決其中發(fā)現(xiàn)的問題,而不要被所謂的“現(xiàn)成的方案”限制住思路。