晶元型號、使用引腳及初始化程式原始碼
tim2埠重對映問題
與jtag介面衝突時的現象及解決方法
晶元型號:stm32f103ret6
使用定時器:tim2、tim3、tim4、tim5
使用引腳:
tim2—pa15、pb3(remap)
tim3—pa6、pa7
tim4—pb6、pb7
tim5—pa0、pa1
初始化程式原始碼:
(其中tim2的配置有特殊需要注意的地方,其他配置相同,除錯時遇到的問題和解決方法見下文)
#include "stm32f10x.h"
#include "encoder.h"
void tim2_mode_config(void)
void tim3_mode_config(void)
void tim4_mode_config(void)
void tim5_mode_config(void)
在使用時,讀取timx->cnt暫存器中的資料即可。
在一開始除錯的時候,tim2的初始化程式和其他定時器的相同,這時旋轉tim2連線的編碼器,計數沒有變化,旋轉tim5連線的編碼器時,tim2和tim5的計數同時變化並且數值相同。
從手冊中可以看出pa15和pb3的tim2功能需要進行重對映,否則在pa0和pa1上編碼器訊號既進入tim2,又進入tim5,因此會導致tim2和tim5的計數相同。
在pa15和pb3作為tim2編碼器訊號輸入引腳時,需要進行io重對映:
gpio_pinremapconfig(gpio_partialremap1_tim2,enable); // 重對映tim2的ch1、ch2到pa15和pb3
在tim2進行io重對映後,仍不能正常使用,無論如何旋轉編碼器,計數器的值只有0、1、max三個值(在0上+1或-1)
從手冊中編碼器模式下的計數器變化過程中可以看出,當兩相編碼器的乙個訊號不變,另乙個訊號變化時,計數器計數值會在某個數值上下波動,和上述問題情況類似,因此猜測是因為編碼器其中一相的訊號沒有捕獲到。
再次查閱手冊發現pa15和pb3引腳的預設功能為jtag功能,需要關閉後才能正確使用,否則jtdo為輸出引腳,無法捕獲到編碼器訊號,所以會出現計數值只有0,1,max三個值的現象。這裡僅關閉jtag功能,保留swd以便除錯使用:
gpio_pinremapconfig(gpio_remap_swj_jtagdisable, enable); // 關閉jtag功能
STM32正交編碼器測速
一 正交編碼解碼原理 二 解碼思路 1 方法一 使用定時器的輸入捕獲功能,配置好tim icinittypedef即可獲取一定時間內的脈衝個數,並可根據b相上公升沿時a相所處的電平判斷電機正轉還是反轉。中斷型別配置為更新事件和上公升沿觸發,更新事件的時間由定時器配置的引數計算出,在更新事件中斷中計算...
STM32學習筆記之正交編碼器
最近做乙個專案,主控晶元用stm32rbt6,要用到光柵尺,本來帶乙個控制器的,通過控制器的232可以讀取光柵尺的資料,但這個控制器太大,裝置中放不下,於是,考慮自己做乙個,網上看到很多有用cpld的方案,後來無意間發現stm32的定時器可以配置成編碼器,甚喜 高興之餘,突然發現stm32的定時器是...
STM32定時器 正交編碼器模式詳解
原創2016年01月25日 17 11 09 編碼器分類 按工作原理 光電式 磁電式和觸點電刷式 按碼盤的刻孔方式 增量式和絕對式兩類 由於博主接觸面還不是很廣,一共就用過兩個種類的編碼器,都是屬於光電的 差分編碼器 一般由8根線連線 訊號線分別為 a a b b z z 以及vcc和gnd 這裡有...