Files
linear-Slide/Interface/Int_Encoder.c

76 lines
2.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Int_Encoder.h"
// 函数调整ABZ输出分辨率step为分辨率
void Int_Encoder_set_resolution(uint16_t step)
{
HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_SET); // 给芯片上电
HAL_GPIO_WritePin(ENCODER_MODE_GPIO_Port, ENCODER_MODE_Pin, GPIO_PIN_SET); // 切换到I2C模式
// 配置I2C
Dri_I2C_Init();
// 按照手册给指定寄存器发送指定数据
Dri_I2C_Start();
Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE); // 发送从机地址
Dri_I2C_WriteReg(0x09, 0xB3);
Dri_I2C_WriteReg(0x0A, 0x05);
Dri_I2C_Stop();
HAL_Delay(1000); // 等待EEPROM编程完成
// 按照手册给芯片重新上电
HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_SET);
// ABZ_RES一共十位低8位在0x31寄存器中高两位在0x30寄存器中的最低两位
// 读取ABZ_RES高两位所在寄存器的数据保留不能修改的bits
uint8_t data = Dri_I2C_ReadReg(ENCODER_I2C_ADDR_READ, ENCODER_ABZ_RES_H);
// debug_printf("read data = 0x%02x", data);
uint8_t step_h = step >> 8;
// 需要写入高两位
for (uint8_t i = 0; i < 2; i++)
{
if (step_h & (1 << i))
data |= (1 << i);
else
data &= ~(1 << i);
}
// debug_printf("write data = 0x%02x", data);
HAL_Delay(1000);
Dri_I2C_Start();
Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE);
Dri_I2C_WriteReg(ENCODER_ABZ_RES_H, data);
Dri_I2C_Stop();
Dri_I2C_Start();
Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE);
Dri_I2C_WriteReg(ENCODER_ABZ_RES_L, step & 0xFF);
Dri_I2C_Stop();
}
void Int_Encoder_start(void)
{
// 初始化编码器的引脚(之前用作软件I2C)
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = ENCODER1_A_Pin | ENCODER1_B_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Int_Encoder_Init(void)
{
DWT_init();
Int_Encoder_set_resolution(0x03FF);
Int_Encoder_start();
HAL_TIM_Base_Start_IT(&htim12);
}