錯誤1、pc6 pc7被用作其他用途,gpio模式配置錯誤。導致計數不準確;
錯誤2、引腳模式設定錯誤,應該設定為gpio_mode_ipd;//gpio_mode_ipu gpio_mode_in_floating 都可以;
錯誤3引腳重對映沒有開啟afio時鐘;
總結網上的檢測數值突變的方法不可靠,會有漏檢的情況。在滴答定時器中檢測encoder的值突變
void systick_handler(void)
;// 兩次編碼器讀值,用以計算溢位方向
static int n = 0;// 圈數
encoder[1] = tim3->cnt;
if((encoder[1] - encoder[0] ) > 0x7fff)
else if( (encoder[0] - encoder[1] ) > 0x7fff)
enccnt = n * 0xffff + encoder[1];
encoder[0] = encoder[1];
}我採用了兩種方法處理:一種是採用另乙個定時器實時的檢測溢位標誌及方向標誌,這種方法是可行的。即使速度很快的時候依然計數準確。但是出現了新的問題,用作定時器的時鐘,當定時週期設定的很小的時候才可以計數準確,但是由於中斷的優先順序高,導致無法進入主迴圈程式。附上檢測**。這樣的處理方法,在速度慢的時候可以檢測正確。但是定時週期要設定足夠小。cr1的bit4代表計數方向標誌,1代表減二代表加;sr的bit0代表溢位中斷標誌,1代表溢位。該位是硬體置1軟體清零。另一種是使用編碼器溢位中斷。中斷的時候對編碼器溢位方向進行判斷,然後根據方向進行累加。
void tim2_irqhandler(void)
}else if((tim3->cr1&0x10) == 0x00)//向上計數
}enccnt= n * 65536 + tim3->cnt;
// encoder[0] = encoder[1];
}
}最後,我找到了更簡單的檢測編碼器溢位中斷並進行累計的方法。
其實當編碼器的定時器溢位的時候,會導致進入中斷。這樣直接用編碼器的中斷函式即可。但是需要注意的是,需要在編碼器的定時器配置的時候,配置中斷。如果不配置,就會導致程式一執行就宕機。一直停在dma2_channel4_5_irqhandler這一句。
附上最終測試驗證完成的**
編碼器初始化配置 ( 注意。如果不適用中斷溢位的方法,無需配置
nvic_initstructure.nvic_irqchannel =tim3_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;
nvic_initstructure.nvic_irqchannelsubpriority = 0;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init(&nvic_initstructure);
這部分。。。)
並且我適用的是tim3重定義到pc7 pc6的。也可以使用部分重對映和預設引腳。
void encodertiminit()
編碼器計數模組
void tim3_irqhandler(void)
else if((tim3->cr1&0x10) == 0x00)//向上計數
enccnt= n * 65536 + tim3->cnt;
}
}注: n 和enccnt變數最好定義為volatile
STM32控制編碼器
編碼器是一種將角位移或者角速度轉換成一連串電數字脈衝的旋轉式感測器。可以用來測量位置,測量速度。四倍頻的方法是測量a相和b相的上公升沿和下降沿 stm32控制編碼器可以採用timer的編碼器模式,tim1 8的ch1和ch2分別對應a相和b相 選擇編碼器介面模式的方法是 如果計數器只在ti2的邊沿計...
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相所處的電平判斷電機正轉還是反轉。中斷型別配置為更新事件和上公升沿觸發,更新事件的時間由定時器配置的引數計算出,在更新事件中斷中計算...