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.

[参考译文] CCS/TMS320F2.8335万:TMS320F2.8335万的ADC未输出正确的结果。

Guru**** 2587365 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657377/ccs-tms320f28335-the-adc-of-tms320f28335-is-not-outputting-the-correct-result

部件号:TMS320F2.8335万
主题:controlSUITE中讨论的其他部件

工具/软件:Code Composer Studio

大家好,

我正在编程F2.8335万以感应和显示电压。 为此,我正在配置ADC,但得到的结果不准确。 输入电压通过分压器网络以限制0-3 V内的电压。然后将其作为输入提供给ADC。 因此,实际输入信号为0.9097 *数字值。 (基于分压器网络和Asig=D*(3/4095)。

我正在按如下所示配置ADC:(SoC由ePWM生成,然后ADC的完成将导致ADC中断。

   // ADC的时钟频率设置为12.5 MHz,以防止转换结果中出现非线性
   // ADC控制寄存器3.
   AdcRegs.ADCTRL3.bit.ADCCLKPS = 1;//ADCCLK=HSPCLK/       (2*ADCCLKPS)=25/(2*1)= 12.5 MHz

   //ADC控制寄存器1
   AdcRegs.ADCTRL1.bit.cps = 0x0;          //ADCCLK=Fclk/1

   //ADC控制寄存器1
   AdcRegs.ADCTRL1.bit.con_run =0;      //序列发生器在启动停止模式下启动,等待SOC开始转换
   AdcRegs.ADCTRL1.bit.SEQ_CASC=1;       /*0x0双序列发生器模式,0x1级联模式*/
   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;      //禁用序列覆盖。 转换结束后环绕
   AdcRegs.ADCTRL1.bit.ACQ_PS =0;         //采集窗口大小=(1+ACQ_PS)*(1/ADC)
   AdcRegs.ADCTRL1.bit.SUSMOD = 0;        //忽略仿真模式

   // ADC控制寄存器2.
   AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;      //SEQ1由SOCA从ePWM模块启动
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;      //为EOS启用SEQ1的中断请求
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;        //将SEQ1重置为初始预热状态
   AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1=1;      //从SEQ1的EPWMA触发器启用SOC
   
   // ADC控制寄存器3.
   AdcRegs.ADCTRL3.bit.SMODE_SEL =1;       // 1:同步,0:顺序采样


   //最大转换信道寄存器
   AdcRegs.ADCMAXCONV.ALL =1;                            //2转换

   //ADC输入通道选择定序控制寄存器
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 =0;       //从ADCINA0和ADCINB0设置conv
 
   //ADC偏移微调寄存器
    AdcRegs.ADCOFFTRIM.bit.offset_trim = 0;    //设置偏移误差校正值
    AdcRegs.ADCREFsel.bit.REF_SEL =0;

  // ADC状态和标志寄存器
    AdcRegs.ADCST.Bit.INT_SEQ1_CLR = 1;    //清除中断标志位INT_SEQ1
    AdcRegs.ADCST.Bit.INT_SEQ2_CLR = 1;    //清除中断标志位INT_SEQ2

在ADC中断中,我正在转换测量的信号,如下所示:首先读取结果寄存器

__interrupt void ADC_ISR(void)

 Vin1 =(AdcRegs.ADCRESULT0>>4);//Vin1   是UINT16类型
 VIN=VIN* 0.9.0975万82121</xmt-block>8.2121万 ((浮点)(Vacin1));        //VIN为浮点型

现在,当我给出直流电压并在CCS中看到转换值时,我无法得到实际值

实际输入                      VIN读数                         RESULT0

0V                                      44V                                       7700 (应用程序)

5V                                       47 V                     8350 (应用程序)

10v                   50 V                           8850

15V                                  53V                                          9300

我不知道为什么我在CCS上看到的实际输入和输出有如此大的差异。

当我有交流输入时,我看到的输出也会向上偏移并缩放。

您能否建议这里可能会出现什么问题?

非常感谢您的支持。

此致

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

    萨米尔

    很难说出可能的错误,但您可以尝试运行ADC_CAL(),并确保您的程序不会覆盖ADCREFSEL和ADCOFFTRIM中的校准值。

    ADC参考指南

    汤米

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

    感谢您的及时回复。 我现在可以获得更接近所应用的投入的价值。 但是,0输入的偏移仍为1.5v。 不是很大。 如果我降低采样频率,则偏移会减少。 但是我无法关联这些数据。采样频率和直流偏移之间的关系是什么? 同时,我自己校准ADC,提供一些输入,并基于数字输出,以便在MATLAB中使用CFTOOL来找出缩放和偏移(Y=MX+C)。
    此外,ADC提供12位输出,结果寄存器偏移4位使其变为16位。 无论如何,结果寄存器是16位。为什么结果寄存器必须右移?

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

    您好,Samir

    从您的代码中,不清楚问题可能出在哪里。 尝试以下步骤以找出可能的问题:

    1.我们在controlSUITE中为该设备提供了ADCSOC示例代码。 尝试该代码以查看您获得的结果类型。

    2.得到一些结果后,分享ADCIN引脚上的电压和ADC结果寄存器值

    3.要解决数据转换问题,请查看ADCMIRROR寄存器中的转换值

    另外,您使用的是哪种主板?

    谢谢

    Nabil