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-TM4C123GXL:传感器集线器- PWM 问题

Guru**** 2614265 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/770280/ek-tm4c123gxl-sensor-hub---pwm-issues

器件型号:EK-TM4C123GXL

您好!  

我目前正在将 TM4C123GXL 与传感器集线器的陀螺仪结合使用。 但是、我希望能够将陀螺仪与 PWM 一起使用、并在特定的角度产生特定的 PWM 输出。 编码不是我的问题、事实上、当我调试时、没有需要评估的 PWM 寄存器。 我正在使用 TI 文件夹中包含的 compdcm_mpu9150文件。  

我只是想能够使用陀螺仪和 PWM。  

还有人有这个问题吗? 如果是、我将如何启用我的 PWM 寄存器以便我可以使用它们?  

提前感谢您。  

Mitchell  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    如果要使用 PWM、则需要首先初始化 PWM 模块。 我建议您首先查看下面的 PWM 示例 /examples/peripherals/pwm. 尝试运行 PWM 示例并了解其工作原理、然后将其整合到您的传感器集线器应用中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    正如我说过的、编码不是问题。 我已经正确初始化了所有内容并包含了必要的文件、但是、如果您调试程序、我无法选择要观察的任何 PWM 寄存器。 系统控制甚至不显示 PWM 寄存器。

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

    这意味着您无法选择要观察的任何 PWM 寄存器? 您能否截屏您尝试执行的操作?

    我刚刚运行了 TivaWare PWM 示例、可以在寄存器窗口中看到所有 PWM 寄存器。 正如我之前所说、您需要确保您初始化 PWM。 在您执行 SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)之前、没有提供到 PWM 模块的时钟、并且寄存器窗口将不显示任何有效值、而是显示一个红色文本、显示"Error:Unable to Read"(错误:无法读取)。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    我没有听到你的反馈。 我假设问题已解决。 我现在要关闭这个线程。 如果您有新的问题、您可以打开新的主题、如果您需要进一步的阻力、也可以重新打开此主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、  

    当我更改系统查看器文件时、问题已解决。  

    但是、既然一切都已正确初始化、那么连接传感器集线器后、我的 PWM 不会正确输出。 如果我在 LaunchPad 上使用不带传感器集线器的 PWM、则 PWM 将按编码方式工作。 但是、当我连接传感器集线器时、我会听到很多噪声。 您对此有什么建议吗?  

    感谢您迄今提供的帮助、

    Mitchell

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    一些问题和建议:
    什么类型的噪声? PWM 或剪集线器上的噪声是多少?
    连接传感器集线器时、您是否有示波器捕获来单独显示 PWM 和 PWM?
    您能否检查电源电压并看到电源上的噪声?
    如何为电路板供电? 通过 USB?
    您能否为电路板提供外部电源、您是否看到任何差异?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我在 PWM 输出上接收到噪声。
    我有一个示波器、将拍摄屏幕截图以提供可视参考。
    我将检查其他值并快速返回给您、谢谢。

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

    您好、Charles、  

    我已附上您要求的信息的屏幕截图。  

    PWM -不带传感器集线器

    PWM -带传感器集线器

    电源(VBUS)

    作为参考、我使用的是 PE4、如果您参考传感器集线器数据表、则表明它未被使用。 我正在使用位于 TI 库中的 gyroscopad 程序 compdcm_mpu9150文件

    你能提出什么建议吗?  

    谢谢你。  

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

    您好!
    我不清楚第二次和第三次捕获。 在您的示波器中、您是否可以执行单次触发/捕获而不是连续捕获? 此外、如果您尝试不同的 PWM 引脚会怎样?

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

    我使用单次拍摄附加了更多屏幕快照。

    我会使用另一个端口、但端口 E 是当前唯一未使用的端口。 我考虑过使用端口 F、但这意味着我没有闪烁的灯来指示正在进行的陀螺仪测量。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否说明这三个新的捕获是什么? 它们都是使用 sensohub 吗? 如果您尝试生成周期性 PWM、且波形如图所示(I.e 非周期性 PWM)所示、则需要确定 PWM 预加载寄存器是否更新错误。
    请尝试其他可用端口、看看这是否有所不同。 无论问题是否仅针对 PE4、调试都将更容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这三种新的捕获是从连接了传感器集线器的 TM4C Launchpad 中拍摄的图片。  

    为什么我使用完全相同的代码时、在断开传感器集线器的情况下、我会获得清晰的50%占空比、而在连接传感器集线器时、占空比会失真。 我希望它生成一个清晰的50%占空比。  

    我将初始化另一个 PWM 模块、以查看它是否起作用。  

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

    您好、Charles、  

    我尝试初始化端口 F、但没有成功。  

    您是否碰巧有一个可以测试 PWM 的传感器集线器?  

    谢谢、

    Mitchell  

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

    您好、Mitchell、

    我没有传感器集线器。 PF 端口有什么问题? 您是否在没有传感器集线器的情况下尝试过 PWM 的 PF 引脚? 如果可以使 PE4正常工作、我认为只需将代码调整为 PWM 的其他 PF 引脚即可。

    查看阴影区域、您可以尝试使用其他可用引脚进行 PWM。  

    连接器引脚      端口名称       PWM

    J1.2              Pb5.            M0PWM3

    J1.5              PE4.            M0PWM4

    J1.7              PB4.            M0PWM2

    J2.4              PF0            M1PWM4

    J3.3              PD0           M0PWM6/M1PWM0

    J3.4              PD1           M0PWM7/M1PWM1

    J3.10             PF1           M1PWM5

    J4.1              PF2           M1PWM6

    J4.2              PF3           M1PWM7

    我建议您设置一些观察点、并确保在创建固定周期/占空比 PWM 时不会意外写入 PWM 预加载寄存器。 您应该只需要设置一次 PWM 配置。 如果您的应用有意改变 PWM 预加载寄存器、那么您需要调试您的代码。 您曾说过、您尝试根据传感器输入生成 PWM。 如果是这种情况、那么如果您有意更改 PWM 周期和占空比、则需要检查代码。 我想这就是我建议你做的所有事情。 首先尝试其他引脚、看看您是否有任何差异。 如果您所讨论的噪声在所有其他 PWM 引脚上重复出现、则它与代码有关。   

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

    我发现了这个问题!  

    问题似乎来自 UARTStdioConfig 函数。  

    当 portnum 的值为0时、我会得到所有干扰。 但当我使用1或2时、UART 停止向串行监视器发送数据。 无论如何、我是否可以将其覆盖?  

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

    我的理论不正确。  

    我能够初始化端口 F、但仍有问题。  

    我已禁用 UART、问题仍然存在。 我已禁用 RGB、问题仍然存在。 我现在离开了端口 D 上的 I2C 和端口 B 上的中断  

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

    我认为我发现了这个问题。  

    ROM_IntMasterEnable();

    我的理解是、这将启用所有中断。 如果是、我能否仅启用我正在使用的外设?  

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

    您好、Mitchell、

     很高兴您找到了根本原因。 ROM_IntMasterEnable 用于在全局级别启用处理中断。 如果要单独启用/禁用特定的模块中断,则需要使用 IntEnable()或 IntDisable()。 例如、如果您执行 IntEnable (INT_UART0)、它将启用处理器的 UART0中断。  

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

    您好、Charles、  

    遗憾的是、当尝试禁用任何中断时、UART 停止传输。 请查看我的代码、看看是否有任何问题? 实际上、我只在 main 中添加了 PWMInitialization 和前两行。  

    //
    //
    // compatcm_mpu9150.c -将 SensorLib 与 MPU9150配合使用的示例
    //
    //版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C123GXL 固件包版本2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    include "inc/hw_memmap.h"
    #include "rgc/hw_ints.h"
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "sensorlib"
    #mdg.h"#include "sensormline.tex"#mline.mline"#包含"drivers/mtex"drivers/mdg.h"#include "s/sensormline"#mline.mline.tex"#tex"#tintrl.hr.mdg.h"#include "#include "s/sensormline.mline"#包含"mline"#tex"#tex"#tintrategrult.hr.hr.hr.hr.mdg.h"#include "#include "#tintrl.hr.hr.mdg.h"#include "#include "mline.mline"#包含"#t.mdg.mdg.hr.hr.hr.mdg.hr
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    //
    //! \addtogroup example_list
    //! 

    九轴传感器融合了 MPU9150和互补滤波 //! DCM (compdcm_mpu9150)

    //! //! 此示例演示了传感器库 TM4C123G 的基本用法//! LaunchPad 和 SensHub BoosterPack 可获取九轴运动测量 值//! 输出的数据。 该示例将九个轴的测量结果融合到一组 //! 偏转角度:滚动、俯仰和偏航。 它还会产生旋转 //! 四元离子。 演示的融合机制是互补滤波 //! 直接余弦矩阵(DCM)算法作为传感器的一部分提供 //! 库。 //! //! 将串行终端程序连接到 LaunchPad 的 ICDI 虚拟串行 //! 波特率为115、200波特。 每字节使用8位、无奇偶校验和1个停止位。 //! 原始传感器测量值、欧勒角和四偏离子打印到 //! 终端。 RGB LED 在初始化为 //后以1Hz 的频率开始闪烁! 示例应用程序正在运行。 //// ***************** // // //定义 MPU9150 I2C 地址。 //// ***************** #define MPU9150_I2C_ADDRESS 0x68 //********* // //全局数组,用于保存 RGB 的颜色值。 //// ***************** uint32_t g_pui32Colors [3]; //********* // // I2C 主驱动程序的全局实例结构。 //// ***************** TI2CMInstance g_sI2CInst; //********* // // ISL29023传感器驱动程序的全局实例结构。 //// ***************** tMPU9150 g_sMPU9150Inst; //********* // //管理 DCM 状态的全局实例结构。 //// ***************** tDCM Compg_sCompDCMInst; //********* // //全局标志来提醒 main MPU9150 I2C 事务已完成 // ********* volatile uint_fast8_t g_vui8I2CDoneFlag; //********* // //全局标志来提醒 main 发生了 MPU9150 I2C 事务错误。 //// ***************** volatile uint_fast8_t g_vui8ErrorFlag; //********* // //全局标志来提醒 main MPU9150数据已准备好被检索。 //// ***************** volatile uint_fast8_t g_vui8DataFlag; //********* // //全局计数器,用于控制和降低到达终端的数据速率。 //// ***************** #define print_skip_count 10 uint32_t g_ui32PrintSkipCounter; //********* // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // // MPU9150传感器回调函数。 在 MPU9150传感器 //驱动器事务结束时调用。 这是从 I2C 中断上下文中调用的。 因此、 //我们只需设置一个标志、让 main 执行大量计算和显示。 //// ***************** void MPU9150AppCallback (void * pvCallbackData、uint_fast8_t ui8Status) { // //如果传输成功,请将数据标志设置为指示 //应用程序,此事务已完成,数据可能已就绪。 // if (ui8Status = I2CM_STATUS_SUCCESS) { G_vui8I2CDoneFlag = 1; } // //存储最近的状态,以防出现错误情况 // G_vui8ErrorFlag = ui8Status; } //********* // ////由 NVIC 因 GPIO 端口 B 中断事件调用。 对于这个 //应用程序、GPIO 端口 B 引脚2是 MPU9150的中断线 // ********* void IntGPIOb (void) { unsigned long ulStatus; ulStatus = GPIOIntStatus (GPIO_PORTB_BASE、TRUE); // //清除设置的所有引脚中断 // GPIOIntClear (GPIO_PORTB_BASE、ulStatus); if (ulStatus 和 GPIO_PIN_2) { // // MPU9150数据已准备好检索和处理。 // MPU9150DataRead (&g_sMPU9150Inst、MPU9150AppCallback、&g_sMPU9150Inst); } } //********* // ////由 NVIC 作为 I2C3中断的结果调用。 I2C3是到 MPU9150的 I2C 连接//。 //// ***************** void MPU9150I2CIntHandler (void) { // //传递到传感器库提供的 I2CM 中断处理程序。 //需要在应用程序级别执行此操作,以便 I2CMIntHandler 可以执行此操作 //接收实例结构指针作为参数。 // I2CMIntHandler (&g_sI2CInst); } //********* // // MPU9150应用程序错误处理程序。 向用户显示我们是否遇到 // I2C 错误。 //// ***************** void MPU9150AppErrorHandler (char * pcFilename、uint_fast32_t ui32Line) { // //将终端颜色设置为红色,并打印错误状态和位置 // UARTprintf ("\033[31;1M"); UARTprintf ("错误:%d、文件:%s、行:%d\n" "请参阅 sensorlib\\i2cm_drv.h\n"、 g_vui8ErrorFlag、pcFilename、ui32Line); // //将终端颜色恢复正常 // UARTprintf ("\033[0m"); // //将 RGB 颜色设置为红色 // G_pui32Colors[0]= 0xFFFF; G_pui32Colors[1]= 0; G_pui32Colors[2]= 0; RGBColorSet (g_pui32Colors); // //提高闪烁速率以引起注意 // RGBBlinkRateSet (10.0f); // //进入休眠等待干预。 更强大的应用 //在此处尝试纠正措施。 // while (1) { // //不执行任何操作 // } } //********* // //等待 MPU9150事务完成的函数。 使用此选项可在 I2C 总线上旋转//等待。 //// ***************** void MPU9150AppI2CWait (char * pcFilename、uint_fast32_t ui32Line) { // //等待 I2C 驱动程序进入休眠状态 //指示事务已完成。 // while ((g_vui8I2CDoneFlag = 0)&&(g_vui8ErrorFlag = 0) { // //不执行任何操作 // } // //如果发生错误,请立即调用错误处理程序。 // if (g_vui8ErrorFlag) { MPU9150AppErrorHandler (pcFilename、ui32Line); } // //清除数据标志以供下次使用。 // G_vui8I2CDoneFlag = 0; } //********* // //配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 //// ***************** void ConfigureUART (void) { // //启用 UART 使用的 GPIO 外设。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //启用 UART0 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //为 UART 模式配置 GPIO 引脚。 // ROM_GPIOPinConfigure (GPIO_PA0_U0RX); ROM_GPIOPinConfigure (GPIO_PA1_U0TX); ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } void PWMInitialization (uint32_t startMotor){ //端口 F 初始化为 s PWM SYSCTL_RCGCGPIO_R|= 0x20;//在端口 F SYSCTL_RCGCPWM_R上启用 GPIO 端口运行模式时钟门控控制|= 0x02;//在 PWM 模块1 (M1PWM4)(COL 5)(M1 PWM 第2代) 上启用脉宽调制器运行模式时钟门控控制 GPIO_PORTF_LOCK_R=0x4C4F434B;//端口 F 的 GPIO 锁定-解锁 GPIO 提交寄存 器 GPIO_PORTF_CR_R=0x1F;//端口 F 的 GPIO 提交-允许 GPIOAFSEL、GPIOPUR、GPIOPDR 或 GPIODEN 写入 P4-0 GPIO_PORTF_AFSEL_R= 0x01;//启用引脚0 上的 GPIO 备用功能选择 GPIO_PORTL_PCTL_R= 0x00000005;//引脚0上的端口控制 = 0xORT1_R;//在引脚0上启用数字输入/输出 GPIO_PORTF_DIR_R=0x01;//在引脚0上启用方向作为 PWM SYSCTL_RCC_R 的输出//初始化|=0x00100000;//为'USEPWMDIV' SYSCTL_RCC_R&= 0xFFF0FFFF 启用运行模式时钟配置;//启用 PWM 单元时钟分频为/2 PWM1_2_CTL_R=0x00;//重新加载递减计数模式|第1270页 PWM1_2_GENA_R =0x8C;//低负载、高 CMPA 倒计时|第1283-1284页 PWM1_2_LOAD_R =0x3E8;//周期数减至0 |第1278页 PWM1_2_CMPA_R =电机;//计数值输出上升 PWM1_2_CTL_R=0x00000001;//启动发生器2 PWM1_ENABLE_R =0x00000010;//启用 PB6/M0PWM0 GPIO_PORTF_LOCK_R=0x01;//端口 F 的 GPIO 锁定-解锁 GPIO 提交寄存 器 GPIO_PORTF_CR_R=0xFF;//端口 F 的 GPIO 提交-允许将 GPIOAFSEL、GPIOPUR、GPIOPDR 或 GPIODEN 写入 PF4-0 } //************* // ////主应用程序入口点。 //// ***************** int main (void) { uint32_t startMotor = 0x1F4;//将占空比初始化为50% PWMInitialization (startMotor);//初始化 PWM int_fast32_t i32IPart[16]、i32FPart[16]; uint_fast32_t ui32Idx、ui32CompDCMStarted; float pfData[16]; float *pfAccel,*pfGyro,*pfMag,*pfEulers,*pfQuaternion; // //初始化用于清理和阐明代码的便利指针 //含义。 我们希望所有数据都位于单个连续数组中、这样就可以了 //我们以后可以更轻松地进行打印。 // pfAccel = pfData; pfGyro = pfData + 3; pfMag = pfData + 6; pfEulers = pfData + 9; pfQuaternion = pfData + 12; // //将系统时钟设置为以晶体基准从 PLL 以40MHz 频率运行 // ROM_SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN); // //启用用于移动中断的端口 B。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // //初始化 UART。 // ConfigureUART(); // //将欢迎消息打印到终端。 // UARTprintf ("\033[2JMPU9150原始示例\n"); // //将颜色设置为紫色近似值。 // G_pui32Colors[红色]= 0x8000; G_pui32Colors[蓝色]= 0x8000; G_pui32Colors[绿色]= 0x0000; // //初始化 RGB 驱动器。 // RGBInit (0); RGBColorSet (g_pui32Colors); RGBIntensitySet (0.5f); RGBEnable(); // //使用前必须启用 I2C3外设。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C3); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //为端口 D0和 D1上的 I2C3功能配置引脚复用。 // ROM_GPIOPinConfigure (GPIO_PD0_I2C3SCL); ROM_GPIOPinConfigure (GPIO_PD1_I2C3SDA); // //为这些引脚选择 I2C 功能。 此函数也会 //为 I2C 操作配置 GPIO 引脚,将其设置为 //开漏操作,弱上拉。 请参阅数据表 //查看每个引脚分配了哪些功能。 // GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0); ROM_GPIOPinTypeI2C (GPIO_PORTD_base、GPIO_PIN_1); // //配置和启用 GPIO 中断。 用于来自的 INT 信号 // MPU9150 // ROM_GPIOPinTypeGPIOInput (GPIO_PORTB_BASE、GPIO_PIN_2); GPIOIntEnable (GPIO_PORTB_BASE、GPIO_PIN_2); ROM_GPIOIntTypeSet (GPIO_PORTB_BASE、GPIO_PIN_2、GPIO_FALLING_EDGE); ROM_IntEnable (INT_GPIOB); // //在睡眠模式下,只保持系统的某些部分运行。 // GPIOB 用于 MPU9150中断引脚。 // UART0是虚拟串行端口 // TIMER0、Timer1和 WTIMER 5由 RGB 驱动器使用 // I2C3是 ISL29023的 I2C 接口 // ROM_SysCtlPeripheralClockGating (真); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_GPIOB); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_TIMER0); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_Timer1); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_I2C3); ROM_SysCtlPeripheralSlepEnable (SYSCTL_Periph_WTIME5); // //启用到处理器的中断。 // ROM_IntMasterEnable(); // //初始化 I2C3外设。 // I2CMInit (&g_sI2CInst、I2C3_base、INT_I2C3、0xff、0xff、 ROM_SysCtlClockGet (); // //初始化 MPU9150驱动程序。 // MPU9150Init (&g_sMPU9150Inst、&g_sI2CInst、MPU9150_I2C_address、 MPU9150AppCallback、&g_sMPU9150Inst); // //等待事务完成 // MPU9150AppI2CWait (__file__、__line__); // //编写应用特定的传感器配置,如过滤器设置 //和传感器范围设置。 // G_sMPU9150Inst.pui8Data[0]= MPU9150_CONFIG_DLPF_CFG_94_98; G_sMPU9150Inst.pui8Data[1]= MPU9150_gyro_config_FS_SEL_250; G_sMPU9150Inst.pui8Data[2]=(MPU9150_ACCEL_CONFIG_ACCEL_HPF_5Hz | MPU9150_ACCEL_CONFIG_AFS_SEL_2G); MPU9150Write (&g_sMPU9150Inst、MPU9150_O_CONFIG、g_sMPU9150Inst.pui8Data、3、 MPU9150AppCallback、&g_sMPU9150Inst); // //等待事务完成 // MPU9150AppI2CWait (__file__、__line__); // //配置 MPU9150的数据就绪中断引脚输出。 // G_sMPU9150Inst.pui8Data[0]= MPU9150_INT_PIN_CFG_INT_LEVEL | MPU9150_INT_PIN_CFG_INT_RD_CLEAR | MPU9150_INT_PIN_CFG_LATCH_INT_EN; G_sMPU9150Inst.pui8Data[1]= MPU9150_INT_ENABLE_DATA_RDY_EN; MPU9150Write (&g_sMPU9150Inst、MPU9150_O_INT_PIN_CFG、g_sMPU9150Inst.pui8Data、2、MPU9150AppCallback、 &g_sMPU9150Inst); // //等待事务完成 // MPU9150AppI2CWait (__file__、__line__); // //初始化 DCM 系统。 50 Hz 采样率。 // accel 权重=.2、陀螺仪权重= 0.8、MAG 权重=.2 // CompDCMInit (&g_sCompDCMInst、1.0f / 50.0f、0.2f、0.6f、0.2f); UARTprintf ("\033[2J\033[H"); UARTprintf ("MPU9150 9轴简单数据应用示例\n"); UARTprintf ("\033[20GX\033[31G|\033[43GY\033[54G|\033[66GZ\n"); UARTprintf ("Accel\033[8G|\033[31G|\033[54G|\n\n"); UARTprintf ("Gyro\033[8G|\033[31G|\033[54G|\n\n"); UARTprintf ("Mag\033[8G|\033[31G|\033[54G|\n\n"); UARTprintf ("\n\n033[20GRole\033[31G|\033[43GPitche\033[54G|\033[66GYaw\n"); UARTprintf ("Eulers\033[8G|\033[31G|\033[54G|\n\n"); UARTprintf ("\n\n033[17GQ1\033[26G|\033[35GQ2\033[44G|\033[53GQ3\033[62g|") "\033[71GQ4\n"); UARTprintf ("Q\033[8G|\033[26G|\033[44G|\033[62g|\n\n"); // //启用闪烁表示配置成功完成 // RGBBlinkRateSet (1.0f); ui32CompDCMStarted = 0; while (1) { // //在等待数据就绪时进入睡眠模式。 // while (!g_vui8I2CDoneFlag) { ROM_SysCtlSleep (); } // //清除标志 // G_vui8I2CDoneFlag = 0; // //获取以 m/s^2为单位的 Accel 数据的浮点版本。 // MPU9150DataAccelGetFloat (&g_sMPU9150Inst、pfAccel、pfAccel + 1、 pfAccel + 2); // //获得以 rad/s 为单位的角度速度的浮点版本 // MPU9150DataGyroGetFloat (&g_sMPU9150Inst、pfGyro、pfGyro + 1、 pfGyro + 2); // //获得特斯拉的浮点版本的磁场强度 // MPU9150DataMagnetoGetFloat (&g_sMPU9150Inst、pfMag、pfMag + 1、 pfMag + 2); // //检查这是否是我们的第一个数据。 // if (ui32CompDCMStarted = 0) { // //设置指示 DCM 已启动的标志。 //使用第一组数据进行 DCM 播种。 // ui32CompDCMStarted = 1; CompDCMMagnetoUpdate (&g_sCompDCMInst、pfMag[0]、pfMag[1]、 pfMag[2]); CompDCMAccelUpdate (&G) sCompDCMInst、pfAccel[0]、pfAccel[1]、 pfAccel[2]); CompDCMGyroUpdate (&g_sCompDCMInst、pfGyro[0]、pfGyro[1]、 pfGyro[2]); CompDCMStart (&g_sCompDCMInst); } 其他 { // // DCM 已启动。 执行增量更新。 // CompDCMMagnetoUpdate (&g_sCompDCMInst、pfMag[0]、pfMag[1]、 pfMag[2]); CompDCMAccelUpdate (&G) sCompDCMInst、pfAccel[0]、pfAccel[1]、 pfAccel[2]); CompDCMGyroUpdate (&g_sCompDCMInst、-pfGyro[0]、-pfGyro[1]、 -pfGyro[2]); CompDCMUpdate (&g_sCompDCMInst); } // //递增跳过计数器。 使用跳过计数器、因此我们不会这样做 //将数据溢出 UART。 // G_ui32PrintSkipCounter++; if (g_ui32PrintSkipCounter >= print_skip_count) { // //重置跳过计数器。 // G_ui32PrintSkipCounter = 0; // //获取 Euler 数据。 (侧倾俯仰偏航偏航) // CompDCMComputeEulers (&g_sCompDCMInst、pfEulers、pfEulers + 1、 pfEulers + 2); // //获取四元离子。 // CompDCMComputeQuaternion (&g_sCompDCMInst、pfQuaternion); // //将 MAG 数据转换为微特斯拉,以便更好地进行人的解释。 // pfMag[0]*= 1e6; pfMag[1]*= 1e6; pfMag[2]*= 1e6; // //将欧拉器转换为度数。 180/PI = 57.29... //将 Yaw 转换为0到360以近似的罗盘标题。 // pfEulers[0]*= 57.295779513082320876798154814105f; pfEulers[1]*= 57.295779513082320876798154814105f; pfEulers[2]*= 57.295779513082320876798154814105f; if (pfEulers[2]< 0) { pfEulers[2]+= 360.0f; } // //现在返回到将数据用作的单个数组 //将浮点分解为整数部分和 A 的目的 //小数(十进制)部分。 // 对于(ui32Idx = 0;ui32Idx < 16;ui32Idx++) { // //将浮点值转换为截断小数部分的整数。 // i32IPart[ui32Idx]=(int32_t) pfData[ui32Idx]; // //乘以1000以保留前三个十进制值。 //在第三个小数点处截断。 // i32FPart[ui32Idx]=(int32_t)(pfData[ui32Idx]* 1000.0f); // //从这个新形成的十进制小数中减去整数部分 //部分。 // i32FPart[ui32Idx]= i32FPart[ui32Idx]- (i32IPart[ui32Idx]* 1000); // //使十进制部分成为显示的正数。 // if (i32FPart[ui32Idx]< 0) { i32FPart[ui32Idx]*=-1; } }// // // //在表中打印加速度数值。 // // // UARTprintf ("\033[5;17H%3D.%03d"、i32IPart[0]、i32FPart[0]); // UARTprintf ("\033[5;40H%3D.%03d"、i32IPart[1]、i32FPart[1]); // UARTprintf ("\033[5;63H%3D.%03d"、i32IPart[2]、i32FPart[2]); // // // //在表中打印角度速度。 // // // UARTprintf ("\033[7;17H%3D.%03d"、i32IPart[3]、i32FPart[3]); // UARTprintf ("\033[7;40H%3D.%03d"、i32IPart[4]、i32FPart[4]); // UARTprintf ("\033[7;63H%3D.%03d"、i32IPart[5]、i32FPart[5]); // // // //在表中打印磁性数据。 // // // UARTprintf ("\033[9;17H%3D.%03d"、i32IPart[6]、i32FPart[6]); // UARTprintf ("\033[9;40H%3D.%03d"、i32IPart[7]、i32FPart[7]); // UARTprintf ("\033[9;63H%3D.%03d"、i32IPart[8]、i32FPart[8]); // //在表格中打印欧勒尔。 // UARTprintf ("[piting%4d.%03d]"、i32IPart[9]、i32FPart[9]); UARTprintf ("[ROLL %4d.%03d]"、i32IPart[10]、i32FPart[10]); UARTprintf ("[YAYa%4d.%03d]\n "、i32IPart[11]、i32FPart[11]); // // // //以表格式打印四边形。 // // // UARTprintf ("\033[19;14H%3D.%03d"、i32IPart[12]、i32FPart[12]); // UARTprintf ("\033[19;32H%3D.%03d"、i32IPart[13]、i32FPart[13]); // UARTprintf ("\033[19;50H%3D.%03d"、i32IPart[14]、i32FPart[14]); // UARTprintf ("\033[19;68H%3D.%03d"、i32IPart[15]、i32FPart[15]); } }

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

    您好!

     一些意见和问题:

    • 我们不支持 DRM (直接存储器操作)类型的编码、您可以在其中对 PWMInitialization()进行编码。 请参考下的示例 /examples/peripherals/pwm 文件夹、了解如何使用 TivaWare API 配置 PWM 模块。
    • 当您说如果您禁用中断、那么 UART 就不工作时、您禁用了哪个中断? 您的传感器集线器将向处理器生成中断。 如果禁用中断、则不执行回调。 检查 在回调中设置的 g_vui8I2CDoneFlag 标志。 如果未执行回调、则 g_vui8I2CDoneFlag 为0。 现在转至主部分、如果 g_vui8I2CDoneFlag 为0、则处理器进入低功耗模式、在接收到中断以将其从低功耗模式唤醒之前、不执行任何代码。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    我没有听到你的反馈。 我假设您能够以某种方式解决该问题。 如果您确实解决了该问题、请向该主题提供一些反馈、以便社区中的其他人可以从您的发现中受益。 我现在要关闭这个线程。 如果您有新问题、您可以打开新主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、 

    问题尚未解决。 我已经使用您的建议初始化了 PWM、信号确实发生了变化、并且更加清晰。 然而、PWM 仍在改变占空比和频率。
    我在下面添加了初始化代码、但我仍然对占空比为何从11%变为25%(这是我一直希望的)以及5.53Hz 至6.26HZ 的变化频率感到困惑。
    有什么想法吗?


    //将端口 E 引脚4初始化为 s PWM SysCtlPWMClockSet (SYSCTL_PWMDIV_1); SysCtlPeripheralEnable (SYSCTL_PERIPH_PWM0); SysPorte PeripheralEnable (SYSCTL_PERIPH_GPIOE); GPIOConfigure (GPIO_PE4_M0PWM4);SysCtlPinTypePWM (GPIO_BASE);GPIOPEN_GPIO) GPIO_PIN_4); PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); PWMGenPeriodSet (PWM0_BASE、 PWM_GEN_2、64000); PWMPulseWidthSet (PWM0_BASE、PWM_OUT_4、PWMGenPeriodGet (PWM0_BASE、 PWM_GEN_2)/4); PWMOutputState (PWM0_BASE、PWM_OUT_4_BIT、TRUE); PWMGenEnable (PWM0_BASE、 PWM_GEN_2);

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

    您好、Charles、  

    您是否认为锁定寄存器会阻止 PWM 更新? 如果是、需要哪些命令来锁定这些寄存器?  

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

    您好 Mitchel、

     您需要做的是首先找出无意中更新 PWM 的用户。 没有机制可以锁定 PWM 不进行更新。 要了解 PWM 的周期和占空比是否意外修改、您可以在 CCS 调试器中设置观察点寄存器。 例如、您使用的是 PWM0 PWM_GEN_2。 该周期在 PWM2LOAD 寄存器中配置。 PWM2LOAD 寄存器位于地址0x400280D0。 请参阅数据表。 占空比通过0x400280D8和0x400280DC 上的 PWM2CMPA 和 PWM2CMPB 寄存器进行配置。 您的应用应该只初始化这些寄存器一次。 通过设置观察点来监视对这些寄存器的任何写入、您可以在代码中找到有意或无意写入这些寄存器的时间。  如果您不熟悉观察点、请参阅以下图片。 设置观察点并让代码运行后、您多久看到 CPU 因撞击观察点而停止? CPU 停止后、转至代码行、了解应用程序有意或无意写入寄存器的原因? 您还可以使用相同的方法来观察在执行过程中 GPIO 引脚复用是否发生了变化。 是否可以更改引脚排列。 请注意、PE4适用于您的 M0PWM4功能。 如果在执行过程中无意中更改了 pinmux、则您会看到错误的行为。

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

    我现在正在尝试这样做、但是、我正在使用 Keil。 有关在 Keil 而不是 CCS 上执行此操作的任何指导(我之前从未使用过)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您应该查阅 Keil 或查阅他们的用户手册以了解如何设置观察点。 每个 IDE 调试器都支持此功能。 观察点支持由处理器提供。 调试器只需配置该功能。 我不知道 Keil。 在这方面没有什么帮助。 但想法是一样的。 在 Keil 中设置观察点后、如果 CPU 尝试写入指定地址、CPU 将在指定地址处停止。 然后、您可以确定该写入是否为预期写入。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、  

    我已将我的 PWM 初始化全部从文件中删除、但您建议查看的寄存器仍在更新中。 您是否能够加载程序(TI 文件夹中的程序不包含我的信息)并告诉我这些寄存器何时/为什么仍在更改?  

    提前感谢、

    Mitchell   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    很抱歉、下周之前我没有时间做任何实验。 如果没有 PWM 初始化、并且您通过观察点发现 PWM 寄存器正在更新、那么您几乎会找到根本原因、不是? 这是调试的一部分。 您的代码写入 PWM 寄存器的行是什么? 如果这些是无意代码、您为什么不对它们进行注释、看看这是否解决了问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、  

    我已经按照您的要求设置了断点和观察点、但只满足初始化期间的时间断点。 当程序运行时、我提高了观察点、可以看到寄存器发生了变化、但断点没有被设置。  

    还有什么可以考虑的呢? 如果你能在本周腾出一些时间来研究这个问题,或者推荐有能力的人,我将永远感激。  

    请。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michell、
    我将在明天与同事讨论一些想法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还应特定于哪些寄存器发生更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、  

    至于 GPIO E、我不会初始化任何中断、并且中断寄存器仍在加载值。

    至于 PWM、您建议观察的寄存器正在更新、还有更多内容。 我尝试附加视频、但文件太大。  

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

    您能否截取 PWM0/1寄存器的屏幕截图? 我只需按原样运行 compdcm_mpu9150。 PWM0/1甚至不会被初始化。 如果不进行初始化、则意味着 PWM 模块没有时钟。 正如您在 CCS 中看到的、它们只显示"Error: Unable to Read"。 "。 我不明白您在哪里看到 PWM 寄存器不断更新。

    您是否按原样使用了 TivaWare 库中的 compdcm_mpu9150?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mitchell、
    我想我会解决您的问题。 如果您按原样使用了 compdcm_mpu9150.c、则 while (1)循环中存在以下代码。

    while (!g_vui8I2CDoneFlag)

    ROM_SysCtlSleep ();


    请将其注释到

    while (!g_vui8I2CDoneFlag)

    // ROM_SysCtlSlep();


    出现问题的原因是编写了示例代码、以便用于来自传感器的数据。 在等待数据时、器件进入睡眠状态、这会影响进入 PWM 模块的时钟。 您的 PWM 模块会随机进入睡眠模式、从而停止 PWM 信号。

    尝试上述修改后的代码、您应该会看到正确的 PWM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯······················  

    我无法表达我对您的帮助的感激程度!  

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我本来可以更早地发现这个问题、但很遗憾、直到今天我还没有 sensorhub BoosterPack 来重现您的发现。 很抱歉。