編碼器分類: 按工作原理:光電式、磁電式和觸點電刷式 按碼盤的刻孔方式:增量式和絕對式兩類 由于博主接觸面還不是很廣,一共就用過兩個種類的編碼器,都是屬于光電的 差分編碼器:一般由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線的 線數越高代表編碼器能夠反應的位置精度越高
單片機源程序如下:
- //光電編碼器測速,TIM3_ETR,PD2
- #include "stm32f10x.h"
- #include <stdio.h>
- #include "TIM_CeSu.h"
- #include "TIM_Dingshi.h"
- #include "LED.h"
- #include "LCD12864.h"
- #include "delay.h"
- uint16_t Qian_Count,Hou_Count;
- uint8_t flag;
- float speed;
- void Board_Init(void)
- {
- LED_Init();
- NVIC_Config();
- Timer_Init();
- TIM_Init();
- InitDis();
- }
- int main(void)
- {
- Board_Init();
- locate16(1,1);
- DisStr(" 編碼器測速");
- delay_ms(10);
- while(1)
- #if 1
- {
- locate16(2,1);
- DisStr("當前編碼器速度:");
- delay_ms(10);
- locate16(3,1);
- lcd_decimal(speed);
- delay_ms(10);
- DisStr(" 圈/ 秒");
- }
- #endif
- }
- void TIM3_IRQHandler(void)
- {
- #if 0
- if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET)
- {
- //TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除標志位
- GPIOC-> ODR ^= GPIO_Pin_6;
- TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中斷
- //TIM1->EGR |= 0x0001;
- //TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中斷
- }
- #endif
- if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除標志位
- GPIOC-> ODR ^= GPIO_Pin_8;
- flag++;
- }
- }
- //定時器2的中斷函數
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除標志位
- GPIOC-> ODR ^= GPIO_Pin_9;
- Qian_Count = TIM3->CNT;
- speed=(800*flag+Qian_Count-Hou_Count)*2.0/200.0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.jpg (40.68 KB, 下載次數: 87)
下載附件
2018-4-15 05:11 上傳
所有資料51hei提供下載:
光電編碼器測速(通用定時器TIM3).rar
(274.5 KB, 下載次數: 521)
2018-4-15 05:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|