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.

[参考译文] TMS320F28051:ADC 转换出现问题

Guru**** 663810 points
Other Parts Discussed in Thread: TMS320F28051
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/674301/tms320f28051-problem-with-the-adc-conversion

器件型号:TMS320F28051

您好!

我实际上在处理器 TMS320F28051上的 ADC 转换方面遇到了一个大问题。 目标是在所有 ADC 输入上进行连续转换、并由 ADCINT1生成 SOC。

我的问题是、其中一些措施是正确的、而有些措施不是...

经过一些分析、可以看出、输入产生问题的原因是它们在数据表(SPRS797B、第14页)中定义为 ADCINxy (运算放大器)。

下面是我执行的代码:

空 InitADC()

EALLOW;/*允许修改受保护的寄存器*/

SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//启用 ADC 时钟*

AdcRegs.ADCCTL1.bit.reset = 1;//重置整个 ADC 模块*

DELAY_US (1);/*确保复位后的2个时钟周期*/

AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC BG (内部带隙-内部电压基准)*/
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准(内部基准缓冲器)*
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC (内核内部的模拟电路)*/
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC *
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部 BG *
EDIS;/*受保护寄存器的暂停修改*

DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟

EALLOW;/*允许修改受保护的寄存器*/
(* Device_cal ();//使用器件特定的校准数据校准内部振荡器和 ADC */
EDIS;/*受保护寄存器的暂停修改*

DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟

AdcOffsetSelfCal();

DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟


/*--配置 ADC --*/
EALLOW;/*允许修改受保护的寄存器*/

AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// ADCINT1在 AdcResults 锁存之后跳闸*/

AdcRegs.INTSEL1N2.bit.INT1SEL = 14;//设置 EOC14以触发 ADCINT1触发*
AdcRegs.INTSEL1N2.bit.INT1CONT = 1;//启用 ADCINT1连续模式*
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1 *

AdcRegs.ADCSOC0CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC3CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC4CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC5CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC6CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC7CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC8CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC9CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC10CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC11CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC12CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC13CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC14CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC15CTL.bit.ACQPS = 0x3F;

AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 1;//将 ADCINT1设置为 SOC0的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 1;//将 ADCINT1设置为 SOC1的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 1;//将 ADCINT1设置为 SOC2的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 1;//将 ADCINT1设置为 SOC3的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 1;//将 ADCINT1设置为 SOC4的触发器*
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 1;//将 ADCINT1设置为 SOC5的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 1;//将 ADCINT1设置为 SOC6的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 1;//将 ADCINT1设置为 SOC7的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1;//将 ADCINT1设置为 SOC8的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;//将 ADCINT1设置为 SOC9的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;//将 ADCINT1设置为 SOC10的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;//将 ADCINT1设置为 SOC11的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;//将 ADCINT1设置为 SOC12的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;//将 ADCINT1设置为 SOC13的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;//将 ADCINT1设置为 SOC14的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;//将 ADCINT1设置为 SOC15的触发器*/

AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;//将 SOC0通道选择设置为 ADCINA0 *
AdcRegs.ADCSOC1CTL.bit.CHSEL = 0x1;//将 SOC2通道选择设置为 ADCINA1 *
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0x2;//将 SOC2通道选择设置为 ADCINA2 *
AdcRegs.ADCSOC3CTL.bit.CHSEL = 0x3;//将 SOC2通道选择设置为 ADCINA3 *
AdcRegs.ADCSOC4CTL.bit.CHSEL = 0x4;//将 SOC2通道选择设置为 ADCINA4 *
AdcRegs.ADCSOC5CTL.bit.CHSEL = 0x5;//将 SOC4通道选择设置为 ADCINA5 *
AdcRegs.ADCSOC6CTL.bit.CHSEL = 0x6;//将 SOC6通道选择设置为 ADCINA6 *
AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x7;//将 SOC6通道选择设置为 ADCINA7 *
AdcRegs.ADCSOC8CTL.bit.CHSEL = 0x8;//将 SOC6通道选择设置为 ADCINB0 *
AdcRegs.ADCSOC9CTL.bit.CHSEL = 0x9;//将 SOC6通道选择设置为 ADCINB1 *
AdcRegs.ADCSOC10CTL.bit.CHSEL = 0xA;//将 SOC6通道选择设置为 ADCINB2 *
AdcRegs.ADCSOC11CTL.bit.CHSEL = 0xB;//将 SOC6通道选择设置为 ADCINB3 *
AdcRegs.ADCSOC12CTL.bit.CHSEL = 0xC;//将 SOC6通道选择设置为 ADCINB4 *
AdcRegs.ADCSOC13CTL.bit.CHSEL = 0xD;//将 SOC6通道选择设置为 ADCINB5 *
AdcRegs.ADCSOC14CTL.bit.CHSEL = 0xE;//将 SOC6通道选择设置为 ADCINB6 *
AdcRegs.ADCSOC15CTL.bit.CHSEL = 0xF;//将 SOC6通道选择设置为 ADCINB7 *

EDIS;/*受保护寄存器的暂停修改*

中断空 AdcIsr (空)

//确认此__interrupt 以从组1接收更多__interrupts

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

空 InitInterrupt()

Dint;/*禁用 CPU 中断,这是 main ()中的第一步*/

/*重新初始化 PIE、PIEACK、IER、IFR */
InitPieCtrl();/*初始化 PIE 控制寄存器*/
PieCtrlRegs.PIEACK.ALL = 0xFFFF;//确认所有中断*/
IER &= 0x0000;//禁用所有中断*/
IFR &= 0x0000;//清除所有中断标志*/

/*将所需的 ISR 映射到 PieVectTable */
InitPieVectTable();/*初始化 PIE 矢量表*/
EALLOW;/*允许修改受保护的寄存器*/
PieVectTable.ADCINT1 =&AdcIsr;//映射 ADC 1中断*/EDIS;//暂停修改受保护的寄存器*/

/* PIE 级中断启用*/
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 ADCINT1 *

int main (空)

(笑声)
InitInterrupt();/*初始化中断*/

InitADC();/*初始化 ADC 模块*/

(笑声)
IER |= M_INT1;//启用 CPU 中断1 */
EINT;//启用全局中断 INTM */

ERTM;/*启用全局实时中断 DBGM *

AdcRegs.ADCSOCFRC1.bit.SOC14 = 1;
AdcRegs.INTSEL1N2.bit.INT1E = 1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

/*主循环*/
while (true)

(笑声)

请告诉我问题出在哪里? 为什么只有具有(运算放大器)说明的输入会造成一些问题?
我检查了数据表、发现 PGA 可能是变化的来源、但它的缝隙是针对该功能配置的...

非常感谢您的帮助...

最好

Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Steve、

    我认为你的结论是正确的。 F2805x 上的 PGA 不能被连接到它们的 ADC 通道旁路以直接采样 PGA 输入。 您需要启用和配置 PGA 才能使用这些通道。 您可以看到"PGA_COMP"示例以供参考。

    较新的 F28004x 系列器件还具有 PGA、但大多数 PGA 输入可通过交替 ADC 通道直接采样。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Tommy、

    感谢您的反馈... 现在所有程序都正常运行...

    最棒的

    Steve