關於STM32正交編碼的問題

2021-06-17 18:20:57 字數 1581 閱讀 2941

stm32正交編碼測速

程式的大致思路如下:兩個定時器配置為編碼器模式,用於小車的兩個輪子編碼脈衝計數,計數器向上或向下計數溢位,均在二者的中斷函式中記錄記錄。還有乙個定時器用作計時用,規定時間內進入中斷,在中斷函式中對資料進行處理。我用的光電碼盤是100線的,在選擇的計數模式下,轉一圈產生400個計數脈衝。程式如下:

double first_cnt,second_cnt,encoder_timer_overflow_sample;

static volatile double encoder_timer_overflow;

double rotor_speed = 0;

unsigned char i = 0;

//first_cnt是第一次讀計數器的值,second_cnt是第二次讀計數器的值,encoder_timer_overflow記錄計數器的溢位次數(不管是向上溢位還是向下溢位)

int main(void)

double get_rotor_speed(void)//double get_rotor_speed()

else 

first_cnt = second_cnt;//儲存第二次的讀取值,以便下一次使用

encoder_timer_overflow = 0;//溢位次數清零

circle_number = delta_cnt / 400.0 / 98.777946;//計算兩次讀取時間內車輪轉了多少圈

//400  :  the count value of cnt for rotor  rotate a circle

:  the decrease speed rate of motor 減速箱的減速比,delta是轉子所轉的圈數

w_rotor = ( circle_number * 2 * 3.141592 ) / 0.03;//計算角速度,2*pi*轉的圈數/計數時間(為0.03s)

//the wheel's w_rotor ,calculate time is 1 minute

//circle_number * 2 * 3.141592    delta_angle  by radian

//w_rotor      unit:  degree by radian per second

line_speed = ( w_rotor * 64.68 / 2.0 ) / 10.0;//計算線速度,v=w*r車輪直徑64.68mm,除以10轉化為cm

//the wheel's line_speed, unit: cm per seconds

/ 2.0 mm: radius of wheel

//printf ( " w_rotor=%8lf       line_speed =%8lf\r\n ",w_rotor,line_speed ); 

return line_speed;}

void tim3_irqhandler(void)//定時器3定時器0.03秒,在中斷函式中進行平均值濾波。

else

/* clear the interrupt pending flag */

tim_clearflag(tim3,tim_flag_update);}

完 

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的定時器是...