请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F28379D 主题:C2000WARE 中讨论的其他器件
工具/软件:
您好团队:
我们正在使用电流控制技术进行升压转换器的闭环控制。
目前、我们检测到三个数量
1. VIN
2.输出电压
3.
转换器的开关频率为65kHz、因此电感器电流波形也将具有65kHz 的频率。
为了检测该信号、我们使用了 ePWM 来触发转换开始和转换结束。 下面是我用于检测电感器电流的所附代码。 我已将65kHz× 10作为 ADC 在每个周期中对电感器电流波形进行采样的采样频率。
但问题是当我在 DAC 上强制施加检测到的电感器电流信号并比较波形时、形状和斜率是不同的。 请查看代码或提供任何资源来解决问题
。
void epwm2(){ // Start ePWM2, enabling SOCA and putting the counter in up-count mode EPWM_enableADCTrigger(EPWM2_BASE, EPWM_SOC_A); EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_UP); while(bufferFull == 0) { } bufferFull = 0; // Stop ePWM2, disabling SOCA and freezing the counter EPWM_disableADCTrigger(EPWM2_BASE, EPWM_SOC_A); EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_STOP_FREEZE); } void initADC(void) { ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0); ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV); ADC_enableConverter(ADCA_BASE); DELAY_US(10000); } void initEPWM(void) { // Disable SOCA EPWM_disableADCTrigger(EPWM2_BASE, EPWM_SOC_A); // Configure the SOC to occur on the first up-count event EPWM_setADCTriggerSource(EPWM2_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPA); EPWM_setADCTriggerEventPrescale(EPWM2_BASE, EPWM_SOC_A, 1); EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_A,76.92); EPWM_setTimeBasePeriod(EPWM2_BASE,153.84); // Set the local ePWM module clock divider to /1 EPWM_setClockPrescaler(EPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // Freeze the counter EPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_STOP_FREEZE); } void initADCSOC(void) { // Configure SOC0 to SOC3 of ADCA to convert pins A0 to A3. // The EPWM2SOCA signal will be the trigger. ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM2_SOCA, ADC_CH_ADCIN2, 15); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM2_SOCA, ADC_CH_ADCIN3, 15); ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM2_SOCA, ADC_CH_ADCIN4, 15); ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER4); ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); } __interrupt void adcA1ISR(void) { adcResult0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2); adcResult1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER3); adcResult2 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER4); if (index >= RESULTS_BUFFER_SIZE) { index = 0; bufferFull = 1; } ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); if (true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1)) { ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); } Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); }