Part Number:TMS320F280049
请问ADC多通道循环采样该如何配置?当三个ADC module选择定时器触发所有通道(触发周期5us),并且开启ADCA的中断时,所有SOC通道的转换结果都相同。以下是我的ADC SOC通道配置,麻烦看一下配置上是否有不对的,或者是不是方式不对。谢谢。 目标是实现 ADC A \ B \ C的各个通道循环同步采样(每个循环开始时同步)。
#define USER_ACQPS_ 40
void InitADCSOC(void)
{
//config SOCs, set the triggler source for SOCs. ACQPS = 40(0.5US) ConvTime: 10*0.025=0.25us
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN9, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN6, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN2, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN3, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN0, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN2, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN3, USER_ACQPS_);
ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN1, USER_ACQPS_); ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN14, USER_ACQPS_);
ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
Interrupt_register(INT_ADCA1, &ADCAInt1ISR);
Interrupt_enable(INT_ADCA1);
ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER4);
ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER2);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER3);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER4);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
__interrupt void ADCAInt1ISR(void)
{
// Interrupt_disable(INT_ADCA1);// Disable this interrupt from happening again
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);// Acknowledge interrupt
ADValue[0] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
ADValue[1] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
ADValue[2] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2);
ADValue[3] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER3);
ADValue[4] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER4);
ADValue[5] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
ADValue[6] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER1);
ADValue[7] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER2);
ADValue[8] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER3);
ADValue[9] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
ADValue[10] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1);
ADValue[11] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER2);
// 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);
}
}
以下是ADC转换结果截图:
Green Deng:
这个是每个模块的数值不一样,但是模块里面每个通道的数值一样。
通道里面测试的数值都正确吗?方便测试一下按顺序排一下SOC和对应的通道吗,程序里面的排序太乱了。虽然好像跟问题的关系不大。
,
zujian11 zhang:
简单列一下就是:
SOC0 -> ADC A4
SOC1 -> ADC A9
SOC2 -> ADC A6
SOC3 -> ADC A2
SOC4 -> ADC A3
SOC0 -> ADC B0
SOC1 -> ADC B4
SOC2 -> ADC B2
SOC3 -> ADC B3
SOC0 -> ADC C1
SOC1 -> ADC C14
SOC2 -> ADC C4
实际端口量得电压得情况:
A4、A9:0V
A3: 1.4967V
B0、B4:0V
C1: 1.9337V
C4: 1.4895V
C14: 0V
其余的前级是浮空的。
,
zujian11 zhang:
具体通道的配置我觉得应该不重要,问题在结果出来的值都是一样的,不知道哪里配置有问题。
,
Green Deng:
是的,我也在奇怪,因为看你的配置并没有重叠的地方。我会再看一下这个问题,有结果了回复你。
,
Green Deng:
可能需要检查基本 ADC 和设备配置的内容:
1、ADC 是否配置为内部或外部参考模式? VREFHI 引脚上的电压是多少?2、ADCCLK 的值是多少(基于 SYSCLK 到 ADCCLK 预分频器)? (可能还需要验证 CPU SYSCLK 的值)3、VDDA 电源电压的值是多少?4、ADC 是否已通电? (在采样之前是否遵循了通电延迟时间?)另外,复制的 SOC 配置代码似乎没问题
,
zujian11 zhang:
问题找到了。VDDA不稳定,过低了。
谢谢您的指导。thanks!
,
zujian11 zhang:
问一下,在参考电压配置成1.65V时,ADC的满量程是单纯地通过量得的 VREFHI电压 x2 计算出来吗?我这边量出来的VREFHI不是刚好1.65V.
,
Hao Liu:
你好,我也遇到了你类似的问题,请问您你这个问题怎么解决的呐
,
Hao Liu:
是要更换电源吗
,
zujian11 zhang:
VDDA的电压稳定了就OK了。你看看电源的输出功率够不够。根据手册,VDDA的电流最大有30mA。