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

主控用的是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读后,后面的所有问题就都解决了,欧拉角也读了出来

 

 

二、硬件部分

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

 

风力摆

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dz小伟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值