六轴传感器 SH3001

本文详细介绍了Senodia公司的SH3001六轴姿态传感器,包括其功能(加速度和角速度测量)、工作原理(姿态融合),以及如何通过IIC接口进行数据读写,包括初始化、寻址和姿态解算过程。

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

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驱动步骤 (非中断方式)

  1. 初始化SH3001:调用iic_init()进行IIC接口初始化
  2. 编写SH3001基础读写接口函数:多字节写、多字节读
  3. 重置内部模块:启动驱动、ADC复位、CVA复位(厂家建议)
  4. 配置加速度计、陀螺仪、温度传感器:配置A/G输出频率、量程、截止频率
  5. 选择SH3001电源模式:设置为正常模式(高性能模式)(厂家函数接口)
  6. 读取原始数据:获取加速度计数据、陀螺仪数据、温度数据(更精确得考虑补偿)

在这里插入图片描述

  • SENB连接到VCC,选择使用IIC接口
  • SDO连接到GND,参与决定器件地址

姿态解算

姿态解算指读取传感器数据,实时算出飞行器的姿态角(偏航角yaw、俯仰角pitch、横滚角roll)

利用加速度计测量角度(俯仰角与横滚角):
假设载体处于静止水平放置,此时加速度计仅受重力作用,从Z轴可读到1g数据(g为重力加速度),X轴和Y轴两个方向读到0。

采用多种传感器数据来检测姿态的处理算法被称为“姿态融合”。

MPU6050传感器实验STM32F407开发板KEIL软件工程源码: void usart1_send_char(u8 c) { while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)==RESET){}; USART1->DR=c; } //传送数据给匿名四上位机软件(V2.6版本) //fun:功能字. 0X01~0X1C //data:数据缓存区,最多28字节!! //len:data区有效数据个数 void usart1_niming_report(u8 fun,u8*data,u8 len) { u8 send_buf[32]; u8 i; if(len>28)return; //最多28字节数据 send_buf[len+3]=0; //校验数置零 send_buf[0]=0XAA; //帧头 send_buf[1]=0XAA; //帧头 send_buf[2]=fun; //功能字 send_buf[3]=len; //数据长度 for(i=0;i<len;i++)send_buf[4+i]=data[i]; //复制数据 for(i=0;i<len+4;i++)send_buf[len+4]+=send_buf[i]; //计算校验和 for(i=0;i>8)&0XFF; tbuf[1]=aacx&0XFF; tbuf[2]=(aacy>>8)&0XFF; tbuf[3]=aacy&0XFF; tbuf[4]=(aacz>>8)&0XFF; tbuf[5]=aacz&0XFF; tbuf[6]=(gyrox>>8)&0XFF; tbuf[7]=gyrox&0XFF; tbuf[8]=(gyroy>>8)&0XFF; tbuf[9]=gyroy&0XFF; tbuf[10]=(gyroz>>8)&0XFF; tbuf[11]=gyroz&0XFF; tbuf[12]=0;//因为开启MPL后,无法直接读取磁力计数据,所以这里直接屏蔽掉.用0替代. tbuf[13]=0; tbuf[14]=0; tbuf[15]=0; tbuf[16]=0; tbuf[17]=0; usart1_niming_report(0X02,tbuf,18);//传感器帧,0X02 } //通过串口1上报结算后的姿态数据给电脑(状态帧) //roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00 -> 180.00度 //pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度 //yaw:航向角.单位为0.1度 0 -> 3600 对应 0 -> 360.0度 //csb:超声波高度,单位:cm //prs:气压计高度,单位:mm void usart1_report_imu(short roll,short pitch,short yaw,short csb,int prs) { u8 tbuf[12]; tbuf[0]=(roll>>8)&0XFF; tbuf[1]=roll&0XFF; tbuf[2]=(pitch>>8)&0XFF; tbuf[3]=pitch&0XFF; tbuf[4]=(yaw>>8)&0XFF; tbuf[5]=yaw&0XFF; tbuf[6]=(csb>>8)&0XFF; tbuf[7]=csb&0XFF; tbuf[8]=(prs>>24)&0XFF; tbuf[9]=(prs>>16)&0XFF; tbuf[10]=(prs>>8)&0XFF; tbuf[11]=prs&0XFF; usart1_niming_report(0X01,tbuf,12);//状态帧,0X01 } int main(void) { u8 t=0,report=1; //默认开启上报
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值