|
上次做了PWM驅(qū)動電機(jī),平衡小車光是用MPU6050做的角度環(huán)控制不足以滿足對穩(wěn)定性的要求,所以要加上速度環(huán)控制,需要采集電機(jī)運(yùn)行的速度,喵嗚平衡車上電機(jī)所帶的是霍爾傳感器,電機(jī)帶動輪子轉(zhuǎn)一圈,共輸出374個脈沖信號,我們只需要將脈沖信號讓單片機(jī)采集回來,就可計(jì)算出電機(jī)的轉(zhuǎn)速,碼盤的輸出分a,b兩相,主板上分別將兩個電機(jī)的兩相輸出接到了int0,time3,int1,time4引腳。所以我們可以使用計(jì)數(shù)器采集數(shù)據(jù),也可以用外部中斷采集。
喵嗚的程序使用的是計(jì)數(shù)器采集電機(jī)的脈沖,使用計(jì)數(shù)器采集脈沖,外部引腳接收到一個脈沖,計(jì)數(shù)器就會加1,在程序中只需讀取計(jì)數(shù)器的數(shù)值便可得到脈沖的個數(shù),使用計(jì)數(shù)器3,4需要進(jìn)行如下配置
void Time3And4Init()
{
T4T3M |=0xcc; //T3T4控制寄存器允許T3T4做計(jì)數(shù)器運(yùn)行
IE2 &=0x1F; //禁止定時器3,4產(chǎn)生中斷
}
在初始化后,計(jì)數(shù)器就開始了運(yùn)作了,在使用的時候,我們只需讀取計(jì)數(shù)器的高8位和低8位寄存器,
將高8位左移8位后加上低8位
i=(T3H<<8)+T3L;
j=(T4H<<8)+T4L;
這就將數(shù)據(jù)讀回去了,然后需要將計(jì)數(shù)器清零在清零前先關(guān)閉計(jì)數(shù)器嗎,然后再啟動
T4T3M &=0x77; //關(guān)閉定時器
T4H=T4L=0; //計(jì)數(shù)器清零
T3H=T3L=0; //計(jì)數(shù)器清零
T4T3M |= 0xCC; //啟動計(jì)數(shù)器
然后這就是計(jì)數(shù)器采集電機(jī)的方法了。
下面介紹下我寫的使用外部中斷采集脈沖的程序,這里我們使用int0和int1進(jìn)行采集
外部中斷配置起來更加的方便,首先int0和int1具有兩種出發(fā)方式,0上升沿和下降沿都觸發(fā),1僅下降沿觸發(fā),在這里我們使用僅下降沿出發(fā)方式
例如我們配置int0,
P32=1;
IT0=1; //設(shè)置中斷類型,僅下降沿觸發(fā)
EX0=1; //int0中斷使能
EA=1; //開總中斷
這就完成了配置,下面編寫終端處理函數(shù),int0的中斷序號為0
void exint0() interrupt 0
{
Mflag++;
}
當(dāng)int0引腳每檢測的一個下降沿,就會進(jìn)去一次中斷,這樣我們就可以采集到脈沖的個數(shù)了,int1與int0是一樣的,不過對于平衡車中將會世道定時器中斷,當(dāng)一個程序中的中斷多的時候就是一個很頭疼的問題了,在我寫完數(shù)據(jù)采集后,我就寫了一個測速的程序,里面就用到time0的定時器中斷進(jìn)行即使,結(jié)果在中的配置上出現(xiàn)了問題,導(dǎo)致我查了很久。所以還是要合理的去使用中斷,
下面負(fù)上我寫的幾個程序,
INT0&INT1getMot.zip
(41.44 KB, 下載次數(shù): 28)
2016-1-29 21:25 上傳
點(diǎn)擊文件名下載附件
time4&3getMot.zip
(42.08 KB, 下載次數(shù): 26)
2016-1-29 21:25 上傳
點(diǎn)擊文件名下載附件
下一個
MPU6050數(shù)據(jù)采集
|
|