在機器人的旋轉關節中、或者底盤的驅動輪中,編碼器是一個很常用的部件,它用于檢測輸出軸的位置、轉速。下面我們先從它的分類開始,后面還有一個簡單的用法示例代碼。

磁編碼器
1.編碼器分類:
按工作原理:光電式、磁電式和觸點電刷式。按碼盤的刻孔方式:增量式和絕對式兩類。
筆者到目前為止,就用過這些種類的編碼器。像光電的差分編碼器,一般由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°的相位差。線數越高代表編碼器能夠反應的位置精度越高。
2.下面以基于stm32的直流電機驅動為例,里面有編碼器的讀取。
代碼及注釋如下:
#include "delay.h"
#include "stm32f10x.h"
#include "sys.h"
#include "timer.h"
#include "usart.h"
#include "encoder.h"
#include "oled.h"
#include "pwm.h"
#include "control.h"
#include "led.h"
#include "key.h"
extern int Target_velocity;
extern u16 Encoder; //左右編碼器的脈沖計數
extern u16 Moto1; //電機PWM變量
u8 t=0;
float speed;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2
delay_init(); //延時函數初始化
KEY_Init(); //初始化與按鍵連接的硬件接口
OLED_Init();
uart_init(9600); //=====串口初始化
Encoder_Init_TIM2(); //=====編碼器接口
TIM3_Int_Init(99,7199); //10ms
IN2=1;
IN1=0;
LED_Init(); //初始化與LED連接的硬件接口
TIM1_PWM_Init(7199,0);//不分頻。PWM頻率=72000/(899+1)=80Khz
while(1)
{
speed = Encoder*100/4/13/30;
printf("speed:%0.2f rad/s