主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试
一、软件部分
1.MPU6050,DMP读取欧拉角
- 这个过程中遇到很多问题,首先移植DMP固件库
需要以下6个文件
修改inv_mpu.c文件里的一些3个函数,第一个是iic写,第二个iic连续读,第三个延时 - 然后就是6050初始化和DMP初始化
我移植完后发现DMP初始化出错了,然后就一步一步的调试,先是发现第四步,加载dmp固件dmp_load_motion_driver_firmware()函数出了问题,最终发现是memcmp(firmware+ii, cur, this_write) 这步过不去,当我把前面的LOAD_CHUNK (16) 16改为1 后发现通过了,就觉得是我的iic读函数出了问题,但我是完全移植的stm32的程序,怎么会出错呢?然后我就跳过了这步的错误参数改为1,继续往后调试(最终我的决定是错误的,问题就出在这里的iic读,这里浪费了很多时间)
最终发现是iic读里面的发送应答出了问题,我把发送ack和nack换成了2个函数,发现错误完美解决了/************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void MPU_SendACK(uchar ack) { MPU_SCL = 0; GPIO_MultiBits_Init(MPU_SDA_PORT,MPU_SDA_PIN,GPO); MPU_SDA = ack; //写应答信号 DELAY_US(1); MPU_SCL = 1; //拉高时钟线 DELAY_US(1); //延时 MPU_SCL = 0; //拉低时钟线 } void MPU6500_I2C_ack(void) { MPU_SCL=0; GPIO_MultiBits_Init(MPU_SDA_PORT,MPU_SDA_PIN,GPO); MPU_SDA=0; MPU_SCL=1; DELAY_US(1); MPU_SCL=0; DELAY_US(1); MPU_SDA=1; } void MPU6500_I2C_NoAck(void) { MPU_SCL=0; GPIO_MultiBits_Init(MPU_SDA_PORT,MPU_SDA_PIN,GPO); MPU_SDA=1; DELAY_US(1); MPU_SCL=1; DELAY_US(1); MPU_SCL=0; DELAY_US(1); } /************************************** 从IIC总线接收一个字节数据 **************************************/ uchar MPU_RecvByte(unsigned char ack) { unsigned char i,receive=0; GPIO_MultiBits_Init(MPU_SDA_PORT,MPU_SDA_PIN,GPI);//SDA设置为输入 for(i=0;i<8;i++ ) { MPU_SCL=0; DELAY_US(2); MPU_SCL=1; receive<<=1; if(P3IN&BIT5)receive++; DELAY_US(2); } if (ack) //MPU_SendACK(0); //发送ACK MPU6500_I2C_ack(); else //MPU_SendACK(1);//发送nACK MPU6500_I2C_NoAck(); return receive; } /*iic连续读函数*/ int i2cRead(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf) { MPU_Start(); Write_MPU_Byte(addr << 1); if (!MPU_RecvACK()) { MPU_Stop(); return 1; } Write_MPU_Byte(reg); MPU_RecvACK(); MPU_Start(); Write_MPU_Byte((addr << 1)+1); MPU_RecvACK(); while (len) { if (len == 1) *buf = MPU_RecvByte(0);//发送ack else *buf = MPU_RecvByte(1);//发送nack buf++; len--; } MPU_Stop(); return 0; }
- 解决上面的iic读后,后面的所有问题就都解决了,欧拉角也读了出来
二、硬件部分
因为材料比较短缺加上线太硬杆还是拿筷子做的,做出来后平衡性不是太好,想尽各种办法使他达到平衡,下面是最终的效果图
风力摆