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