編碼器是一種將角位移或者角速度轉換成一連串電數字脈衝的旋轉式感測器。
可以用來測量位置,測量速度。
四倍頻的方法是測量a相和b相的上公升沿和下降沿
stm32控制編碼器可以採用timer的編碼器模式,tim1~8的ch1和ch2分別對應a相和b相
選擇編碼器介面模式的方法是:如果計數器只在ti2的邊沿計數,則置timx_smcr暫存器中的
sms=001;如果只在ti1邊沿計數,則置sms=010;如果計數器同時在ti1和ti2邊沿計數,則
置sms=011。
通過設定timx_ccer暫存器中的cc1p和cc2p位,可以選擇ti1和ti2極性;如果需要,還可以
對輸入濾波器程式設計。
兩個輸入ti1和ti2被用來作為增量編碼器的介面。假定計數器已經啟動(timx_cr1
暫存器中的cen=』1』),計數器由每次在ti1fp1或ti2fp2上的有效跳變驅動。
配置範例:
cc1s=』01』 (timx_ccmr1暫存器, ic1fp1對映到ti1)
cc2s=』01』 (timx_ccmr2暫存器, ic2fp2對映到ti2)
cc1p=』0』 (timx_ccer暫存器, ic1fp1不反相, ic1fp1=ti1)
cc2p=』0』 (timx_ccer暫存器, ic2fp2不反相, ic2fp2=ti2)
sms=』011』 (timx_smcr暫存器,所有的輸入均在上公升沿和下降沿有效).
cen=』1』 (timx_cr1暫存器,計數器使能)
實驗採用一款安裝了編碼盤的直流電機,如圖:
帶編碼器電機 stm32
電機線+ pb12
電機線- pb13
編碼器a相 pa0(tim2->ch1)
編碼器b相 pa1(tim2->ch2)
編碼器5v 5v
編碼器gnd
gnd
encode.h:
#ifndef _encode_h
#define _encode_h
#include "sys.h"
#define pwma tim1->ccr1 //pa8
#define bin1 pbout(13)
#define bin2 pbout(12)
#define encoder_tim_period (u16)(65535) //不可大於65535 因為f103的定時器是16位的
void encode_motor_init();
void encode_pwm_init(u16 arr,u16 psc);
void encode_encoder_init();
void encode_init();
int read_encoder();
void tim2_irqhandler(void);
#endif
encode.c:
void encode_motor_init()//pb12 13
void encode_pwm_init(u16 arr,u16 psc) //pa8(tim1 ch1)
void encode_encoder_init() //pa0(tim2 ch1),pa1(tim2 ch2)
void encode_init()
int read_encoder()
void tim2_irqhandler(void)
tim2->sr&=~(1
<<0);//清除中斷標誌位
}
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 編碼器資料集錦
我在編寫stm32f103小車編碼器 的過程之中幾乎把整個csdn裡面的介紹和 看遍了,整理出如下幾篇,個人認為對於利用stm32編碼器模式和pid進行小車調速,看過這幾篇就足夠了。例如 編碼器線數,是旋轉一圈你的a b 會輸出多少個脈衝 這裡的a b就是上面的輸出脈衝訊號線,它們轉一圈發出的脈衝數...