在机器人的旋转关节中、或者底盘的驱动轮中,编码器是一个很常用的部件,它用于检测输出轴的位置、转速。下面我们先从它的分类开始,后面还有一个简单的用法示例代码。
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