电赛风力摆制作过程中遇到的问题

举报
dz小伟 发表于 2022/11/12 18:46:17 2022/11/12
【摘要】 ​ 主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试一、软件部分1.MPU6050,DMP读取欧拉角这个过程中遇到很多问题,首先移植DMP固件库需要以下6个文件​编辑修改inv_mpu.c文件里的一些3个函数,第一个是iic写,第二个iic连续读,第三个延时​编辑然后就是6050初始化和DMP初始化我移植完后发现DMP初始化出错了,然...

 主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试

一、软件部分

1.MPU6050,DMP读取欧拉角

  1. 这个过程中遇到很多问题,首先移植DMP固件库
    需要以下6个文件
    编辑
    修改inv_mpu.c文件里的一些3个函数,第一个是iic写,第二个iic连续读,第三个延时
    编辑
  2. 然后就是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;
    }
  3. 解决上面的iic读后,后面的所有问题就都解决了,欧拉角也读了出来



二、硬件部分

因为材料比较短缺加上线太硬杆还是拿筷子做的,做出来后平衡性不是太好,想尽各种办法使他达到平衡,下面是最终的效果图

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。