AS5600角度读取
1.相关定义
#define As5600_Addr 0x36
#define RawAngle_Addr 0x0C
#define I2C_WRITE_MODE 0
#define I2C_READ_MODE 1
#define ACK 0 /*!< I2C ack value */
#define NACK 1 /*!< I2C nack value */
#define ACK_CHECK_ENABLE 1
#define ACK_CHECK_DISABLE 0
2.IIC驱动编写
初始化程序:
esp_err_t As5600_Init(int sda_io, int scl_io)
{
esp_err_t result;
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = sda_io,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = scl_io,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = 100000,
};
result = i2c_param_config(I2C_NUM_0, &conf);
if (result != ESP_OK)
{
return result;
}
//安装驱动
return i2c_driver_install(I2C_NUM_0, conf.mode, 0, 0, 0);
}
读取原始角度,高位信息在0x0c,低位信息在0x0d,移位时需要注意。
void ReadAngle()
{
uint8_t angle_high = 0;
uint8_t angle_low = 0;
uint16_t result = 0;
float angle=0;
i2c_cmd_handle_t cmd;
//读取HighAddr
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, As5600_Addr << 1 | I2C_WRITE_MODE, ACK_CHECK_ENABLE);
i2c_master_write_byte(cmd, RawAngle_Addr, ACK_CHECK_ENABLE);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
vTaskDelay(1 / portTICK_PERIOD_MS);
cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, As5600_Addr << 1 | I2C_READ_MODE, ACK_CHECK_ENABLE);
i2c_master_read_byte(cmd, &angle_high, ACK); //0x0c是高位
i2c_master_read_byte(cmd, &angle_low, NACK);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
result=(uint16_t)(angle_high<<8|angle_low); //一共就11位 注意
angle=((int) result & 0b0000111111111111)*360.0/4096.0;
//angle=result*360.0/4096.0;
ESP_LOGI(AS_TAG,"%.2f",angle);
}
实验效果
下一阶段继续