This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C1294NCPDT:MPU6050/senosrlib

Guru**** 2465890 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663501/ccs-tm4c1294ncpdt-mpu6050-senosrlib

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

大家好、我想读取 mpu6050加速计和陀螺仪数据。 但它显示了所有数据0。

我已经阅读了。 该查询与该问题相关。

但在我的案例中、这不起作用、我不知道原因。  

传感器与 Arduino 配合工作正常。

但使用 tm4c1294显示零值。

这是我的代码。

#include 
#include 
#include 
#include 
#include 
#include 
include "sensorlib/i2cm_drv.h"
#include "sensorlib/i2cm_drv.c"
#include "sensorlib/hw_mpu6050.h"
#include "hw/mpu6050.inc"
#include "hw/driverlib"












#包含"hw_rom_driver.h"#include "#driverlib/driver.h"#include"#hw_driverinc/包含"hw_包含"hw_intrintrl.包含"#hw_driver.h"#driverinc/包含"#driverlib.inc/包含"#driver.h"#def"#def"#driverinc/包含"#driverinc/包含"#hw_inc/包含"#hw_inc/包含"#driverlib.intrl.inc/包含"#driver.h"#driverintrinc/包含"#def"#"#def"#"#def"#def"#"#"#"#def"#def"#def"#def"hw_inc/包含"#def"#def"#def"#def"#"#








当 MPU6050命令完成时设置的布尔值。
//
volatile bool g_bMPU6050Done = true;
tI2CMInstance g_sI2CMSSimpleInst;
tMPU6050 sMPU6050;

void DelaySoft (volatile unsigned long ulDelay){
SysCtlDelay ((SysCtlClockGet ()/ 10000)* ulDelay);
}

//
中断处理程序。
//
void I2CMSSimpleIntHandler (void)
{
//
调用 I2C 主驱动程序中断处理程序。
//
I2CMIntHandler (&g_sI2CMSSimpleInst);
}

void MPU6050Callback1 (void * pvCallbackData、uint_fast8_t ui8Status)
{
//
//查看是否发生错误。
//
if (ui8Status!= I2CM_STATUS_SUCCESS)
{
//
//发生错误,所以如果需要,请在此处处理。
//
}
//
////表示 MPU6050传输已完成。
//
G_bMPU6050Done = true;
}






void InitI2C0 (void)
{
//启用 I2C 模块0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

//启用包含 I2C 0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB)

的 GPIO 外设;//为端口 B2和 B3上的 I2C0函数配置引脚复用。
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

I2CIntRegister (I2C0_BASE、 I2CMSSimpleIntHandler);
IntMasterEnable();

//初始化 I2C 主驱动程序。
I2CMInit (&g_sI2CMSSimpleInst、I2C0_BASE、INT_I2C0、0xff、0xff、 SysCtlClockGet ();
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、TRUE);
}

//此示例在 I2C 事务完成后作为回调提供的函数。


//
// UARTstdio
//*********
void ConfigureUART (void)
{
// UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
// UART0外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

// GPIO
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_UART1_UART0
);GPIO_PIN_0_PIN_0_PIN_0_0_Pin;GPIO_PUT0_PIN_0_Pin;GPIO_PUT0_PIN_PIN_0_0_0Pin)

// 16MHz
UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);
// Colsole I/O
UARTStdioConfig (0、115200、16000000);
}


char buf[100];
char * ftoa (float f)
{
int pos=0、ix、DP、num、num、
if (f=0+=0+





)









;(f=0+= 0+= 0+);(f+


= 0+= 0+=);(f+= 0+= 0+= 0+);(f+= 0+= 0+= 0+);(f+= 0+= 0+);(f+= 0+= 0+= 0+= 0+);(f+= 0+)
f=f*10.0;
dp--;
}
返回 buf;
}


void MPU6050Example (void){
fAccel[3]、fGyro[3];

UARTprintf ("MPU6050初始化\n");
//在地址0x3C 向 I2C 器件写入两个字节的数据。
G_bMPU6050Done = false;
uint_fast8_t 结果= MPU6050Init (&sMPU6050、&g_sI2CMSSimpleInst、0x68、MPU6050Callback1、0);
while (!g_bMPU6050Done)
{
}

UARTprintf ("将 MPU6050配置为+/- 4g 加速计范围\n");
//从地址0x3C 的 I2C 器件读取四个字节的数据。
G_bMPU6050Done = false;
MPU6050ReadModifyWrite (&sMPU6050、MPU6050_O_ACCEL_CONFIG、~MPU6050_ACCEL_CONFIG_AFS_SEL_M、
MPU6050_ACCEL_CONFIG_AFS_SEL_4G、 MPU6050Callback1、0);
while (!g_bMPU6050Done){
}

//循环从 MPU6050永久读取数据
while (1){
//从 MPU6050请求另一个读数
G_bMPU6050Done = false;
MPU6050DataRead (&sMPU6050、MPU6050Callback1、0);
while (!g_bMPU6050Done){
}

//获取新的加速计和陀螺仪读数。
MPU6050DataAccelGetFloat (&sMPU6050、&fAccel[0]、&fAccel[1]、&fAccel[2]);
MPU6050DataGyroGetFloat (&sMPU6050、&fGyro[0]、&fGyro[1]、&fGyro[2]);

UARTprintf ("从 MPU6050接收完整数据\n");
UARTprintf ("Accel x =%s"、fta (fAccel[0]));
UARTprintf ("、y =%s"、fta (fAccel[1]));
UARTprintf ("、z =%s\n"、ftoa (fAccel[2]));
UARTprintf ("Gyro x =%s"、ftoa (fGyro[0]));
UARTprintf ("、y =%s"、fta (fGyro[1]));
UARTprintf ("、z =%s\n"、fta (fGyro[2]));

//DelaySoft (1000);
}
}

int main ()
{
//
将系统时钟设置为从具有晶振基准的 PLL 以40MHz 的频率运行
//
printCtlClockSet (sysctl_SYSDIV_5 | sysctL_use_PLL | sysctl_X2C_16MHz | sysctL_oc_main);

//



配置 UART0 (/UART0)





;// UART0 (uurePrint ();// UART0)(/uart ()(/uart)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、m_vedsharma、

    查看您的代码、您似乎对文档中的 sensorlib 示例进行了一些修改。 您是否尝试按原样使用该示例、如果是、您是否成功地读取了数据? 了解问题是否源于您所做的修改、将会有所帮助、因为如果是、我们可以真正了解潜在问题。

    此外、您能否使用调试器检查 MPU6050Init 的输出? 这将告诉我们 MPU6050是否已正确初始化。

    我还注意到 sMPU6050作为全局变量显示出来、但它未用于其他函数、您现在是否可以将其返回到 MPU6050Example 中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您 Ralph Jacobi 的回复

    正如您说过的、将  sMPU6050放回 MPU6050Example 中。

    我也这样做了。  

    现在、我从传感器获取值。

    但值是静态的、在我更改传感器位置时不会改变

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    include "sensorlib/i2cm_drv.h"
    #include "sensorlib/i2cm_drv.c"
    #include "sensorlib/hw_mpu6050.h"
    #include "hw/mpu6050.inc"
    #include "hw/driverlib"
    
    
    
    
    
    
    
    
    
    
    
    
    #包含"hw_rom_driver.h"#include "#driverlib/driver.h"#include"#hw_driverinc/包含"hw_包含"hw_intrintrl.包含"#hw_driver.h"#driverinc/包含"#driverlib.inc/包含"#driver.h"#def"#def"#driverinc/包含"#driverinc/包含"#hw_inc/包含"#hw_inc/包含"#driverlib.intrl.inc/包含"#driver.h"#driverintrinc/包含"#def"#"#def"#"#def"#def"#"#"#"#def"#def"#def"#def"hw_inc/包含"#def"#def"#def"#def"#"#
    
    
    
    
    
    
    
    
    该位在 MPU6050命令完成后置位。
    //
    volatile bool g_bMPU6050Done = true;
    tI2CMInstance g_sI2CMSSimpleInst;
    
    
    void DelaySoft (volatile unsigned long ulDelay){
    SysCtlDelay (((SysCtlClockGet ()/ 10000)* ulDelay);
    }
    
    //
    I2C 模块的中断处理程序。
    //
    void I2CMSSimpleIntHandler (void)
    {
    //
    调用 I2C 主驱动程序中断处理程序。
    //
    I2CMIntHandler (&g_sI2CMSSimpleInst);
    }
    
    void MPU6050Callback1 (void * pvCallbackData、uint_fast8_t ui8Status)
    {
    //
    //查看是否发生错误。
    //
    if (ui8Status!= I2CM_STATUS_SUCCESS)
    {
    //
    //发生错误,所以如果需要,请在此处处理。
    //
    }
    //
    ////表示 MPU6050传输已完成。
    //
    G_bMPU6050Done = true;
    }
    
    
    
    
    
    
    void InitI2C0 (void)
    {
    //启用 I2C 模块0
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    
    //启用包含 I2C 0
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB)
    
    的 GPIO 外设;//为端口 B2和 B3上的 I2C0函数配置引脚复用。
    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    
    //为这些引脚选择 I2C 功能。
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    
    I2CIntRegister (I2C0_BASE、 I2CMSSimpleIntHandler);
    IntMasterEnable();
    
    //初始化 I2C 主驱动程序。
    I2CMInit (&g_sI2CMSSimpleInst、I2C0_BASE、INT_I2C0、0xff、0xff、 SysCtlClockGet ();
    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、TRUE);
    }
    
    //此示例在 I2C 事务完成后作为回调提供的函数。
    
    
    //
    // UARTstdio
    //*********
    void ConfigureUART (void)
    {
    // UART
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    // UART0外设
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    
    // GPIO
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_UART1_UART0
    );GPIO_PIN_0_PIN_0_PIN_0_0_Pin;GPIO_PUT0_PIN_0_Pin;GPIO_PUT0_PIN_PIN_0_0_0Pin)
    
    // 16MHz
    UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);
    // Colsole I/O
    UARTStdioConfig (0、115200、16000000);
    }
    
    
    char buf[100];
    char * ftoa (float f)
    {
    int pos=0、ix、DP、num、num、
    if (f=0+=0+
    
    
    
    
    
    )
    
    
    
    
    
    
    
    
    
    ;(f=0+= 0+= 0+);(f+
    
    
    = 0+= 0+=);(f+= 0+= 0+= 0+);(f+= 0+= 0+= 0+);(f+= 0+= 0+);(f+= 0+= 0+= 0+= 0+);(f+= 0+)
    f=f*10.0;
    dp--;
    }
    返回 buf;
    }
    
    
    void MPU6050Example (void){
    fAccel[3]、fGyro[3];
    tMPU6050 sMPU6050;
    
    UARTprintf ("MPU6050初始化\n");
    //在地址0x3C 向 I2C 器件写入两个字节的数据。
    G_bMPU6050Done = false;
    uint_fast8_t 结果= MPU6050Init (&sMPU6050、&g_sI2CMSSimpleInst、0x68、MPU6050Callback1、0);
    while (!g_bMPU6050Done)
    {
    }
    
    UARTprintf ("将 MPU6050配置为+/- 4g 加速计范围\n");
    //从地址0x3C 的 I2C 器件读取四个字节的数据。
    G_bMPU6050Done = false;
    MPU6050ReadModifyWrite (&sMPU6050、MPU6050_O_ACCEL_CONFIG、~MPU6050_ACCEL_CONFIG_AFS_SEL_M、
    MPU6050_ACCEL_CONFIG_AFS_SEL_4G、 MPU6050Callback1、0);
    while (!g_bMPU6050Done){
    }
    
    //循环从 MPU6050永久读取数据
    while (1){
    //从 MPU6050请求另一个读数
    G_bMPU6050Done = false;
    MPU6050DataRead (&sMPU6050、MPU6050Callback1、0);
    while (!g_bMPU6050Done){
    }
    
    //获取新的加速计和陀螺仪读数。
    MPU6050DataAccelGetFloat (&sMPU6050、&fAccel[0]、&fAccel[1]、&fAccel[2]);
    MPU6050DataGyroGetFloat (&sMPU6050、&fGyro[0]、&fGyro[1]、&fGyro[2]);
    
    // UARTprintf ("从 MPU6050\n"接收完整数据);
    UARTprintf ("Accel x =%s"、fta (fAccel[0]));
    UARTprintf ("、y =%s"、fta (fAccel[1]));
    UARTprintf ("、z =%s\n"、ftoa (fAccel[2]));
    UARTprintf ("Gyro x =%s"、ftoa (fGyro[0]));
    UARTprintf ("、y =%s"、fta (fGyro[1]));
    UARTprintf ("、z =%s\n"、fta (fGyro[2]));
    
    //DelaySoft (1000);
    }
    }
    
    int main ()
    {
    //
    将系统时钟设置为从具有晶振基准的 PLL 以40MHz 的频率运行
    //
    printCtlClockSet (sysctl_SYSDIV_5 | sysctL_use_PLL | sysctl_X2C_16MHz | sysctL_oc_main);
    
    //
    
    
    
    配置 UART0 (/UART0)
    
    
    
    
    
    ;// UART0 (uurePrint ();// UART0)(/uart ()(/uart)
    
    

    我将获得静态值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="m_vedsharma"]我正在获取静态值。

    即使是"静态值"也可能证明"可疑值"。

    您是否了解了" 最基本的原因、"静态读数"?

    这应该证明您的练习很好-您的"审阅"应该使您能够"添加代码以确保您的程序执行、"定期和重复阅读!"

    供应商的计划严重违反 了"kiss" -功能太多-而且有这么大的错误来源"必然很难发现!"

    您如何"减少并简化"该计划?   并且-使用"已知的固定值(而不是"从任何传感器获得的值")-至少在早期的"测试阶段"-以便您"更好地理解"计划的"流程和目标"是否有用?

    复杂性 阻碍了理解、而不是增强理解、难道不是吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、m_vedsharma、

    我在第一个回答中问过"您是否尝试像开始时那样使用示例、如果是、您是否成功地读出数据?" 您有机会尝试一下吗? 将一个功能更改到 API 内部似乎已取得积极进展。 我也一直在想 I2C 部分、我觉得它可能无法满足您的需求、因为结构不易失、但它正在 ISR 中使用。

    深入了解 sensorlib 提供的内容、我想说您在 I2CMInit 之后不应该调用该行、API 会处理该行:

    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、true); 

    此外、我认为您不应执行以下操作:

    //
    // I2C 模块的中断处理程序。
    //
    void I2CMSSimpleIntHandler (void)
    {
    //
    调用 I2C 主驱动程序中断处理程序。
    //
    I2CMIntHandler (&g_sI2CMSSimpleInst);
    }
    

    相反、我认为您只需将 I2CMIntHandler 直接添加到您的 startup_ccs.c 文件中:

    I2CMIntHandler、 // I2C0主机和从机 

    这将使您无需将 sI2CInst 作为全局变量。

    您还需要在 startup_ccs.c 中#include i2cm_drv.h 文件。