stm32增量式光電編碼器

2021-08-28 18:43:47 字數 3892 閱讀 2695

原文:編碼器速度和方向檢測,371電機方向與速度檢測,stm32編碼器介面模式

出處:yfrobot論壇

編碼器是什麼玩意呢,它可是乙個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器介面模式,測出電機轉速與方向。

1.編碼器

圖1 編碼器示意圖

圖1為編碼器的示意圖,中間是乙個帶光柵的碼盤,光通過光柵,接收管接收到高電平,沒通過,接收到低電平。電機旋轉一圈,碼盤上有多少光柵,接受管就會接收多少個高電平。371電機中的碼盤就是這樣的,他是334線碼盤,具有較高的測速精度,也就是電機轉一圈輸出334個脈衝,晶元上已整合了脈衝整形觸發電路,輸出的是矩形波,直接接微控制器io就ok。        

增量式旋轉編碼器通過內部兩個光敏接受管轉化其角度碼盤的時序和相位關係,得到其角度碼盤角度位移量增加(正方向)或減少(負方向)。下圖為編碼器的原理圖:

圖2 增量式旋轉編碼器

a,b兩點對應兩個光敏接受管,a,b兩點間距為 s2 ,碼盤的光柵間距分別為s0和s1。s0+s1的距離是s2的四倍。這樣保證了a,b波形相位相差90度。旋轉的反向不同,鋸齒波a,b先到達高電平的順序就會不同,如上圖左側所示,順序的不同,就可以得到旋轉的方向。

2.stm32編碼器介面模式(暫存器)

stm32的編碼器介面模式在stm32中文參考手冊中有詳細的說明,在手冊273頁,14.3.12節。程式是完全按照 下圖方式,設定暫存器的。

圖3從圖3中可以看出,ti1波形先於ti2波形90°時,每遇到乙個邊沿變化是,計數器加1(可以通過暫存器設定加減),可以看出乙個光柵,被計數了4次。ti1波形後於ti2波形90°時 ,每遇到一次邊沿變化,計數器減1。

[color=rgb(51,102,153) !important]

//tim2_encoder_init,tim2_ch1(pa0);tim2_ch2(pa1)

//arr:自動重灌值 0xffff

//psc:時鐘預分頻數        ,不分頻

void tim2_encoder_init(u16 arr,u16 psc)

複製**

3 硬體

用到的模組有stm32核心板、l298電機驅動、371帶編碼器電機(1:34)。這裡主要介紹一下電機,1:34指的是電機軸轉動34圈,電機輸出1圈。1:x,x值越小,電機的輸出轉速也就越快,扭矩也就越小;反之,x值越大,電機的輸出轉速越慢,扭矩也越大。

圖4 電機實物圖

左邊兩根黃線是電機兩極。綠線和白線是脈衝輸出線,分別接編碼器的接收管a、b,用一根可以測得速度,兩根同時用可測出電機速度與轉向。紅線和黑線是編碼器電源接線,紅正黑負,電壓3.3v-5v,不不可接反。

4 控制**

工作指示燈、電機方向與速度控制**。

//led io 初始化 埠pd.2  執行指示燈

void led_init(void)

//電機旋轉方向控制訊號埠初始化

//pc1~0推挽輸出,輸出高

void m_init(void)

//定時器tim3,pwm輸出初始化,ch1(pa6)

//arr:自動重灌值

//psc:時鐘預分頻數

//設定自動重灌值為900,那麼pwm頻率=72000/900=8khz

見stm32參考手冊,14.3.9pwm模式。

void tim3_pwm_init(u16 arr,u16 psc) //arr設定計數器自動重灌值   

//psc預分頻器不分頻,psc=0

//電機方向與速度控制,速度調節範圍為-100~+100

//大於0時,正轉,小於0時,反轉

// 占空比低於0.4時電機不轉

//(占空比是指高電平在乙個週期之內所佔的時間比率)

//tim3->ccr1的設定範圍為0~900(因為arr=900)

//見stm32參考手冊,14.3.9pwm模式。

void motor_speed_control(s16 motorspeed)         

else if(speed > 0)

else

}複製**

電機速度與方向檢測**

//tim2_encoder_init,tim2_ch1(pa0);tim2_ch2(pa1)

//arr:自動重灌值 0xffff

//psc:時鐘預分頻數        ,不分頻

//見stm32中文手冊 14.3.12編碼器介面模式

void tim2_encoder_init(u16 arr,u16 psc)

//計數暫存器賦值

void tim2_encoder_write(int data)

//讀計數個數

int tim2_encoder_read(void)

複製**

這裡我們只顯示邊沿變化次數,沒有具體的算出速度。

主函式

int main(void)

}複製**

5 估算驗證

這裡我們只是大概的估算驗證測量值是否正確,不具有完全正確性。

我們設定motorspeed = 100 ,得到測量值如下圖:

圖5 motorspeed = 100

因為誤差是不可避免的,所以看到每次檢測的值都是不一樣的。我們取462,因為乙個光柵被記錄了4次,所以在10ms內一共檢測到了462/4=115.5,那麼得到11.55個/ms,每ms內檢測到11.55個光柵。

通過碼表,記錄電機輸出50圈,用時50.2s,那麼這時應該檢測到的光柵個數為50*34(電機轉34圈,輸出1圈)*334(每圈有334個光柵)=567800,除以時間,得到估算值11.31個/ms。可以看出估算值與測量值是相近的,認為測量是準確的。

設定motorspeed = -50 ,得到測量值如下圖 :

圖6 motorspeed=-50

可以看到測量值是負值,說明電機是反轉,與實際設定相符。

附件我們讀的是計數器tim2->cnt中的值,此值為什麼會是負的,這裡為什麼這樣用?      編碼器模式中使用上下計數,假設我們初始化tim2_encoder_init_1(0xff, 0);自動裝載值為0xff,這時,計數器中的值,就會在0x00與0xff之間迴圈變化,由0x01減為0x00,再減1時,計數器中的值為0xff,我們將此數做為有符型整數處理,當然,計數的前提是每個週期的計數個數不能超過0x7f,超過,計數將不準確。

符號強制轉換,return (int)((s16)(tim2->cnt));裡面有個型別轉換,強制轉換返回有符型資料。數值都是以補碼表示的,正整數補碼是原始碼,負整數補碼是絕對值取反加1。向下計數時減1,為0時,就需要向高位借位減「1」,可以這樣理解,乙個8位數00000000b-00000001b,但0不夠減1的,就向不存在的第9位藉1,

100000000b-00000001b=11111111b,數是以補碼形式表示的,這樣11111111b就為-1了。

在例程中,初始化自動重灌值為0xffff可以做個實驗,直接輸出tim2->cnt的值看一下:      printf("編碼器值1:%x \r\n",tim2->cnt)。

STM32 增量式旋轉編碼器測量

博主此篇文章使用的旋轉編碼器型號有兩種。感測器 增量式旋轉編碼器 型號供電電壓 輸出方式 解析度品牌 廠家 輸出電平 s20 1000型拉線位移感測器 5 24v npn集電極開路 400omron 歐姆龍 dt100e40r1024 hi 增量型大孔徑編碼器 5 30v htl 推挽式 1024 ...

STM32控制編碼器

編碼器是一種將角位移或者角速度轉換成一連串電數字脈衝的旋轉式感測器。可以用來測量位置,測量速度。四倍頻的方法是測量a相和b相的上公升沿和下降沿 stm32控制編碼器可以採用timer的編碼器模式,tim1 8的ch1和ch2分別對應a相和b相 選擇編碼器介面模式的方法是 如果計數器只在ti2的邊沿計...

增量式光電編碼器應用筆記

增量式編碼器應用筆記 author jackwen email jackwen123 21cn.com 增量式編碼器是直接利用光電轉換原理輸出三組方波脈衝a b和z相 a b兩組脈衝相位差90度,從而可方便地判斷出旋轉方向,而z相為每轉乙個脈衝,用於基準點定位。它的優點是原理構造簡單,機械平均壽命可...