SH3001简介
SH3001是Senodia公司生产的一款六轴姿态传感器,可测量芯片自身X、Y、Z轴的加速度以及角速度参数,通过姿态融合,进而得到姿态角。
三轴加速度计(Accelerometer):测量X、Y、Z轴的加速度。
三轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度。
小球完全悬空时,对每个面都没有施加力,所以每个方向的加速度都为0.
当物体向x+轴运动,小球由于惯性,对x-轴施加力(相反方向)。
哪个面受力,就哪个面产生值。
低通滤波器允许低于截止频率的信号通过,高于截止频率的信号不能通过,可平滑去噪。
加速度计数据获取:
acc_x = ACC_XDATA_H << 8 | ACC_XDATA_L
acc_y = ACC_YDATA_H << 8 | ACC_YDATA_L
acc_z = ACC_ZDATA_H << 8 | ACC_ZDATA_L
要使数据更精确,通过厂家提供的函数接口,读取补偿系统
SH3001时序
SH3001寻址
- 设备地址:固定位+硬件选择位(0110110)0x36
- 通讯地址:固定位+硬件选择位+数据传输方向位(0x36 << 1)| (R/W)
- 写操作地址:(01101100)0x6c
- 读操作地址:(01101101)0x6d
SH3001读取N字节函数
void sh3001_read_nbytes(uint8_t devaddr, uint8_t regaddr, uint8_t length, uint8_t *readbuf)
{
iic_start(); //主机发送起始信号
iic_send_byte(devaddr << 1 | 0x00); //主机发送sh3001写操作地址
iic_wait_ack(); //主机等待sh3001应答
iic_send_byte(regaddr); //主机发送寄存器地址
iic_wait_ack(); //主机等待sh3001应答
iic_start(); //主机发送起始信号
iic_send_byte(devaddr << 1 | 0x01); //主机发送sh3001读操作地址
iic_wait_ack();
for(uint8_t i=0; i<length; i++)
{
readbuf[i] = iic_read_byte(i == (length-1) ? 0:1); //为1时发送应答信号,为0时发送非应答信号。
}
iic_stop();
}
SH3001写入N字节函数
void sh3001_write_nbytes(uint8_t devaddr, uint8_t regaddr, uint8_t length, uint8_t *writebuf)
{
iic_start(); //主机发送起始信号
iic_send_byte(devaddr<<1 | 0x00); //主机发送sh3001写操作地址
iic_wait_ack();
iic_send_byte(regaddr);
iic_wait_ack();
for(uint8_t i=0; i<length; i++)
{
iic_send_byte(writebuf[i]);
iic_wait_ack();
}
iic_stop();
}
SH3001驱动步骤 (非中断方式)
- 初始化SH3001:调用iic_init()进行IIC接口初始化
- 编写SH3001基础读写接口函数:多字节写、多字节读
- 重置内部模块:启动驱动、ADC复位、CVA复位(厂家建议)
- 配置加速度计、陀螺仪、温度传感器:配置A/G输出频率、量程、截止频率
- 选择SH3001电源模式:设置为正常模式(高性能模式)(厂家函数接口)
- 读取原始数据:获取加速度计数据、陀螺仪数据、温度数据(更精确得考虑补偿)
- SENB连接到VCC,选择使用IIC接口
- SDO连接到GND,参与决定器件地址
姿态解算
姿态解算指读取传感器数据,实时算出飞行器的姿态角(偏航角yaw、俯仰角pitch、横滚角roll)
利用加速度计测量角度(俯仰角与横滚角):
假设载体处于静止水平放置,此时加速度计仅受重力作用,从Z轴可读到1g数据(g为重力加速度),X轴和Y轴两个方向读到0。
采用多种传感器数据来检测姿态的处理算法被称为“姿态融合”。