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.

[参考译文] TMS320F28335:ADC 未读取值

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/607888/tms320f28335-adc-does-not-read-value

器件型号:TMS320F28335
主题中讨论的其他器件:controlSUITEREF3120OPA320OPA350

F28335 ADC 不工作。 我检查引脚。 我更改输入电压、然后将电压值更改为 ADC 引脚、但 adcresult 寄存器值不会更改 adcresult6 adcresult7寄存器值始终会更改输入 GND 其他 adcresult 寄存器常量值、但当我更改输入电压 adcresultregister 时、不会产生任何影响。  这些 adcresult6-7变化的来源是什么。

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

    您可能无法从 ADC 获得正确的读数、原因有多种。 继续操作的最佳方法是在 controlSUITE 中打开其中一个 F28335示例项目并检查其是否正常工作。 有一个名为"ADC_SoC"的示例、该示例将两个通道连续读取到一对数组中。 我建议尝试一下。 如果您获得预期结果、则代码中存在错误、否则可能是硬件问题。

    此致、

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

    我进行 triing 会运行 ADC_SoC 示例、但没有任何变化、ADC 不会读取任何值。 我还检查 adcsreext、adcrefp、adcrefm、adcrefin、adcclo 引脚。  元件和连接到这些引脚的电压值是正确的。例如,我改变 直流电压,进入 ADCIN6引脚的电压是 1.356V,但是 AdcRegs.ADCRESULT6的电压 会连续改变。 我正确使用 DSP 控制卡其他功能、例如 PWM、GPIO、但 ADC 有问题。

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

    Hakan、

    您使用的硬件是 TI 开发套件还是您自己的电路板?

    此外、您能否仅向我发送您的 ADC 初始化代码?  谢谢。

    此致、

    Richard

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

    您好、Ricard、

    我使用自己的电路板我会将 ADC 的一部分电路板原理图发送给您照片。 有奇怪的事件。 当我使用 ADC 引脚 adcin0-5 adcresult 值常量、但不要读取任何随机值、而是当我使用引脚 adcin6和 adcin7时、正如我在 adcresult 值更改 alwalys 之前所展示的那样。 此外、我还想将不同的通道更改为 adcin 引脚、但没有任何变化。毕竟、我在任何情况下都无法使用 ADC。 我最后使用 XCLKIN 30MHz。 这可能是个问题吗?

    感谢你的帮助

    我希望我们能够找到解决这个问题的办法

    此致、

    哈坎

    #include "DSP28x_Project.h"   

    _interrupt void ADC_ISR (void);

    uint16环计数;

    UINT16转换计数;

    uint16 Voltage1[10];

    uint16 Voltage2[10];

    MAIN ()

     InitSysCtrl();

     EALLOW;

     #IF (CPU_FRQ_150MHz)  //默认- 150MHz SYSCLKOUT

      #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0MHz

     #endif

     #IF (CPU_FRQ_100MHz)

      #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0MHz

     #endif

     EDIS;

     EALLOW;

     SysCtrlRegs.HISPCP。all = ADC_MODCLK;

     EDIS;

     Dint;

     InitPieCtrl();

     IER = 0x0000;

     IFR = 0x0000;

     InitPieVectTable();

     EALLOW; //这是写入 EALLOW 受保护寄存器所必需的

     PieVectTable.ADCINT =&ADC_ISR;

     EDIS;  //这是禁止写入 EALLOW 受保护寄存器所必需的

     InitAdc (); //对于此示例,初始化 ADC

    //在 PIE 中启用 ADCINT

     PieCtrlRegs.PIEIER1.bit.INTx6=1;

     IER |= M_INT1;//启用 CPU 中断1

     EINT;      //启用全局中断 INTM

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

     LoopCount = 0;

     ConversionCount = 0;

    //配置 ADC

     AdcRegs.ADCMAXCONV.ALL = 0x0003;   //在 SEQ1上设置2 conv

     AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x6;//将 ADCINA3设置为第1个 SEQ1转换器

     AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x7;//将 ADCINA2设置为第2个 SEQ1转换器

     AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1

     AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //启用 SEQ1中断(每个 EOS)

    //假设 ePWM1时钟已在 InitSysCtrl()中启用;

     EPwm1Regs.ETSEL.bit.SOCAEN = 1;    //启用组上的 SOC

     EPwm1Regs.ETSEL.bit.SOCASEL = 4;   //从 CPMA 中选择 SOC、以进行递增计数

     EPwm1Regs.ETPS.bit.SOCAPRD = 1;    //在发生第一个事件时生成脉冲

     EPwm1Regs.CMPA.half.CMPA = 0x0080; //设置比较值

     EPwm1Regs.TBPRD = 0xFFFF;        //为 ePWM1设置周期

     EPwm1Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动

    //等待 ADC 中断

     for (;;)

     {

       LoopCount++;

     }

    _interrupt void ADC_ISR (void)

     Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >> 4;

     Voltage2[ConversionCount]= AdcRegs.ADCRESULT1 >>4;

     //如果记录了40次转换,则重新开始

     if (ConversionCount = 9)

     {

      ConversionCount = 0;

     }

     其他

     {

       ConversionCount++;

     }

     //为下一个 ADC 序列重新初始化

     AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;     //重置 SEQ1

     AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;   //清除 INT SEQ1位

     PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断

     返回;

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

    在哪里设置 ADCREFSEL 寄存器以使用外部基准-它是在 AdcInit()中完成的?

    此外、该原理图未显示到 REF3120的接地连接。 有没有?

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Richard、
    您是对的 ı 忘记更改 ADCREFSEL。现在我添加了 AdcRegs.ADCREFSEL.bit.REF_SEL =0x1;在 InitAdc ()中;我检查了它从0x1F27变为0x5F27、但问题仍然存在。 REF3120在第三个引脚上具有接地连接。

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

    您获得的读数发生变化这一事实意味着这是一个配置问题、而不是一个硬件问题。 您能否仔细查看 ADC 时钟以确保外设频率不超过25MHz? 随附的图显示了您需要查看的寄存器和字段。

    在一切初始化后在代码中设置断点、并检查 CCS 中的寄存器内容。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ricard、
    首先、感谢您的帮助、现在、当我改变 adcresult 中的电压差异时、ADC 工作正常、但 ADC 仍然有问题。 例如、问题在于固定电压(1.47V) ADC 的读数类似于2002、2018、2030、2040值。 当我更改电压时、几乎有40个值错误、它读取了另一个值、但新值又相差40个值、例如1800、1820、1810、1842。 此问题源于何处? 我观察输入 ADC 示波器的电压是否恒定。如果电压恒定、ADC 读取的值不必相同?

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

    这些波动相当于 ADC 输入端的噪声大约为30mV。 您在那里测量的噪声是多少? 如果远小于该值、您可能需要尝试增大采集窗口长度(ADCTRL1寄存器中的 ACQ_PS 字段)。

    此致、

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

    您好、Hakan、

    驱动 ADC 基准电压的4.7K 欧姆电阻器之后是否有缓冲器?  ADC 基准需要一个极低阻抗和高带宽驱动器。  

    您可以尝试将其替换为0欧姆电阻、并向 VSSA 添加与 REF3120输出驱动一样大的电容器...可能是2.2 uF 的好起点。  如果这还不够、您应该尝试使用运算放大器进行缓冲。  我们建议将 OPA320或 OPA350用于某些较新的器件、但这些器件也应在此处工作。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard 和 Devin
    我尝试更改 ADC_MODCLK 和 ACQ_PS。 我增加了这两个问题,但同样的问题仍然存在。 4.7K 欧姆电阻后没有缓冲器。 ref3120的输出端有一个4.7K 电阻器、此电阻器被连接至 adcrefin。 目前我无法向 DSP 板添加缓冲器、因为卡已经制作好。 但我有疑问。 如果添加一个较低值的电阻器而不是4.7K 电阻器来解决现在的问题、结果是否会改变? 或 Adcrefin 直接接地。
    感谢你的帮助
    此致
    哈坎
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hakan、

    我想您肯定想用0欧姆分流器替代4.7K 电阻器。  您还需要在 VREF 输入和接地之间添加一个至少~1uF 的电容器。  

    如果是高阻抗驱动器、增加 ACQ_PS 有助于在 ADC 输入上缩短稳定时间、但如果 ADC 基准不好、则不会有所帮助。