[ESP32]:AS5600角度传感器驱动

这篇博客介绍了如何使用I2C驱动初始化AS5600角度传感器,并详细展示了读取原始角度数据的步骤。通过发送I2C命令读取高位和低位信息,然后进行移位和转换,最终得到0到360度的角度值。实验结果显示了读取过程的成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}

实验效果

在这里插入图片描述
下一阶段继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值