我正在使用 PWM 发生器0和发生器1 (总共4PWM)为单相 H 桥电路生成中心对齐的 PWM @ 20kHz。
我想以10kHz 的一半 PWM 频率运行控制环路 ISR、并使用 PWM 发生器2触发 ADC 以在10kHz 进行电流感应、如下图所示。 是否可以在增减模式下将 PWM-Generator-2时基与 PWM 发生器0和1的两倍负载值同步?
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.
我正在使用 PWM 发生器0和发生器1 (总共4PWM)为单相 H 桥电路生成中心对齐的 PWM @ 20kHz。
我想以10kHz 的一半 PWM 频率运行控制环路 ISR、并使用 PWM 发生器2触发 ADC 以在10kHz 进行电流感应、如下图所示。 是否可以在增减模式下将 PWM-Generator-2时基与 PWM 发生器0和1的两倍负载值同步?
您好、米兰、
感谢您提供的图片、非常有助于我理解、这一点现在已经非常清楚了。
不幸的是,答案是:"视情况而定"
您需要同步的紧密程度如何?
您愿意重新同步信号的频率是多少?
这两个问题对于确定可能的情况非常关键。
通常、在两个不同周期的同步中、最好是尽可能地将它们的计数器清零。 使用同步 API 可以很好地实现这一点、但同步不会永远持续、并且实际上初始降级会非常快、因为在3-4ms 内、同步中已经存在300-400ns 的误差。 不重新同步的时间越长、同步越多、其速率似乎约为25ns/ms (仅通过一些粗略的测量和计算)。
如果您对微小的变化甚至不能容忍、或者无法经常重新同步、那么根据我的调查结果、您将无法实现您所期望的目标。
这是我用来尝试此操作的代码。 我现在知道、你也需要调整中心、但这并不反映、但我认为原则是相同的。
uint32_t ui32SysClock; ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); SysCtlPWMClockSet (SYSCTL_PWMDIV_1); SysCtlPeripheralEnable (SYSCTL_Periph_PWM0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG); GPIOPinConfigure (GPIO_PK4_M0PWM6); GPIOPinConfigure (GPIO_PG1_M0PWM5); GPIOPinTypePWM (GPIO_PORTK_base、GPIO_PIN_4); GPIOPinTypePWM (GPIO_PORTG_base、GPIO_PIN_1); PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_GEN_SYNC_LOCAL); PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_GEN_SYNC_LOCAL); PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、(ui32SysClock / 10000)- 1); PWMPulseWidthSet (PWM0_BASE、PWM_OUT_6、(ui32SysClock / 50000)- 1); PWMGenPeriodSet (PWM0_BASE、PWM_GEN_2、(ui32SysClock / 20000)- 1); PWMPulseWidthSet (PWM0_BASE、PWM_OUT_5、(ui32SysClock / 50000)- 1); PWMOutputState (PWM0_BASE、PWM_OUT_6_BIT | PWM_OUT_5_BIT、TRUE); PWMGenEnable (PWM0_BASE、PWM_GEN_3); PWMGenEnable (PWM0_BASE、PWM_GEN_2); PWMSyncTimeBase (PWM0_BASE、PWM_GEN_2_BIT | PWM_GEN_3_BIT); PWMSyncUpdate (PWM0_BASE、PWM_GEN_2_BIT | PWM_GEN_3_BIT); while (1) { //不执行任何操作 SysCtlDelay (50000); PWMSyncTimeBase (PWM0_BASE、PWM_GEN_2_BIT | PWM_GEN_3_BIT); PWMSyncUpdate (PWM0_BASE、PWM_GEN_2_BIT | PWM_GEN_3_BIT); }