在线等,着急了,mpu6050原始数据程序,为什么波形都没有啊

2019-03-24 17:50发布

楼主写的6050程序,用到 msp430测试的,想得到原始数据,显示在1602上面观察,IIC也调通了 啊,为什么显示成这个样子啊,求过来人指导
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
michael_llh
1楼-- · 2019-03-25 04:45
 精彩回答 2  元偷偷看……
faguoduifangui
2楼-- · 2019-03-25 06:18
michael_llh 发表于 2015-10-31 16:45
波形重要吗?数据对了就ok吧,不要去纠结这个

#include <msp430x14x.h>
#include "math.h"
/*功能模块头文件*/
#include "1602.h"
#include "mpu6050.h"
#include "Delay.h"
#define uint unsigned int
#define uchar unsigned char

#define pi 3.141592653
int ax,ay,az;             //---GetData()函数返回为int
int gx,gy,gz;             //存储原始数据
float aax,aay,aaz,ggx,ggy,ggz;//存储量化后的数据
float Ax,Ay,Az;               //单位 g(9.8m/s^2)
float Gx,Gy,Gz;               //单位 °/s
float Angle_accX,Angle_accY,Angle_accZ;//存储加速度计算出的角度
//char str[20];

void main()
{   
  WDTCTL = WDTPW + WDTHOLD;  
  delay(300);     //-上电延时
  BCSCTL1 &=~XT2OFF;
    do
      {
         IFG1 &=~OFIFG;
         for(uint i=0xff;i>0;i--);
       }
     while((IFG1&OFIFG));                                   //等待时钟稳定
     BCSCTL2 |=SELM_2+SELS;                              //主、从系统时钟均为高频
  //CtrlDir |= 0x07;                 //控制线端口设为输出状态
    //DataDir  = 0xFF;                 //数据端口设为输出状态  
    //DataPort  = 0x00;  
  P6DIR=0XFF;   P6OUT=0Xff;   //点亮液晶
  LcdReset();                    //液晶初始化
  //Delay1000ms();//----到底延时多久最好???
   delay(500);
  InitMPU6050();
  delay(200);
  while(1)  
    {   
        
       Display10BitData(Angle_accX,2,0); //显示X轴加速度
       delayms(250);*/
       //Display10BitData('An',2,1); //显示Y轴加速度
      Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度
      Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度
      Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速度
      
      Display10BitData(GetData(GYRO_XOUT_H),2,1);         //显示X轴角速度
      Display10BitData(GetData(GYRO_YOUT_H),7,1);         //显示Y轴角速度
      Display10BitData(GetData(GYRO_ZOUT_H),12,1);       //显示Z轴角速度
      delayms(250);
    }
}
主程序有错误吗???怎么lcd得到的数据也不对
michael_llh
3楼-- · 2019-03-25 07:37
faguoduifangui 发表于 2015-10-31 19:26
#include  
#include "math.h"
/*功能模块头文件*/
#include "1602.h"
#include "mpu6050.h"
#inclu ...

这个也不好说的程序有问题没有,再说你只有部分代码,6050的代码官方给的就是用430写的,你可以去看看
ljj3166
4楼-- · 2019-03-25 07:55
 精彩回答 2  元偷偷看……
faguoduifangui
5楼-- · 2019-03-25 13:30
michael_llh 发表于 2015-10-31 22:07
这个也不好说的程序有问题没有,再说你只有部分代码,6050的代码官方给的就是用430写的,你可以去看看

这是IIC的
#ifndef __IIC_H
#define __IIC_H
#include "Delay.h"
#define uint unsigned int
#define uchar unsigned char

//****端口定义--IIC时钟引脚定义P5^0;IIC数据引脚定义P5^1;**************************
#define SCL1 P5OUT |=BIT0  
#define SCL0 P5OUT &=~BIT0  
#define SCLOUT P5DIR |= BIT0;
#define SDA1 P5OUT |=BIT1   //IIC数据引脚
#define SDA0 P5OUT &=~BIT1  
#define SDAIN P5DIR &=~BIT1
#define SDAOUT P5DIR |=BIT1  
#define SDADATA P5IN & BIT1   //IIC数据SDA引脚定义P5^1,与运算,【取第1位】观察值;
#define SlaveAddress 0xD0     //IIC写入时的地址字节数据?+1为读取

/*********I2C开始信号*****************************/
void I2C_Start()
{
    SDAOUT;
    SDA1;                    //拉高数据线
    //SCLOUT;
    SCL1;                    //拉高时钟线
    delayus(5);                 //延时
    SDA0;                    //产生下降沿
    delayus(5);                  //延时
    SCL0;                    //拉低时钟线
}
/*********I2C停止信号*****************************/
void I2C_Stop()
{
    SDAOUT;
    SCL0;                    //拉低时钟线
    SDA0;                    //拉低数据线
    //SCLOUT;
     delayus(5);                   //延时
    SCL1;                    //拉高时钟线
    //delayus(5);                   //延时
    SDA1;                    //产生上升沿
    delayus(5);                  //延时
}  

void I2C_INIT()//?
{
  SCLOUT;
  SDAIN;
  SCL0;
  I2C_Stop();
}

//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK) ----I2C_SendACK(1);此时即为'非应答’信号
void I2C_SendACK(uchar ack)
{
    SDAOUT;
    //SCLOUT;
                  //---写应答信号
    if(ack)   
      SDA1; //--判断,ack=1即为NAK,SDA为高
    else
      SDA0; //--判断,ack=0即为ACK,SDA为低
//    SDA = ack;                  //写应答信号
    SCL1;                    //拉高时钟线
    delayus(5);                  //延时
    SCL0;                    //拉低时钟线
    delayus(5);                  //延时
}
//**************************************
//I2C接收应答信号
//**************************************
uchar I2C_RecvACK()
{
    uchar cy;
    SCLOUT;
    SCL1;                    //拉高时钟线
    SDAIN; //--接收
    delayus(5);              //延时
   
    if(SDADATA)         //--读应答信号=1即SDA为高,置1
        {
          cy=1;
        }
    else
        {
          cy=0;
        }
    //    cy = SDA;                   //读应答信号
    SCL0;                    //拉低时钟线
    delayus(5);                //延时
    SDAOUT;  
    return cy;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{
    uchar i;
    SDAOUT;                     //---发送
    for (i=0; i<8; i++)         //8位计数器     
    {
        if((dat<<i)&0x80)   //---送数据口   dat<<1 ??
          { SDA1;}
        else
           { SDA0;}
        
           SCLOUT;

            SCL1;                //拉高时钟线
            delayus(5);              //延时
            SCL0;                //拉低时钟线
            delayus(5);              //延时
    }
    I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节【数据】
//**************************************
uchar I2C_RecvByte()
{
    uchar i;
    uchar dat = 0,cy;
        SDAOUT;
        SCLOUT;
        SDA1;                    //使能内部上拉,准备读取数据,
        SDAIN;
        for (i=0; i<8; i++)         //8位计数器
        {
            dat<<= 1;
            SCL1;                //拉高时钟线
            delayus(5);             //延时
             if(SDADATA)  
              { cy=1; }
            else
              { cy=0; }
          dat |= cy;             //读数据         SCL0;                //拉低时钟线
          delayus(5);             //延时
        }
        SDAOUT; //???需要此语句吗?
        return dat;
}
//**************************************
//向I2C设备【写】入一个【字节】数据
//【内部】寄存器【地址】和内部寄存器【数据】****************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
    I2C_Start();                  //起始信号
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
    I2C_SendByte(REG_Address);    //内部寄存器地址?
    I2C_SendByte(REG_data);       //内部寄存器数据?
    I2C_Stop();                   //发送停止信号
}
//**************************************
//从I2C设备【读】取一个【字节】数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
     uchar REG_data;
     I2C_Start();                   //起始信号
     I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
     I2C_SendByte(REG_Address);     //发送存储单元地址?从0开始  
     I2C_Start();                   //起始信号
     I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
     REG_data=I2C_RecvByte();       //读出寄存器数据
     I2C_SendACK(1);                //接收应答信号
     I2C_Stop();                    //停止信号
     return REG_data;
}
#endif
这是主函数
#include <msp430x14x.h>
#include "math.h"
/*功能模块头文件*/
#include "1602.h"
#include "mpu6050.h"
#include "Delay.h"
#include "CLOCKINIT.h"
#define uint unsigned int
#define uchar unsigned char

void main()
{   
  WDTCTL = WDTPW + WDTHOLD;  
  delay(300);                    //-上电延时
  clockINIT();                   //-时钟初始化
  P6DIR=0XFF;   P6OUT=0Xff;      //点亮液晶
  LcdReset();                    //液晶初始化
   delay(500);
   I2C_INIT();
    delayms(500);
  InitMPU6050();
  delay(200);
  while(1)  
    {   
      Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度
      Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度
      Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速度
      
      Display10BitData(GetData(GYRO_XOUT_H),2,1);         //显示X轴角速度
      Display10BitData(GetData(GYRO_YOUT_H),7,1);         //显示Y轴角速度
      Display10BitData(GetData(GYRO_ZOUT_H),12,1);       //显示Z轴角速度
      delayms(250);
    }
}
这是6050的
#ifndef __mpu6050_H
#define __mpu6050_H

#include "IIC.h"
#include "Delay.h"
// 定义MPU6050内部地址
//****************************************
#define SMPLRT_DIV  0x19 //陀螺仪采样率?典型值?0x07(125Hz)
#define CONFIG   0x1A //低通滤波频率?典型值?0x06(5Hz)
#define GYRO_CONFIG  0x1B //陀螺仪自检及测量范围?典型值?0x18(不自检?2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率?典型值?0x01(不自检?2G?5Hz) ---里面有AFS_SEL
                          //--!!!!!!1根据AFS_sel设置的不同,【转换单位】需要除以相应的系数
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40

#define TEMP_OUT_H  0x41
#define TEMP_OUT_L  0x42

#define GYRO_XOUT_H  0x43
#define GYRO_XOUT_L  0x44  
#define GYRO_YOUT_H  0x45
#define GYRO_YOUT_L  0x46
#define GYRO_ZOUT_H  0x47
#define GYRO_ZOUT_L  0x48

#define PWR_MGMT_1  0x6B //电源管理?典型值?0x00(正常启用)
#define WHO_AM_I   0x75 //IIC地址寄存器(默认数值0x68?只读)
//#define SlaveAddress 0xD0 //IIC写入时的地址字节数据?+1为读取


//****************MPU6050
/********初始化MPU6050*/
//--向I2C设备【写】入一个【字节】数据
//--【内部】寄存器【地址】和内部寄存器数据*
void InitMPU6050()
{
  //Single_WriteI2C(PWR_MGMT_1, 0x80); //解除休眠状态
   /*int i=0,j=0;         //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
   for (i=0; i<1000; i++)
   {
      for (j=0; j<1000; j++)
      {;}
   }*/
   Single_WriteI2C(PWR_MGMT_1, 0x01); //选时钟
   Single_WriteI2C(SMPLRT_DIV, 0x07); //陀螺仪采样率1KHZ
   Single_WriteI2C(CONFIG, 0x06);      //加速度44hz滤波,陀螺仪42hz滤波
   Single_WriteI2C(GYRO_CONFIG, 0x18); //灵敏度---P14:±2000 °/s
   Single_WriteI2C(ACCEL_CONFIG, 0x01); ;//最大量程---P15:
}
//**********合成数据****************************
int GetData(uchar REG_Address)
{
   char H,L;
   H=Single_ReadI2C(REG_Address);
   L=Single_ReadI2C(REG_Address+1);
   return (H<<8)+L;   //合成数据 -->换具体函数
}

#endif
这是延时
#ifndef __Delay_H
#define __Delay_H

#define uint unsigned int
#define uchar unsigned char

#define CPU_F ((double)8000000)
#define delayus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))  //宏定义延时函数
#define delayms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


/*******************************************
函数名称:Delay5ms
功    能:延时约5ms
参    数:无
返回值  :无
********************************************/
void Delay5ms(void)
{
    uint i=40000;
    while (i != 0)
    {
        i--;
    }
}
/*******************************************
函数名称:delay5us
功    能:延时约15us的时间
参    数:无
返回值  :无
********************************************/
void delay5us(void)
{
    uchar i;
   
        for(i = 0;i < 15;i++)
          _NOP();
}
//功    能:延时约1000ms
void Delay1000ms(void)
{
    uint i,j;
    for(i=40000;i>0;i--)
    {
        for(j=200;j>0;j--);
    }
}
//延时
//****************************************
void delay(unsigned int k)        
{                                                
        unsigned int i,j;                                
        for(i=0;i<k;i++)
        {                        
                for(j=0;j<121;j++);
        }                                                
}

#endif
。。。求帮忙看看,实在愁怀了,一周了
faguoduifangui
6楼-- · 2019-03-25 19:10
ljj3166 发表于 2015-10-31 22:11
上位机有通信格式的,单片机符合这个格式吗

大神,楼主在下楼给出了全部程序,帮忙看看可以吗

一周热门 更多>