RVMCU課堂「17」: 手把手教你玩轉(zhuǎn)RVSTAR—正交編碼器接口篇
系統(tǒng)環(huán)境Windows?10-64bit
軟件平臺(tái)NucleiStudio IDE 202102版或 PlatformIO IDE
硬件需求RV-STAR開發(fā)板旋轉(zhuǎn)編碼器
正交編碼器
正交編碼器(Quadrature Encoder)是一種用于測(cè)量旋轉(zhuǎn)速度和方向的傳感器。常見的正交編碼器有兩個(gè)輸出信號(hào):A信道和B信道。每個(gè)信道可以對(duì)運(yùn)動(dòng)進(jìn)行測(cè)量并產(chǎn)生數(shù)字脈沖,這兩個(gè)脈沖的相位相差90度(因此稱為“正交”),這使得你可以根據(jù)它們判斷運(yùn)動(dòng)的方向,通過積分(累加)運(yùn)算后,還可以用來測(cè)算距離。
上圖中,A和B分別連接到兩個(gè)傳感器單元上,黑白相間的圓環(huán)稱之為「柵格」。傳感器單元和柵格的實(shí)現(xiàn)方式有很多種,包括「反射式傳感器 反光率不同的柵格」「對(duì)射式傳感器 鏤空光柵」「霍爾傳感器 磁極圓環(huán)」「觸點(diǎn) 導(dǎo)軌」等。本次實(shí)驗(yàn)中,我們使用的是下圖所示的市面上常見的旋轉(zhuǎn)編碼器(數(shù)字電位器):
GD32VF103的正交譯碼器
正交譯碼器功能使用TIMERx_CH0和TIMERx_CH1引腳生成的CI0和CI1正交信號(hào)各自相互作用產(chǎn)生計(jì)數(shù)值。通過設(shè)置SMC=0x01、0x02或0x03來選擇是僅由CI0、僅由CI1、或者由CI0和CI1來決定定時(shí)器的計(jì)數(shù)方向。在每個(gè)方向選擇源的電平改變期間,DIR位是由硬件自動(dòng)改變的。計(jì)數(shù)器計(jì)數(shù)方向改變的機(jī)制如下方的圖表所示。正交譯碼器可以當(dāng)作一個(gè)帶有方向選擇的外部時(shí)鐘,這意味著計(jì)數(shù)器會(huì)在0和自動(dòng)加載值之間連續(xù)地計(jì)數(shù)。因此,用戶必須在計(jì)數(shù)器開始計(jì)數(shù)前配置TIMERx_CAR寄存器。
實(shí)驗(yàn)部分
首先需要參照如下的示意圖,對(duì)RV-STAR開發(fā)板和旋轉(zhuǎn)編碼器進(jìn)行連線:
然后在集成開發(fā)環(huán)境中創(chuàng)建一個(gè)新工程,開始編寫代碼。首先需要對(duì)定時(shí)器的編碼器接口進(jìn)行配置,我們使用的是TIMER2的編碼器接口,對(duì)應(yīng)的是PA6和PA7引腳,首先要使能它們的外設(shè)時(shí)鐘和復(fù)用時(shí)鐘,然后配置為浮空輸入模式。接著需要?jiǎng)?chuàng)建定時(shí)器初始化參數(shù)結(jié)構(gòu)體,對(duì)定時(shí)器的功能進(jìn)行配置,其中需要注意的是要將結(jié)構(gòu)體參數(shù)的預(yù)分頻系數(shù)設(shè)為0,周期設(shè)為10000(即定時(shí)器的自動(dòng)加載值,也可以設(shè)為其他值),然后需要將定時(shí)器的模式設(shè)置為TIMER_ENCODER_MODE2(編碼器模式,使用CI0和CI1計(jì)數(shù)),然后將定時(shí)器的計(jì)數(shù)值配置為5000(這樣讀取定時(shí)器計(jì)數(shù)的初值就是5000),最后使能TIMER2。相關(guān)代碼實(shí)現(xiàn)如下:
void?encoder_init()
{
????/* TIMER2_CH0 - PA6, TIMER2_CH1 - PA7 */
????rcu_periph_clock_enable(RCU_GPIOA);
????rcu_periph_clock_enable(RCU_AF);
????gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
????rcu_periph_clock_enable(RCU_TIMER2);
????timer_deinit(TIMER2);
????/* initialize TIMER init parameter struct */
????timer_parameter_struct timer_initpara;
????timer_struct_para_init(