STM32定時器 正交編碼器模式詳解

2021-08-08 23:06:13 字數 3186 閱讀 9760

原創2023年01月25日 17:11:09

編碼器分類: 

按工作原理:光電式、磁電式和觸點電刷式 

按碼盤的刻孔方式:增量式和絕對式兩類 

由於博主接觸面還不是很廣,一共就用過兩個種類的編碼器,都是屬於光電的 

差分編碼器:一般由8根線連線 訊號線分別為 a+ a- b+ b- z+ z- 以及vcc和gnd 

這裡有一種不需要z訊號的,6線差分a+ a- b+ b- vcc 和gnd 

正交編碼器:一般是5根線連線,訊號線分別為a b z vcc和gnd

編碼器線數: 就是旋轉一圈你的a(b)會輸出多少個脈衝 ,這裡的a b就是上面的輸出脈衝訊號線,它們轉一圈發出的脈衝數一樣的,不過存在90°相位差 通常都是360線的 線數越高代表編碼器能夠反應的位置精度越高

相位差為90° 通過判斷哪個訊號在前 哪個訊號在後 來決定tim->count是++ 還是 – 

360線 ab一圈各為360個,z訊號為一圈乙個

編碼器訊號: 

a 脈衝輸出 

b 脈衝輸出 

z 零點訊號 當編碼器旋轉到零點時,z訊號會發出乙個脈衝表示現在是零位置 這個零點位置是固定,廠商指定的 

vcc 電源通常分為24v的和5v的 

gnd 地線

這裡需要注意: 

1.這裡的正交編碼器是如果是24v的工作電壓還需要用光耦隔離,24v轉為3v3在接到stm32的定時器兩個通道上 

2.脈衝輸出是oc門輸出,需要上拉電阻 

3.z訊號接到stm32的外部中斷口上,很容易受到干擾 ,通常需要接乙個電容到gnd

這裡給出乙個24v轉3.3v的隔離電路,用到的是6n136光耦

硬體連線(這裡使用的stm32f103zet6的tim4的ch1和ch2): 

**詳解: 

tim4初始化**如下:

#include "stm32f10x.h"

#include "encode.h"

#include "misc.h"

#include "nvic.h"

#include "sys.h"

#include "delay.h"

void tim4_mode_config(void)

/*

void tim3_mode_config(void)

*/void tim4_init(void)

這裡的nvic_config(2)是我個人寫的一種多種中斷配置的方法單獨放在nvic.c中需要了解的可以自己看看工程

這裡通常要問的是兩點 

1.tim_timebasestructure.tim_period = 359*4 

2.tim_encoderinte***ceconfig(tim4, tim_encodermode_ti12, tim_icpolarity_bothedge ,tim_icpolarity_bothedge);//使用編碼器模式3,上公升下降都計數

很多人不理解為要360線的編碼器為什麼這裡的重灌值乘以4 讀出來的為什麼又要/4,其實這兩個要結合起來解釋 

首先看看這個函式tim_encoderinte***ceconfig,它有4個引數 

1.選擇哪個定時器 即tim4 

2.編碼器模式有三種 見下圖 

3.tim_ic1的極性 

4.tim_ic2的極性 

這裡設定的是編碼器模式3,且ti1和ti2都是雙邊沿觸發–即上下邊沿都計數

還有乙個大家不是很懂的圖,我來分析一下

1.有效邊沿 其實就是對應上面設定的編碼器的三種模式 

2.相對訊號的電平,這裡沒有理解手冊意思,我把它理解為於它的高低電平意味著將pb6和pb7介面對換,pb7接a pb6接b 這樣一來就意味著原來的正轉變成反轉 計數上公升變為下降

tix 就相當於輸入訊號的 tim4->ch1 tim4->ch2 

tixf 濾波後訊號 

tixfpx經過帶極性選擇的邊緣檢測器過後的產生的訊號

3.至於ti1fp1和ti2fp2訊號在上身沿計數還是下降沿計數受兩點影響 極性(是否反向) 邊緣檢測(上公升沿還是下降沿) 

我們這裡設定的是不反向 在雙邊沿計數,即在a上公升下降 b的上身下降都計數

而計數為什麼是x4倍 ,下圖結合上面的配置詳細說明了

由此完成了編碼器的配置

至於讀取編碼器角度的時間,要根據實際需要來設定

編碼器線數為 w線/圈 

轉速為 v 圈/min 

讀取間隔時間 t(線間隔時間)

t <= 60/wv 單位為秒

還有z訊號歸零,在遇到z訊號的時候,將定時器的cnt=0,這樣就能保證位置與cnt實際對應上了 

中斷**如下

//外部中斷1,編碼器z相歸零  優先順序--①  0 0

void exti1_irqhandler(void)

//編碼器介面模式 優先順序--2 1 1

void tim4_irqhandler(void)

tim4->sr&=~(1

<<

0);//清除中斷標誌位

}

csdn:

STM32正交編碼器介面

晶元型號 使用引腳及初始化程式原始碼 tim2埠重對映問題 與jtag介面衝突時的現象及解決方法 晶元型號 stm32f103ret6 使用定時器 tim2 tim3 tim4 tim5 使用引腳 tim2 pa15 pb3 remap tim3 pa6 pa7 tim4 pb6 pb7 tim5 ...

STM32正交編碼器測速

一 正交編碼解碼原理 二 解碼思路 1 方法一 使用定時器的輸入捕獲功能,配置好tim icinittypedef即可獲取一定時間內的脈衝個數,並可根據b相上公升沿時a相所處的電平判斷電機正轉還是反轉。中斷型別配置為更新事件和上公升沿觸發,更新事件的時間由定時器配置的引數計算出,在更新事件中斷中計算...

STM32學習筆記之正交編碼器

最近做乙個專案,主控晶元用stm32rbt6,要用到光柵尺,本來帶乙個控制器的,通過控制器的232可以讀取光柵尺的資料,但這個控制器太大,裝置中放不下,於是,考慮自己做乙個,網上看到很多有用cpld的方案,後來無意間發現stm32的定時器可以配置成編碼器,甚喜 高興之餘,突然發現stm32的定時器是...