马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
第三十四章 QMI8658A实验
本章,我们将先容一款高性价比六轴(三轴角速率(陀螺仪)+三轴加快度)传感器:QMI8658A,该传感器可广泛用于四轴、平衡车和空中鼠标等计划,性价比极高,具有非常广泛的应用范围。我们将继承使用ESP32-P4的硬件IIC接口去驱动板载QMI8658A传感器,读取其原始数据,并把原始数据转换为pitch俯仰角、roll翻滚角和yaw偏航角,终极表现在LCD上。
本章分为如下几个末节:
34.1 QMI8658A先容
34.2 硬件计划
34.3 步伐计划
34.4 下载验证
34.1 QMI8658A先容
QMI8658A内部集成有3轴陀螺仪和3轴加快度计,可以通过I3C、I2C和3线或4线SPI的接口和单片机举行数据交互,传输速率可达400kHZ/s。陀螺仪的角速率丈量范围最高达±2048°/s,具有良好的动态相应特性。加快度计的丈量范围最大为±16g(g为重力加快度),静态丈量精度高。
QMI8658A的特点包罗:1、陀螺仪13 mdps/Hz的低噪声,低耽误,宽带宽;2、150μg/Hz的加快度计噪声;3、自带一个温度数字传感器;4、可编程数字滤波器;5、集成计步器,轻拍,恣意活动,移动,显着活动检测;5、自带1536字节FIFO可用于缓冲传感器数据,低落体系功耗;6、超小封装尺寸:2.5×3.0×0.86mm(LGA)。
QMI8658A传感器的检测轴如图34.1.1所示:
图34.1.1QMI8658A检测轴及其方向
QMI8658A的内部框图如图34.1.2所示:
图34.1.2 QMI8658A框图
QMI8658A的引脚分析如下表所示。
表34.1.1 QMI8658A引脚分析
QMI8658A和主控芯片只必要毗连SCL、SDA和INT,就可以实现驱动。其SCL和SDA同24C02、XL9555、AP3216C共用,毗连在IO32和IO33上,INT脚毗连在XL9555的IO1_4上。
34.1.1 QMI8658A寻址
要举行IIC通讯,起首得知道器件地点,QMI8658A器件地点是7位的,详细格式如下表。
表34.1.1.1 QMI8658A地点格式
QMI8658A的器件地点会由SA0决定的,简朴来说,由SA0引脚现实的硬件毗连决定。ESP32-P4开辟板上的QMI8658A电路中,SA0是毗连到3V3即高电平,以是QMI8658A的器件地点为“1101011”即0x6B。读使用地点就为0xD7(0x6B 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; /* 无磁力计数据,以是这里直接屏蔽掉.用0替换. */ tbuf[12]=0; tbuf[13]=0; tbuf[14]=0; tbuf[15]=0; tbuf[16]=0; tbuf[17]=0; usart0_niming_report(0X02, tbuf, 18); /* 自界说帧,0X02 */}/** * @brief 通过串口1上报结算后的姿态数据给电脑 * @param roll: 横滚角.单位0.1度。 -9000 -> 9000 对应 -90.00 -> 90.00度 * @param pitch: 俯仰角.单位 0.1度。-18000 -> 18000 对应 -180.00 -> 180.00 度 * @param yaw: 航向角.单位为0.1度 -18000 -> 18000 对应 -180.00 -> 180.00 度 * @param prs: 气压计高度,单位:cm * @param fly_mode : 飞行模式 * @param armed: 锁定状态 * @retval 无 */void usart0_report_imu(short roll, short pitch, short yaw, int prs, uint8_t fly_mode, uint8_t armed){ uint8_t 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] = (prs >> 24) & 0XFF; tbuf[7] = (prs >> 16) & 0XFF; tbuf[8] = (prs >> 8) & 0XFF; tbuf[9] = prs & 0XFF; tbuf[10] = fly_mode; tbuf[11] = armed; usart0_niming_report(0X01, tbuf, 12); /* 状态帧,0X01 */}void app_main(void){ esp_err_t ret; uint8_t t = 0; uint8_t key; uint8_t report = 0; float gyro[3]; float accel[3]; float euler_angle[3] = {0, 0, 0}; ret = nvs_flash_init(); /* 初始化NVS */ if(ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ESP_ERROR_CHECK(nvs_flash_init()); } led_init(); /* LED初始化 */ key_init(); /* KEY初始化 */ lcd_init(); /* LCD屏初始化 */ uart0_init(115200); /* 初始化UART */ lcd_show_string(30, 50, 200, 16, 16, "ESP32-P4", RED); lcd_show_string(30, 70, 200, 16, 16, "QMI8658A TEST", RED); lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED); lcd_show_string(30, 110, 200, 16, 16, "BOOT:UPLOAD ON/OFF", RED); while (qmi8658_init() != 0) /* 初始化QMI8658A */ { lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Error!", RED); vTaskDelay(pdMS_TO_TICKS(200)); lcd_fill(30, 130, 239, 156, WHITE); vTaskDelay(pdMS_TO_TICKS(200)); } lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Ready!", RED); lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE); lcd_show_string(30, 170, 200, 16, 16, " Temp: . C", BLUE); lcd_show_string(30, 190, 200, 16, 16, " itch: . C", BLUE); lcd_show_string(30, 210, 200, 16, 16, " Roll: . C", BLUE); lcd_show_string(30, 230, 200, 16, 16, " Yaw: . C", BLUE); while (1) { qmi8658_read_xyz(accel, gyro); key = key_scan(0); if (key == BOOT_PRES) /* 0.2秒左右更新一次三轴原始值 */ { /* 切换匿名数据上报开关 */ report = !report; if (report == 0) { lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE); } else { lcd_show_string(30, 150, 200, 16, 16, "UPLOAD ON ", BLUE); } } /* 获取并表现温度 */ show_data(30, 170, qmi8658_get_temperature()); /* 获取并表现欧拉角 */ if (g_imu_init) { imu_get_eulerian_angles(accel, gyro, euler_angle, IMU_DELTA_T); show_data(30, 190, euler_angle[0]); show_data(30, 210, euler_angle[1]); show_data(30, 230, euler_angle[2]); if (report != 0) { /* 上报匿名状态帧 */ qmi8658a_send_data(accel[0], accel[1], accel[2], gyro[0], gyro[1], gyro[2]); /* 发送加快度+陀螺仪原始数据 */ /* Pitch和Roll角位置变更 */ usart0_report_imu((int)(euler_angle[1] * 100), (int)(euler_angle[0]*100), (int)(euler_angle[2]*100), 0, 0, 0); } } t++; if (t == 100) { t = 0; LED0_TOGGLE(); } vTaskDelay(pdMS_TO_TICKS(10)); }}[/code]这部分代码除了app_main函数,尚有几个函数,用于上报数据给上位机软件,使用上位机软件表现传感器波形以及3D姿态表现,有助于更好的调试QMI8658A。上位机软件使用ANO_TC匿名科创地面站v4.exe,该软件在:开辟板光盘→6,软件资料→软件→5,其他软件→匿名地面站文件夹里可以找到,该软件的使用方法,见该文件夹下的:飞控通讯协议v1.3-0720.pdf,这里我们不做先容。此中,usart0_niming_report函数用于将数据打包、盘算校验和,然后上报给匿名地面站上位机软件。qmi8658a_send_data函数用于上报加快度和陀螺仪的原始数据,可用于波形表现传感器数据,通过传感器帧(0X02)发送。而uasrt0_report_imu函数,则用于发送匿名状态帧,可以及时3D表现QMI8658A的姿态,传感器数据等,通过状态帧(0X01)发送。
在app_main函数中,设置一个while循环去初始化QMI8658A,若QMI8658A乐成被初始化,步伐便可往下实行。在while循环中会调用qmi8658_read_xyz和qmi8658_get_temperature函数读取加快度计、陀螺仪和温度,然后imu_get_eulerian_angles函数会根据加快度计和陀螺仪的值举行运算得出欧拉角。若按下BOOT按键便可以开启数据上传功能,通过上位机(ANO_TC匿名科创地面站)可以及时表现QMI8658A的传感器状态曲线,并表现3D姿态。
34.4 下载验证
将步伐下载到开辟板后,可以看到LED0不绝的闪灼,提示步伐已经在运行了。LCD表现的内容如下图所示:
图34.4.1 QMI8658A实验步伐运行效果图
屏幕表现了QMI8658A的温度、俯仰角(Pitch)、横滚角(Roll)和航向角(Yaw)的数值。然后,我们可以晃动开辟板,看看各角度的厘革。
别的,模块默认是关闭状态,通过按下BOOT可以开启或关闭数据上报,在开启状态下,我们可以打开:ANO_TC匿名科创地面站v4.exe这个软件,汲取ESP32-P4上传的数据,从而图形化表现飞行姿态,如图34.4.2所示:
图34.4.2 飞控状态表现
|