ZHCACE4A March 2023 – August 2024 TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F2800152-Q1 , TMS320F2800153-Q1 , TMS320F2800154-Q1 , TMS320F2800155 , TMS320F2800155-Q1 , TMS320F2800156-Q1 , TMS320F2800157 , TMS320F2800157-Q1 , TMS320F280021 , TMS320F280021-Q1 , TMS320F280023 , TMS320F280023-Q1 , TMS320F280023C , TMS320F280025 , TMS320F280025-Q1 , TMS320F280025C , TMS320F280025C-Q1 , TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F28P650DK
本应用手册中的示例使用带有 driverlib 的 SysConfig 来配置 ADC、ePWM 和其他外设。在程序代码内,设置 ADC 来更大限度地减少开销,从而在各次转换之间留出更多时间来执行控制循环。对于本应用手册中使用的示例,SOC 配置为具有循环优先级的突发模式,以便在过采样时一起触发 SOC 并进行累加,而不会丢失任何值。中断设置为在最后一个 SOC(用于 F28003x 的 SOC15)到达转换结束时触发。中断会运行相应的 ISR,该 ISR 会存储 ADC 结果,如果启用了过采样,则累加多个 SOC 结果。
ePWM 会触发此处的 SOC,但也可以使用软件触发器和 CPU 计时器触发器。选择触发周期时应小心,使 SOC 采样保持一致,并在控制循环其余部分保持适当的转换时间。一旦突发序列中的最后一个 SOC 发出转换结束信号,ISR 便会执行控制循环。在此示例中,控制循环包含一个简单的累加函数,用于过采样和存储结果。应避免对值求平均,因为这会丢弃结果较低位中包含的信息,进而有效降低测量精度。在触发下一次突发之前,最终结果存储在存储器中。
以下代码是使用突发 ISR 设置进行基线采样的示例:
__interrupt void adcA1ISR(void)
{
//
// Clear the interrupt flag
//
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
//
// 1X Oversampling
//
lv_results[nloops++] = ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER0);
//
// Check if overflow has occurred
//
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{
ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
//
// Check if all results are stored
//
if(nloops >= numBins)
{
//
// Disable ADC interrupt
//
ADC_disableInterrupt(myADC0_BASE, ADC_INT_NUMBER1);
ESTOP0;
}
//
// Acknowledge the interrupt
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
使用 ISR 对信号进行 8 倍过采样的示例如下:
__interrupt void adcA1ISR(void)
{
//
// Clear the interrupt flag
//
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
//
// Accumulate 8 ADC results to oversample 8X
//
lv_results[nloops++] = (ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER0) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER1) +
ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER2) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER3) +
ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER4) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER5) +
ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER6) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER7));
//
// Check if overflow has occurred
//
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{
ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
//
// Acknowledge the interrupt
//
Interrupt_cl