一、绝对值编码器
绝对值编码器可以认为是与增量式编码器相对的一种编码器,与使用增量式编码器读取脉冲值不同,绝对值编码器可以直接读取编码器所处的角度值。根据量程,绝对值编码器也可以分为单圈编码器和多圈编码器。实际上根据每个厂家设计的编码器的通讯方式也可以再细分,这里我不再赘述。实验室使用绝对值编码器的目的是能够利用正交两个绝对值编码器,设计一个准确度高的里程计,借此机会学习一下绝对值编码器。
本文所使用的绝对值编码器是BRITER的1024分度CAN总线绝对值编码器,其官方文档如下:
根据官方文档提供的方法可以轻松写出一个编码器读取的示例,我这里为了便于移植,直接写成库的形式,仅供参考。
二、软件编写
1.STM32CubeMX配置
这里我们需要使用CAN通信,需打开CAN的RX中断,波特率配置参考官方文档,默认波特率为500KHz(可以更改)
我这里打开USART1便于与PC通信,同样需打开中断,用于printf的重定向
2.使用BTR_Encoder库
我参考了已有的CAN库和优快云上少有的资料,写了一套库程序,供各位食用
BTR_Encoder.h:编码器外设库头文件
#ifndef BTR_ENCODER__H
#define BTR_ENCODER__H
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_can.h"
extern CAN_HandleTypeDef hcan1;
#define Encoder_CAN hcan1 //定义用于编码器的CAN句柄
#define Encoder_Baud_500K ((uint8_t)0x00)
#define Encoder_Baud_1M ((uint8_t)0x01)
#define Encoder_Baud_250K ((uint8_t)0x02)
#define Encoder_Baud_125K ((uint8_t)0x03)
#define Encoder_Baud_100K ((u