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.
工具与软件:
我打算使用 ADCA0~5 ADCB0~5、其中 SOC0被分配给 ADCA0、SOC1被分配给 ADCA1、...依顺序依此类推。
相关代码的设置如下
void setupADC(void) { //single ended AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE); EALLOW; //ADCA AdcaRegs.ADCCTL2.bit.PRESCALE = 0; AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //ADCB AdcbRegs.ADCCTL2.bit.PRESCALE = 0; AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; EDIS; DELAY_US(1000); } void setupADCSOC(void) { EALLOW; //ADCA AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; // SOC0(=ADCA0) AdcaRegs.ADCSOC0CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; // SOC1(=ADCA1) AdcaRegs.ADCSOC1CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 // AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; // SOC2(=ADCA2) AdcaRegs.ADCSOC2CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; // SOC3(=ADCA3) AdcaRegs.ADCSOC3CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4; // SOC4(=ADCA4) AdcaRegs.ADCSOC4CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5; // SOC5(=ADCA5) AdcaRegs.ADCSOC5CTL.bit.ACQPS = 50; AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 // AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // End of SOC5 will set INT1 flag // AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag // AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared //ADCB AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; // SOC0(=ADCB0) AdcbRegs.ADCSOC0CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; // SOC1(=ADCB1) AdcbRegs.ADCSOC1CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcbRegs.ADCSOC2CTL.bit.CHSEL = 2; // SOC2(=ADCB2) AdcbRegs.ADCSOC2CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcbRegs.ADCSOC3CTL.bit.CHSEL = 3; // SOC3(=ADCB3) AdcbRegs.ADCSOC3CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcbRegs.ADCSOC4CTL.bit.CHSEL = 4; // SOC4(=ADCB4) AdcbRegs.ADCSOC4CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC4CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 AdcbRegs.ADCSOC5CTL.bit.CHSEL = 5; // SOC5(=ADCB5) AdcbRegs.ADCSOC5CTL.bit.ACQPS = 50; AdcbRegs.ADCSOC5CTL.bit.TRIGSEL = 1; // Trigger on CPUTIMER0 // AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 5; // End of SOC5 will set INT1 flag //AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; // Enable INT1 flag // AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Make sure INT1 flag is cleared EDIS; }
正如预期的那样、当向 ADCA0引脚施加3.3V 电压时、RESULT0寄存器应输出4095、而 当向 ADCA0引脚施加0V 电压时、结果0应产生0。
但是、将3.3V 施加到 ADCA0会更改 RESULT1和 RESULT2寄存器中的值 (在这个情况下、引脚 ADCA1至 ADCA5被连接至 GND。)
此外、当向 ADCA1施加3.3V 电压(将 ADCA1和 ADCA 2至5连接至 GND)时、RESULT1寄存器的值没有变化。
我已正确分配引脚、将 SW2:基准电压设置为0–3.3V、但我仍然遇到结果寄存器值的意外变化以及 ADCB 中的同样问题。
--> ADCA0:0V
RESULT1、2 --> 0
和 adcA1 3.3V (黄线)-->所有结果0
ADCA1连接到3.3V、而 ADC0和引脚2至5连接到 GND。
你(们)好
[报价 userid="626554" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1432733/tmdscncd28379d-adc-result-register-problem-not-matched-to-ADCA0"]根据预期、在对引脚施加3.3V 电压时、RESULT0寄存器应输出4095、而 在对 soc 引脚施加0V 电压时、结果0 应产生0。[/QUOT]是的、就是这样。
ADC 完成 SOC1的转换后、将结果放入 ADCResult 寄存器1中。
SOC2转换结果位于结果寄存器2中。 依此类推。
C2000ware 中有适用于 ADC 的类似示例。您可以先尝试一下吗?
这是它的链接。
[安装路径]\C2000Ware_5_03_00_00\driverlib\f2837xd\examples\cpu1\adc\
谢谢!
Susmitha
您好、感谢您的答复。 但是、我已经了解了 ADC 和 SOC 转换。 我当前的问题是、向 ADC0引脚施加电压会导致 RESULT1和 RESULT2值发生变化。
谢谢!
"eunjin
你好、伊恩津、
您是否碰巧看了这些示例并尝试运行一些示例?
在此示例中、您使用的是 SYSCLK 和 adcclk 值?
谢谢!
Susmitha
在我的代码中、SYSCLK 设置为100 MHz、ADC 设置为51 SYSCLK。
ConfigCpuTimer (&CpuTimer0100、10);
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;// SOC0 (=ADCA0)
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 50;//采样窗口为50+1个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1;//在 CPUTIMER0上触发
此外、我运行了您提到的示例(adc_soc_software_sync_cpu01.c)文件、它可以正常运行、ADC 结果也可以正确输出。
不过、与我的代码相比、唯一的区别似乎是输入 XBAR 的使用、而且 ADC 配置中似乎没有任何其他差异。
你好、伊恩津、
我看到您已设置 AdcaRegs.ADCCTL2.bit.PRESCALE = 0;这意味着预分频比为 1、将 SYSCLK 除以1、即在本例中、假设 SYSCLK 为100MHz、则为 ADCCLK 100MHz。
如果您希望 ADCCLK 为50MHZ..please、请设置 AdcaRegs.ADCCTL2.bit.prescale = 2。
您是否可以尝试更改上述内容并查看您的代码是否有效?
谢谢!
Susmitha。
您好!
抱歉、我之前说错了。 将预分频设置为0是正确的。 我将使用计时器0在每个10 µs 期间触发 ADCSOC、并使用 ADCSOC 读取引脚 I 的电压值、 在 EOC 发生时发生中断
谢谢!
伊恩津
你好、伊恩津、
我将关闭该线程、因为这是重复的线程。
还有与此类似的其他主题、请在此处跟踪支持:
TMDSCNCD28379D:ADC 结果寄存器问题(与 SOC 不匹配)- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛
谢谢!
Susmitha