標(biāo)題:
基于平衡車主板電機脈沖采集----------moyuqilin
[打印本頁]
作者:
moyuqilin
時間:
2016-1-29 21:26
標(biāo)題:
基于平衡車主板電機脈沖采集----------moyuqilin
上次做了PWM驅(qū)動電機,平衡小車光是用MPU6050做的角度環(huán)控制不足以滿足對穩(wěn)定性的要求,所以要加上速度環(huán)控制,需要采集電機運行的速度,喵嗚平衡車上電機所帶的是霍爾傳感器,電機帶動輪子轉(zhuǎn)一圈,共輸出374個脈沖信號,我們只需要將脈沖信號讓單片機采集回來,就可計算出電機的轉(zhuǎn)速,碼盤的輸出分a,b兩相,主板上分別將兩個電機的兩相輸出接到了int0,time3,int1,time4引腳。所以我們可以使用計數(shù)器采集數(shù)據(jù),也可以用外部中斷采集。
喵嗚的程序使用的是計數(shù)器采集電機的脈沖,使用計數(shù)器采集脈沖,外部引腳接收到一個脈沖,計數(shù)器就會加1,在程序中只需讀取計數(shù)器的數(shù)值便可得到脈沖的個數(shù),使用計數(shù)器3,4需要進行如下配置
void Time3And4Init()
{
T4T3M |=0xcc; //T3T4控制寄存器允許T3T4做計數(shù)器運行
IE2 &=0x1F; //禁止定時器3,4產(chǎn)生中斷
}
在初始化后,計數(shù)器就開始了運作了,在使用的時候,我們只需讀取計數(shù)器的高8位和低8位寄存器,
將高8位左移8位后加上低8位
i=(T3H<<8)+T3L;
j=(T4H<<8)+T4L;
這就將數(shù)據(jù)讀回去了,然后需要將計數(shù)器清零在清零前先關(guān)閉計數(shù)器嗎,然后再啟動
T4T3M &=0x77; //關(guān)閉定時器
T4H=T4L=0; //計數(shù)器清零
T3H=T3L=0; //計數(shù)器清零
T4T3M |= 0xCC; //啟動計數(shù)器
然后這就是計數(shù)器采集電機的方法了。
下面介紹下我寫的使用外部中斷采集脈沖的程序,這里我們使用int0和int1進行采集
外部中斷配置起來更加的方便,首先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引腳每檢測的一個下降沿,就會進去一次中斷,這樣我們就可以采集到脈沖的個數(shù)了,int1與int0是一樣的,不過對于平衡車中將會世道定時器中斷,當(dāng)一個程序中的中斷多的時候就是一個很頭疼的問題了,在我寫完數(shù)據(jù)采集后,我就寫了一個測速的程序,里面就用到time0的定時器中斷進行即使,結(jié)果在中的配置上出現(xiàn)了問題,導(dǎo)致我查了很久。所以還是要合理的去使用中斷,
下面負(fù)上我寫的幾個程序,
INT0&INT1getMot.zip
(41.44 KB, 下載次數(shù): 28)
2016-1-29 21:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
time4&3getMot.zip
(42.08 KB, 下載次數(shù): 26)
2016-1-29 21:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下一個
MPU6050數(shù)據(jù)采集
作者:
CT任你
時間:
2018-9-2 09:41
樓主使用的是STC15W4KS32系列嗎,我之前用STC15F2K60S2系列單片機做的平衡小車出現(xiàn)電機抖動的問題,當(dāng)時設(shè)置的KP,KI值也不算大,但是不知為什么就出現(xiàn)了抖動,抖動很異常,也很奇怪,找了很久也沒有找到問題所在,我用的時PCA計數(shù)器產(chǎn)生PWM波的。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1