给大家分享一个nrf51822+MPU6050输出姿态数据的单片机源程序如下:
- /****************************************Copyright (c)****************************************************
- **
- **
- **
- **--------------File Info---------------------------------------------------------------------------------
- ** File name: main.c
- ** Last modified Date:
- ** Last Version:
- ** Descriptions: 使用的SDK版本-SDK_11.0.0
- **
- **--------------------------------------------------------------------------------------------------------
- ** Created by: FiYu
- ** Created date: 2016-7-1
- ** Version: 1.0
- ** Descriptions: MPU6050输出姿态数据实验
- **--------------------------------------------------------------------------------------------------------*/
- #include <stdbool.h>
- #include <stdint.h>
- #include <stdio.h>
- #include "app_uart.h"
- #include "app_error.h"
- #include "nrf_delay.h"
- #include "nrf_gpio.h"
- #include "boards.h"
- #include "mpu6050.h"
- #include "twi_master.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- /* 开发板中MPU6050模块和串口串口占用的nRF51822管脚资源
- P0.09:UART_TXD :串口发送
- P0.11:UART_RXD :串口接收
- P0.08:UART_CTS
- P0.10:UART_RTS
- 串口需要短接对应的跳线帽
- P0.01:IIC时钟
- P0.04:IIC数据
- */
- #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
- #define UART_RX_BUF_SIZE 1 /**< UART RX buffer size. */
- void uart_error_handle(app_uart_evt_t * p_event)
- {
- if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
- {
- APP_ERROR_HANDLER(p_event->data.error_communication);
- }
- else if (p_event->evt_type == APP_UART_FIFO_ERROR)
- {
- APP_ERROR_HANDLER(p_event->data.error_code);
- }
- }
- //串口初始化。禁止流控,波特率:115200
- void uart_init(void)
- {
- uint32_t err_code;
- const app_uart_comm_params_t comm_params =
- {
- RX_PIN_NUMBER,
- TX_PIN_NUMBER,
- RTS_PIN_NUMBER,
- CTS_PIN_NUMBER,
- APP_UART_FLOW_CONTROL_DISABLED, //禁止流控
- false,
- UART_BAUDRATE_BAUDRATE_Baud115200//波特率115200
- };
- APP_UART_FIFO_INIT(&comm_params,
- UART_RX_BUF_SIZE,
- UART_TX_BUF_SIZE,
- uart_error_handle,
- APP_IRQ_PRIORITY_LOW,
- err_code);
- APP_ERROR_CHECK(err_code);
- }
- /***********************************************************************************
- * 描 述 : 串口发送数据,数据格式为匿名四轴上位机软件(V2.6版本)数据格式
- * 入 参 : fun:功能码
- * : dat:数据缓存区地址,最多28字节
- * : len:数据长度,最大28字节
- * 返回值 : 无
- **********************************************************************************/
- void Uart_SendDat_ToPC(uint8_t fun,uint8_t *dat,uint8_t len)
- {
- uint8_t send_buf[32];
- uint8_t i;
- if(len>28)return; //最多28字节数据
- send_buf[len+3]=0; //校验数置零
- send_buf[0]=0x88; //帧头
- send_buf[1]=fun; //功能码
- send_buf[2]=len; //数据长度
- for(i=0;i<len;i++)send_buf[3+i]=dat[i]; //复制数据
- for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i]; //计算校验和
- for(i=0;i<len+4;i++)app_uart_put(send_buf[i]); //串口输出数据
- }
- /***********************************************************************************
- * 描 述 : 发送加速度传感器数据和陀螺仪数据
- * 入 参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值
- * gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
- * 返回值 : 无
- **********************************************************************************/
- void mpu6050_send_dat(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
- {
- uint8_t tx_buf[12];
- tx_buf[0]=(aacx>>8)&0xFF;
- tx_buf[1]=aacx&0xFF;
- tx_buf[2]=(aacy>>8)&0xFF;
- tx_buf[3]=aacy&0xFF;
- tx_buf[4]=(aacz>>8)&0xFF;
- tx_buf[5]=aacz&0xFF;
- tx_buf[6]=(gyrox>>8)&0xFF;
- tx_buf[7]=gyrox&0xFF;
- tx_buf[8]=(gyroy>>8)&0xFF;
- tx_buf[9]=gyroy&0xFF;
- tx_buf[10]=(gyroz>>8)&0xFF;
- tx_buf[11]=gyroz&0xFF;
- Uart_SendDat_ToPC(0xA1,tx_buf,12);//自定义帧,0XA1
- }
- /***********************************************************************************
- * 描 述 : 串口上传MPU6050姿态数据
- * 入 参 : aacx,aacy,aacz:x,y,z三个方向上面的加速度值
- * : gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
- * : 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度
- * 返回值 : 无
- **********************************************************************************/
- void Uart_ReportIMU(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
- {
- uint8_t i,tx_buf[28];
- for(i=0;i<28;i++)tx_buf[i]=0;//清0
- tx_buf[0]=(aacx>>8)&0xFF;
- tx_buf[1]=aacx&0xFF;
- tx_buf[2]=(aacy>>8)&0xFF;
- tx_buf[3]=aacy&0xFF;
- tx_buf[4]=(aacz>>8)&0xFF;
- tx_buf[5]=aacz&0xFF;
- tx_buf[6]=(gyrox>>8)&0xFF;
- tx_buf[7]=gyrox&0xFF;
- tx_buf[8]=(gyroy>>8)&0xFF;
- tx_buf[9]=gyroy&0xFF;
- tx_buf[10]=(gyroz>>8)&0xFF;
- tx_buf[11]=gyroz&0xFF;
- tx_buf[18]=(roll>>8)&0xFF;
- tx_buf[19]=roll&0xFF;
- tx_buf[20]=(pitch>>8)&0xFF;
- tx_buf[21]=pitch&0xFF;
- tx_buf[22]=(yaw>>8)&0xFF;
- tx_buf[23]=yaw&0xFF;
- Uart_SendDat_ToPC(0xAF,tx_buf,28);//匿名四轴飞控显示帧,0xAF
- }
- /**********************************************************************************************
- * 描 述 : main函数
- * 入 参 : 无
- * 返回值 : 无
- ***********************************************************************************************/
- int main(void)
- {
- int16_t AccValue[3],GyroValue[3];
- uint8_t id;
- float pitch,roll,yaw; //欧拉角
- short aacx,aacy,aacz; //加速度传感器原始数据
- short gyrox,gyroy,gyroz; //陀螺仪原始数据
-
- nrf_gpio_cfg_output(LED_1);//配置管脚P0.21为输出,驱动指示灯D1
- nrf_gpio_pin_set(LED_1); //设置指示灯D1初始状态为熄灭
-
- uart_init(); //配置串口,禁止流控,波特率:115200
-
- twi_master_init();
-
- if(mpu6050_init(0x68) == false)
- {
- while (true)
- {
- printf("mpu6050 init fail\r\n");
- nrf_delay_ms(100);
- }
- }
- else
- {nrf_delay_ms(1000);printf("mpu6050 init ok\r\n");}
-
- mpu6050_register_read(0x75U, &id, 1);
- printf("mpu6050 id is %d \r\n",id);
-
- while(mpu_dmp_init())
- {
- nrf_delay_ms(1000);
- printf("mpu6050 init Error\r\n");
- }
- while (true)
- {
- if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
- {
- MPU6050_ReadAcc(&aacx,&aacy,&aacz); //读取加速度传感器数据
- MPU6050_ReadGyro(&gyrox,&gyroy,&gyroz); //读取陀螺仪数据
- mpu6050_send_dat(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
- Uart_ReportIMU(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
- nrf_delay_ms(50);
- }
- }
- }
- /********************************************END FILE*******************************************/
复制代码
所有资料51hei提供下载:
实验1 - MPU6050输出姿态数据.rar
(2.59 MB, 下载次数: 56)
|