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