Thread 中讨论的其他器件:SysConfig
您好!
C2000器件上的外设变得非常复杂,有时很难理解如何充分利用它:-)
我有6个模拟信号。
3连接到 ADCA、3连接到 ADCB
我需要同时采样所有6个信号、或尽可能接近彼此。
我已配置为 fifows:
SOC0 -> ADCA CH2、TRIG EPWM1
SOC1 -> ADCA CH3、TRIG EPWM1
SOC2 -> ADCA CH4、TRIG EPWM1
SOC0 -> ADCB CH2、TRIG EPWM1
SOC1 -> ADCB ch3、TRIG EPWM1
SOC2 -> ADCB CH4、TRIG EPWM1
ADCA 中断。
采集 时间设置为60个时钟。 60 * 5ns = 300ns。
我有2个问题:
1:此当前配置中发生了什么情况?
我猜在 EPWM1触发时、转换将在所有通道上启动?
是否在每个 ePWM 事件中对所有6个通道进行采样?
我是否需要使用突发模式来使其正常工作?
2:在 示波器上进行性能评测时、EPWM1触发器和 ADC ISR 之间的时间为1.5us
转换时间为5 * 300ns。
我不理解这一结果。
我预期、(如果 ADC A 和 B 同时采样)转换时间将为3个样本* 300ns。
我希望获得有关最佳配置的一些指导。
谢谢!
请参阅 SysConfig 的配置
void adc_init(){
//M_PAN_ADCA 初始化
// ADC 初始化:写入 ADC 配置并为 ADC 加电
//配置模数转换器模块预分频器。
ADC_setPrescaler (M_PAN_ADCA_BASE、ADC_CLK_DIV_4_0);
//配置模数转换器分辨率和信号模式。
ADC_setMode (M_PAN_ADCA_BASE、ADC_RESolution_12位、ADC_MODE_SINGLE_ENDLE);
//设置转换结束脉冲的时序
ADC_setInterruptPulseMode (M_PAN_ADCA_BASE、ADC_PULSE_END_of _CONV);
//为模数转换器内核加电。
ADC_enableConverter (M_PAN_ADCA_BASE);
//延迟1ms 以允许 ADC 加电时间
DEVICE_DELAY_US (500);
// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_DisableBurstMode (M_PAN_ADCA_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPPriority (M_PAN_ADCA_BASE、ADC_PRI_All_ROUND);
//转换0配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN2、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//转换1配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN3
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER1、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN3、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER1、ADC_INT_SOC_TRIGGER_NONE);
//转换2配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:2.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN4
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_PAN_ADCA_BASE、ADC_SOC_NUMBER2、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN4、60U);
ADC_setInterruptSOCtrigger (M_PAN_ADCA_BASE、ADC_SOC_NUMBER2、ADC_INT_SOC_TRIGGER_NONE);
// ADC 中断1配置
// SOC/EOC 编号:2.
//中断源:启用
//连续模式:已禁用
ADC_setInterruptSource (M_PAN_ADCA_BASE、ADC_INT_NUMBER1、ADC_SOC_NUMBER2);
ADC_enableInterrupt (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);
ADC_DisableContinuousMode (M_PAN_ADCA_BASE、ADC_INT_NUMBER1);
// PPB 配置:为 ADCPPB 配置上限和下限检测
//后处理块1配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:1.
// SOC/EOC 编号:0
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、ADC_SOC_NUMBER0);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_NUMBER1);
//后处理块2配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:2.
// SOC/EOC 编号:1.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、ADC_SOC_NUMBER1);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_NUMBER2);
//后处理块3配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:3.
// SOC/EOC 编号:2.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_PAN_ADCA_BASE、ADC_PPB_Number3、ADC_SOC_Number2);
ADC_DisablePPBEvent (M_PAN_ADCA_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_DisablePPBEventInterrupt (M_PAN_ADCA_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_PAN_ADCA_BASE、ADC_PPB_Number3、0);
ADC_setPPBReferenceOffset (M_PAN_ADCA_BASE、ADC_PPB_Number3、0);
ADC_DisablePPBTwosComplement (M_PAN_ADCA_BASE、ADC_PPB_Number3);
ADC_setPPBTripLimits (M_PAN_ADCA_BASE、ADC_PPB_Number3、0、0);
ADC_DisablePPBEventCBCClear (M_PAN_ADCA_BASE、ADC_PPB_Number3);
//M_tilt_ADCB 初始化
// ADC 初始化:写入 ADC 配置并为 ADC 加电
//配置模数转换器模块预分频器。
ADC_setPrescaler (M_tile_ADCB_BASE、ADC_CLK_DIV_4_0);
//配置模数转换器分辨率和信号模式。
ADC_setMode (M_tilt_ADCB_BASE、ADC_resolution_12位、ADC_mode_single_ended);
//设置转换结束脉冲的时序
ADC_setInterruptPulseMode (M_tile_ADCB_BASE、ADC_PULSE_END_of _CONV);
//为模数转换器内核加电。
ADC_enableConverter (M_tile_ADCB_BASE);
//延迟1ms 以允许 ADC 加电时间
DEVICE_DELAY_US (500);
// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_DisableBurstMode (M_tile_ADCB_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPPriority (M_tilt_ADCB_BASE、ADC_PRI_All_ROUND);
//转换0配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN2
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN2、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//转换1配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN3
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_number1、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN3、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_number1、ADC_INT_SOC_TRIGGER_NONE);
//转换2配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:2.
//触发:ADC_TRIGGER_EPWM1_SOCA
//通道:ADC_CH_ADCIN4
//示例窗口:60个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (M_tilt_ADCB_BASE、ADC_SOC_number2、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN4、60U);
ADC_setInterruptSOCtrigger (M_tile_ADCB_BASE、ADC_SOC_number2、ADC_INT_SOC_TRIGGER_NONE);
// PPB 配置:为 ADCPPB 配置上限和下限检测
//后处理块1配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:1.
// SOC/EOC 编号:0
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_number1、ADC_SOC_NUMBER0);
ADC_DisablePPBEvent (M_tilt_ADCB_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_tile_ADCB_BASE、ADC_PPB_number1、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_number1、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_number1、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_number1);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_number1、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_number1);
//后处理块2配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:2.
// SOC/EOC 编号:1.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_number2、ADC_SOC_number1);
ADC_DisablePPBEvent (M_tile_ADCB_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_DisablePPBEventInterrupt (M_tile_ADCB_BASE、ADC_PPB_number2、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO);
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_number2、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_number2、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_number2);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_number2、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_number2);
//后处理块3配置
//在 ADC 中配置后处理块(PPB)。
// PPB 编号:3.
// SOC/EOC 编号:2.
//校准偏移量:0
//参考偏移量:0
//二进制补码:已禁用
//行程上限:0
//行程下限:0
//清除 PPB 事件标志:已禁用
ADC_setupPPB (M_tile_ADCB_BASE、ADC_PPB_Number3、ADC_SOC_number2);
ADC_DisablePPBEvent (M_tile_ADCB_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_DisablePPBEventInterrupt (M_tilt_ADCB_BASE、ADC_PPB_Number3、(ADC_EVT_TRIPHI | ADC_EVT_TRIPLO | ADC_EVT_ZERO));
ADC_setPPBCalibrationOffset (M_tile_ADCB_BASE、ADC_PPB_Number3、0);
ADC_setPPBReferenceOffset (M_tile_ADCB_BASE、ADC_PPB_Number3、0);
ADC_DisablePPBTwosComplement (M_tile_ADCB_BASE、ADC_PPB_Number3);
ADC_setPPBTripLimits (M_tile_ADCB_BASE、ADC_PPB_Number3、0、0);
ADC_DisablePPBEventCBCClear (M_tile_ADCB_BASE、ADC_PPB_Number3);
}
void interrupt_init(){
// INT_M_PAN_ADCA_1的中断设置
INTERRUPT_REGISTER (INT_M_PAN_ADCA_1、&INT_M_PAN_ADCA_1_ISR);
INTERRUPT_ENABLE (INT_M_PAN_ADCA_1);
}

