目錄
- 前言
- 相關知識
- eCAP模塊簡介
- 紅外傳感器簡述
- 實作程序
- GPIO配置
- eCAP模塊配置
- 其他代碼
- 效果
- 總結
大家新年好啊,前幾天回鄉下過年了,也沒帶啥東西回去,所以啥也干不了,昨天回來了,又做了一個小實驗,跟大家分享一下,
前言
之前用F28335驅動一個舵機旋轉(鏈接在這),一般來說,舵機無法整圈旋轉,因此一般也不算轉速,不過我手頭上這個是360°舵機,所以可以整圈旋轉,因此打算利用F28335的eCAP模塊結合紅外傳感器對舵機的轉速進行測量,
相關知識
eCAP模塊簡介
脈沖捕獲模塊可以通過捕獲脈沖量的上升沿或者下降沿,來計算脈沖信號的寬度和占空比,進而可以進行相關控制操作,其典型應用有:
- 電機測速
- 測量脈沖電平寬度
- 測量一系列脈沖占空比和周期
- 電流/電壓傳感器的PWM編碼信號的解碼
F28335一共有6組eCAP模塊,每個eCAP模塊不但具有捕獲功能,而且還可用作PWM輸出功能,這次咱利用的是它的捕獲功能,
紅外傳感器簡述
本次所用的紅外傳感器主要是利用不透明的物體對紅外射線的遮擋來實作測量,傳感器實物如下圖所示,有一根電源線、一根地線以及一根信號線,另外,傳感器上還有一個槽結構,當不透明物體位于槽中并將紅外射線遮擋時,信號線上輸出低電平,否則輸出高電平,因此,我們可以通過檢測信號線的電平來判斷槽中是否有物體;同時,如果將一個整圈旋轉的物體置于槽中,就可以通過電平切換的時間間隔對旋轉物體的轉速做出測量,

(圖片來自網路,侵刪)
實作程序
GPIO配置
GPIO配置主要分為eCAP模塊相關GPIO配置以及紅外傳感器相關GPIO配置,由于紅外傳感器的輸出信號是eCAP模塊的輸入信號,所以將傳感器的信號線接到eCAP模塊的輸入線;另外,由于傳感器功率較低,因此直接利用開發板上的DVDD3.3埠給傳感器供電,GPIO配置代碼如下:
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 1;
EDIS;
DVDD3.3的配置在例程函式中,無需修改,此處不列出,
eCAP模塊配置
eCAP模塊的配置首先要進行時鐘使能:
SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK=1;
然后需要對eCAP模塊的各個暫存器進行設定:
void Config_eCAP6(void)
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1;
EDIS;
ECap6Regs.ECCTL1.bit.CAP1POL = 1; // capture falling edge
ECap6Regs.ECCTL1.bit.CAP2POL = 1;
ECap6Regs.ECCTL1.bit.CAP3POL = 1;
ECap6Regs.ECCTL1.bit.CAP4POL = 1;
ECap6Regs.ECCTL1.bit.CTRRST1 = 0; // no reset after event captured
ECap6Regs.ECCTL1.bit.CTRRST2 = 0;
ECap6Regs.ECCTL1.bit.CTRRST3 = 0;
ECap6Regs.ECCTL1.bit.CTRRST4 = 0;
ECap6Regs.ECCTL1.bit.CAPLDEN = 1;
ECap6Regs.ECCTL1.bit.PRESCALE = 0; // no prescale
ECap6Regs.ECCTL2.bit.CAP_APWM = 0; // capture mode
ECap6Regs.ECCTL2.bit.CONT_ONESHT = 0; // operate in continous mode
ECap6Regs.ECCTL2.bit.SYNCO_SEL = 2; // disable sync out signal
ECap6Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync-in option
ECap6Regs.ECEINT.all = 0x0000; // stop all interrpt
ECap6Regs.ECCLR.all = 0xFFFF; // clear all flags
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1; // start
ECap6Regs.ECEINT.bit.CEVT4 = 1; // enable cevt4 interrpt
}
其他代碼
主要是eCAP中斷服務函式,中斷服務函式主要是讀取CAPx暫存器的值并利用這些值進行轉速的計算,除此之外,為了更好地進行互動,需要將轉速進行顯示,這里采用數碼管來進行轉速的顯示,但是由于轉速不一定為整數,同時目前我所寫的數碼管控制函式只能顯示整數,所以對計算得到的轉速進行乘以1000再取整的操作,主要代碼如下:
interrupt void ISR_eCap6(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap6Regs.ECCLR.all = 0xFFFF; // clear all flags
Uint32 t1, t2, t3, t4;
Uint16 s;
t1= ECap6Regs.CAP1;
t2= ECap6Regs.CAP2;
t3= ECap6Regs.CAP3;
t4= ECap6Regs.CAP4;
servo_speed_1 = CPU_CLK / 2 / (t3 - t1);
servo_speed_2 = CPU_CLK / 2 / (t4 - t2);
servo_speed = (servo_speed_1 + servo_speed_2) / 2;
s = (Uint16)(servo_speed * 1000);
DT_Show(s);
}
效果
360°舵機測速效果
可以看到,每次舵機的葉片轉到紅外傳感器的槽之間時,紅外傳感器上的指示燈熄滅,說明此時紅外傳感器輸出低電平,同時可以看到,數碼管顯示出了當前的轉速,基本位于200-210之間,所以可得現在舵機的轉速為0.2-0.21r/s,轉速的誤差一方面來自舵機轉速的不穩定,另一方面也來自手持傳感器的輕微晃動,
總結
到這里,利用eCAP模塊和紅外傳感器測量360°舵機轉速的小實驗就完成了,可以看到,整一個的思路是先利用紅外傳感器檢測遮擋來產生脈沖序列信號,然后通過eCAP模塊捕獲脈沖并根據脈沖間的時間進行轉速的計算,不過轉速顯示上還有所欠缺,后面可以將小數的顯示給補上,最后歡迎大家批評指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259811.html
標籤:其他
