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.

[参考译文] EK-TM4C129EXL:EK-TM4C129EXL–无法在 0.96 OLED 显示屏上显示 IMU 传感器值

Guru**** 2923960 points

Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1650093/ek-tm4c129exl-ek-tm4c129exl-unable-to-display-imu-sensor-values-on-0-96-oled-display

器件型号: EK-TM4C129EXL

TI 团队大家好、

目前正在研发 EK-TM4C129EXL LaunchPad 电路板。

在我的项目中、我连接了:

  • 一个 IMU 传感器
  • 0.96 英寸 OLED 显示屏

当前状态:

  • IMU 传感器通信工作正常。
  • 我能够通过 UART/终端调试成功读取传感器值。
  • OLED 显示初始化也正常工作。
  • 当我将普通字符或静态字符串发送到 OLED 时,它们会正确显示。

问题:
当我尝试在 OLED 显示屏上显示 IMU 传感器值时、这些值显示为:
0000

而不是实际的传感器读数。

观察结果:

  • 静态文本显示在 OLED 上工作正常。
  • 在代码中正确接收传感器数据。
  • 该问题仅在转换或将传感器值传递给 OLED 显示函数时出现。

我怀疑问题可能与以下问题有关:

  • 整数/浮点到字符串的转换
  • sprintf()/snprintf() 格式化
  • 数据类型不匹配
  • OLED 显示缓冲区处理

您能否帮助我确定导致问题的原因或建议在 OLED 上显示传感器值的正确方法?

使用的硬件:

  • EK-TM4C129EXL LaunchPad
  • IMU 传感器(提及准确的传感器零件号)
  • 0.96“ OLED 显示 (SSD1306/I2C)

软件/IDE:

  • Code Composer Studio
  • TivaWare

谢谢您。output_0.96 oled.txt

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

    您好:

    根据您描述的内容、它听起来像是所有组件:显示屏和 IMU 按预期工作、这让我相信这可能是如何将数据从 IMU 传感器格式化到显示屏的问题。

    对于之前显示的信息、如何将其格式化以显示在显示屏上? IMU 数据是如何存储的? 我猜是 IMU 数据的格式是浮点格式还是 uint32_t、显示的信息是整数格式、您可能需要将其转换为预期的格式。

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

    我们需要知道您从 IMU 获得的格式和要显示的格式。

    我要做的是将您想要显示的字符串打印到缓冲区中、然后将其显示到串行和 OLED 上。

    通常这种情况是由于没有为字符串创建合适的缓冲区。

    您能否分享用于格式化和显示的代码片段?

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

    感谢您的答复。

    目前、我正在通过 UART 调试正确接收 IMU 传感器值。 IMU 数据以数字格式提供、我尝试在 0.96 英寸 OLED 显示屏上显示相同的值。

    OLED 显示屏可以正常处理静态字符串和字符。 但是、当我尝试显示传感器值时、OLED 仅显示:
    0000

    如您建议的那样、我通过串行 UART 打印格式化的字符串来进行检查、确认值显示正确。 在格式化传感器数据或将传感器数据传递到 OLED 显示功能时、似乎会出现此问题。

    我怀疑可能存在与以下相关的问题:

    • 缓冲区分配

    • sprintf()/snprintf() 格式化

    • 整数/浮点转换

    • OLED 显示字符串处理

    我附加了 OLED 显示格式和显示代码片段以供参考。 请查看并建议所需的任何更正。
    e2e.ti.com/.../oled_5F00_code.c
    显示 IMU 值的 UART 终端
    AY=0mg T= 24.5 AX = 1536mg AY=909mg

    T =–90.–4 AX = 1348mg AY =–3mg AZ =–31mg

    T =–82.–4 AX =–994mg AY = 0mg AZ = 1160mg

    T = 25.0 AX =–992mg AY = 0mg AZ =–62mg

    T = 24.6 AX =–87mg AY =–62mg AZ =–61mg

    0x6A WHO_AM_I = 0x70

    正在初始化传感器...

    CTRL3_C = 0x44

    CTRL8 = 0x44

    CTRL9 = 0x00

    传感器正常。

    T =–87.0 AX =–1987mg AY =–1348mg AZ =–93mg

    T = 24.9 AX =–2853 mg AY =–3mg AZ =–93 mg

    T = 25.0 AX =–1986mg AY =–4mg AZ = 16mg

    T =–58.–3 AX =–1986mg AY =–5mg AZ =–93mg

    T = 24.6 AX =–1986mg AY =–3mg AZ = 3166mg

    T = 25.0 AX =–1998 毫克 AY =–5mg AZ =–93 毫克

    T = 24.6 AX = 1787mg AY =–878mg AZ =–93mg

    T = 25.0 AX =–1987mg AY =–7mg AZ =–112mg

    T = 25.0 AX =–1984mg AY =–1348mg AZ =–110mg

    T = 25.0 AX =–1975mg AY =–815mg AZ =–93mg

    T =–64.0 AX =–3888mg AY =–7mg AZ =–93mg

    T = 25.0 AX = 3041 mg AY =–3mg AZ = 3480 mg

    T = 24.0 AX =–1987mg AY =–4mg AZ =–112mg

    T = 24.6 AX =–1985mg AY = 0mg AZ =–114mg

    T = 24.0 AX = 3229 mg AY =–2mg AZ =–93 mg

    T = 24.0 AX =–1987mg AY =–1097mg AZ =–113mg

    T = 24.6 AX =–1998mg AY =–846mg AZ =–111mg

    T =–52.–3 AX =–1975mg AY =–972mg AZ =–93mg

    T =–63.0 AX =–1998mg AY =–3mg AZ =–112mg

    T = 24.9 AX =–1998 毫克 AY =–3mg AZ = 3260 毫克

    T = 25.0 AX =–1998mg AY =–1mg AZ =–111mg

    T = 24.9 AX =–1990mg AY =–1066mg AZ =–93mg

    T =–80.–4 AX = 2759 mg AY =–1097 mg AZ =–93 mg

    T = 24.9 AX =–1986mg AY =–2mg AZ = 2978 mg

    T = 25.0 AX =–1986mg AY =–7mg AZ =–93mg

    T = 24.5 AX =–1998 毫克 AY =–2mg AZ =–93 毫克

    T = 24.0 AX =–1998 毫克 AY =–376 毫克 AZ =–93 毫克

    T = 24.0 AX = 2853 mg AY =–7mg AZ =–113 mg

    T = 24.0 AX =–1998 毫克 AY =–1mg AZ =–113 毫克

    T = 24.0 AX = 3919mg AY =–3mg AZ =–93mg

    T = 25.0 AX =–1975mg AY =–3mg AZ =–93mg

    T = 24.0 AX =–3355mg AY =–7mg AZ =–112mg

    T = 150.4 AX =–1975mg AY =–2mg AZ =–113mg

    T = 24.0 AX =–3605mg AY =–815mg AZ = 3135mg

    T = 24.0 AX =–1984mg AY =–7mg AZ =–93mg

    T = 24.0 AX =–1987mg AY =–1316mg AZ =–113mg

    T = 24.9 AX =–1987mg AY =–4mg AZ =–93mg

    T = 24.0 AX = 2665mg AY =–1066mg AZ = 3135mg

    T = 25.0 AX = 3229 mg AY =–595mg AZ = 2529 mg

    T = 24.5 AX =–1985mg AY = 0mg AZ =–112mg

    T = 24.0 AX =–1998 毫克 AY =–689 毫克 AZ =–93 毫克

    T =–96.–4 AX =–1998mg AY =–4mg AZ =–111mg

    T =–96.0 AX =–3888mg AY =–7mg AZ = 3185mg

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

    字符串的长度接近 32 个字符。 建议使用 64 buf。

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

    您也可以尝试从 OLED 打印字符串函数的*inside*中进行串行打印。

    您也可以查看 OLED draw 字符函数内部、并确保获得正确的字符。

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

    > sprintf (buf、“AX:%+5d mg“、ax_mg);

    “%d“需要一个“int“(在本例中为“int32_t“)、而不是“int16_t“。 请尝试:

    > sprintf (buf、“AX:%+5d mg“、(int32_t) ax_mg);

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

    这上面有什么字吗? 我对问题是什么很好奇。