您好!
我目前正在将 TM4C123GXL 与传感器集线器的陀螺仪结合使用。 但是、我希望能够将陀螺仪与 PWM 一起使用、并在特定的角度产生特定的 PWM 输出。 编码不是我的问题、事实上、当我调试时、没有需要评估的 PWM 寄存器。 我正在使用 TI 文件夹中包含的 compdcm_mpu9150文件。
我只是想能够使用陀螺仪和 PWM。
还有人有这个问题吗? 如果是、我将如何启用我的 PWM 寄存器以便我可以使用它们?
提前感谢您。
Mitchell
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.
您好!
我目前正在将 TM4C123GXL 与传感器集线器的陀螺仪结合使用。 但是、我希望能够将陀螺仪与 PWM 一起使用、并在特定的角度产生特定的 PWM 输出。 编码不是我的问题、事实上、当我调试时、没有需要评估的 PWM 寄存器。 我正在使用 TI 文件夹中包含的 compdcm_mpu9150文件。
我只是想能够使用陀螺仪和 PWM。
还有人有这个问题吗? 如果是、我将如何启用我的 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 引脚上重复出现、则它与代码有关。
您好、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]); } }
您好!
一些意见和问题:
您好、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);
您好 Mitchel、
您需要做的是首先找出无意中更新 PWM 的用户。 没有机制可以锁定 PWM 不进行更新。 要了解 PWM 的周期和占空比是否意外修改、您可以在 CCS 调试器中设置观察点寄存器。 例如、您使用的是 PWM0 PWM_GEN_2。 该周期在 PWM2LOAD 寄存器中配置。 PWM2LOAD 寄存器位于地址0x400280D0。 请参阅数据表。 占空比通过0x400280D8和0x400280DC 上的 PWM2CMPA 和 PWM2CMPB 寄存器进行配置。 您的应用应该只初始化这些寄存器一次。 通过设置观察点来监视对这些寄存器的任何写入、您可以在代码中找到有意或无意写入这些寄存器的时间。 如果您不熟悉观察点、请参阅以下图片。 设置观察点并让代码运行后、您多久看到 CPU 因撞击观察点而停止? CPU 停止后、转至代码行、了解应用程序有意或无意写入寄存器的原因? 您还可以使用相同的方法来观察在执行过程中 GPIO 引脚复用是否发生了变化。 是否可以更改引脚排列。 请注意、PE4适用于您的 M0PWM4功能。 如果在执行过程中无意中更改了 pinmux、则您会看到错误的行为。
您能否截取 PWM0/1寄存器的屏幕截图? 我只需按原样运行 compdcm_mpu9150。 PWM0/1甚至不会被初始化。 如果不进行初始化、则意味着 PWM 模块没有时钟。 正如您在 CCS 中看到的、它们只显示"Error: Unable to Read"。 "。 我不明白您在哪里看到 PWM 寄存器不断更新。
您是否按原样使用了 TivaWare 库中的 compdcm_mpu9150?