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.
工具/软件:Code Composer Studio
您好!
我正在尝试使用对称 HRPWM (向上/向下)、并且我已经修改 了 HRPWM_PrdUpDown_SFO_v8.c 示例以对其进行测试。
示例接缝可以正常运行、但在某些情况下、占空比会"跳跃"、然后"后退"。 这种非线性行为 可以建立在50%(通过设置 DutyFine=16383、然后将值更改为16384、最后改为16385)。 当 Duty =16384时、PWM 跳转、然后当 Duty=16385时返回。
这种行为是否正常? PWM 是否针对此目的正确配置(对称 PWM)?
谢谢、
您使用的值不可能大于 SFO 指定的最大延迟元素数。
请查看以下内容:
//######################################################################################################################## //$Copyright: // Copyright (C) 2013-2019 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//进行修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "driverlib.h" #include "device.h" #include "SFO_v8.h" #define ePWM_TIMER_TBPRD 100UL #define MIN_HRPWM_Duty_Percent 4.0/(((float32_t) ePWM_TIMER_TBPRD)* 100.0 // 定义 // #define LAST_ePWM_index_for_example 5 // 全局 //// float32_t dutyFine = min_HRPWM_Duty_percent; uint16_t status; int MEP_ScaleFactor;//由 SFO 库使用的变量 //结果可用于所有 HRPWM 通道 //此变量也被复制到 HRMSTEP //按 SFO ()函数注册。 易失性 uint32_t ePWM[(PWM_CH + 1)]= {0、EPWM1_base、EPWM2_base、EPWM3_base、EPWM4_base}; // //函数原型 // void initHRPWM (uint32_t period); void initEPWMGpio (void); void error (void); //_interrupt void epwm1ISR (void); //_interrupt void epwm2ISR (void); //__interrupt void epwm3ISR (void); //__interrupt void epwm4ISR (void); // // Main // void main (void) { uint16_t i = 0; // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //将中断服务例程分配给 ePWM 中断 // //中断寄存器(INT_EPWM1、epwm1ISR); //中断寄存器(INT_EPWM2、epwm2ISR); //中断寄存器(INT_EPWM3、epwm3ISR); //中断寄存器(INT_EPWM4、epwm4ISR); initEPWMGpio(); // //将 XBAR 输入从使用 GPIO0更改为使用 GPIO0 //如果启用了 ePWM SYNCIN,EXTSYNCIN1和 EXTSYNCIN2将使用 // GPIO0 (即 EPWM1的输出)。 //选择和未使用的 GPIO // Xbar_setInputPin (XBAR_INPUT5、50); Xbar_setInputPin (XBAR_INPUT6、50); // //调用 SFO ()使用校准的 MEP_ScaleFactor 更新 HRMSTEP 寄存器。 // HRMSTEP 必须在启用前填充比例因子值 //高分辨率周期控制。 // while (status =SFO_Incomplete) { 状态= SFO (); if (status =SFO_ERROR) { ERROR();//如果发生错误,SFO 函数返回2,MEP # } //步进/粗步进超过最大255。 } // //禁用同步(也冻结 PWM 的时钟) // SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_GTBCLKSYNC); SYSCTL_DisablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); initHRPWM (ePWM_TIMER_TBPRD); // //启用到 PWM 的同步和时钟 // SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC); //启用 ePWM 中断 // //中断_ENABLE (INT_EPWM1); //中断_ENABLE (INT_EPWM2); //中断_ENABLE (INT_EPWM3); //中断_ENABLE (INT_EPWM4); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; for (;;) { // //扫描 DutyFine // 对于(dutyFine = min_HRPWM_Duty_percent;dutyFine < 99.9;dutyFine += 0.01) { DEVICE_DELAY_US (1000); 对于(i=1 <LAST_EPWM_INDEX_FOR_EXAMPLE; i++) { float32_t 计数=(dutyFine *(float32_t)(ePWM_TIMER_TBPRD << 8)))/100; uint32_t compCount =(count); HRPWM_setCounterCompareValue (ePWM[i]、HRPWM_COUNTER_COMPARE_A、compCount); HRPWM_setCounterCompareValue (ePWM[i]、HRPWM_COUNTER_COMPARE_B、compCount); } // //调用换算系数优化器库函数 SFO () //定期跟踪温度/电压引起的任何变化。 //此函数通过运行生成 MEP_ScaleFactor HRPWM 逻辑中的// MEP 校准模块。 该比例 //系数可用于所有 HRPWM 通道。 SFO () //函数也使用更新 HRMSTEP 寄存器 //比例因子值。 // STATUS = SFO ();//在后台,MEP 校准模块 //持续更新 MEP_ScaleFactor 如果(status =SFO_ERROR) { ERROR();// SFO 函数在发生错误时返回2 &# // MEP 步进/粗步进 } //超过最大255。 } } // epwm1ISR - ePWM 1 ISR //////_interrupt void epwm1ISR (void)//{// ePWM_clearEventTriggerInterruptFlag (EPWM1_base);// Interrupt_clearACKGroup (interrupt_ACK_ACK_3);//////// epwmisr/ interrupt_isr/ ePWM/ interr/ ePWM3 (void)/ePWM/ interrupt_interrupt_interrupt_interrupt_isr/ ePWM3)/ePWM3 (ep_interr/ ePWM3)/ePWM/ eep_interrupt_interrupt_interrupt_interrupt_interrupt_interrupt_isr/ eWmisr/ eWmisr/ eWmisr/ eWm/ ePWM3)/eWmisr/ eep_interrupt_interrupt_interr // Interrupt_clearACKGroup (interrupt_ACK_Group3); // //// epwm4ISR - ePWM 4 ISR // ////// interrupt void epwm4ISR (void) //// ePWM_clearEventTriggerInterruptFlag (EPWM4_base); // Interrupt_ACKGroup (void ) // EPWM3_ interrupt (void)// EPWM3_ interrupt) // //将 GPIO0/1分别配置为 ePWM1A/1B 引脚 // GPIO_setPadConfig (0、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_0_EPWM1A); GPIO_setPadConfig (1、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_1_EPWM1B); // //将 GPIO2/3分别配置为 ePWM2A/2B 引脚 // GPIO_setPadConfig (2、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_2_EPWM2A); GPIO_setPadConfig (3、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_3_EPWM2B); // //将 GPIO4/5分别配置为 ePWM3A/3B 引脚 // GPIO_setPadConfig (4、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_4_EPWM3A); GPIO_setPadConfig (5、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_5_EPWM3B); // //将 GPIO6/7分别配置为 ePWM4A/4B 引脚 // GPIO_setPadConfig (6、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_6_EPWM4A); GPIO_setPadConfig (7、GPIO_PIN_TYPE_STD); GPIO_setPinConfig (GPIO_7_EPWM4B); } void initHRPWM (uint32_t 周期) { uint16_t j; // 具有 HRPWM 的// ePWM 通道寄存器配置 // ePWMxA/ePWMxB 在上升沿由 MEP 控制切换为低电平/高电平 // 对于(j=1;j <
感谢你的答复。 您能否提供一些有关 SFO 最大延迟数的文档? 您是否在我提供的示例中发现了任何问题? 您能否发送整个项目以便我自己进行测试?
谢谢你。
要测试 项目、只需使用 Driverlib 示例项目并将 main.c 替换为我提供的项目。
http://dev.ti.com/tirex/explore/node?node=ANitrqhsIFh2iKi74mDV8g__gYkahfz__LATEST
此外、对于可使用的延迟数量、取决于是否启用了自动转换。 启用后、您可以在 SFO 函数完成后查看 HRMSTEP 寄存器。