查看: 1332|回复: 0

【ADI EVAL-ADuCM360QSPZ开发套件】使用教程(六)---ADC学习

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-4-13 09:02:47 | 显示全部楼层 |阅读模式
    分享到:
    ADuCM360集成了2个独立的多通道的24位高精度 Σ-Δ ADCs (ADC0 and ADC1)。

    ADuCM360器件还包括了:  1.    一个低噪、低漂移的内部带隙参考
                                                 2.      两个可缓冲输入的外部参考源
                                                 3.      两个可编程激励电流源、诊断电流源
                                                 4.     用来设置输入通道共模电压的基准电压源AVDD_REG/2的发生器
                                                 5.      一个用于在转换之间传感器掉电的内部接地开关。
                                                6.      CORTEX-M3控制器
    模拟输入可配置成全差分对或用作单端         对。
    每一个ADC都有独立的输入缓冲器和允许小幅信号直接连到ADC Σ-Δ   模块的低噪可编程增益放大器。PGA允许非常小的幅值信号被放大而仍然维持低噪性能,可通过8个不同的设置(1、2、4、8、16、32、64、128)编程,在单极性模           式,输入范围从0-1.2V(增益为1)或0-7.8125mv(增益为128)。在双极性模式,从0-±1.2    V(增益1)或0-±7.8125mv(增益为28)。             PGA仅在增益>1时使能,且使能后,输出不能超过1V。因此,当使用增益为4时,最大的输  入电压±250  mV。有效输入电压范围,详参数据        手册。使用ADC比较器确定ADC输入是否超过1v PGA输出阈值。如果超出,产生中断。
    评估板EVAL-ADuCM360MKZ载有一个PT100RTD(电阻温度探测器)测温电路 。

    从图上可以看出只接了外部参考源REFIN+,没有接REFIN-,因此测温 电路没有使用外部参考源。使用AIN6作为激励电源源输出,通过测量AIN1到地之间的电压,除以电阻R5来计算实际激励电流,测量AIN0和 AIN1的差分电压,除以激励电流就能得到当前温度下的RTD阻值,通过RTD计算得出当前温度。      
    首先初始化ADC1且使能中断,使用Elves.exe生成函数代码或使用库。
    void ADC1INIT(void){   AdcMski(pADI_ADC1,ADCMSKI_RDY,1);                                 // 使能ADC1就绪中断         AdcFlt(pADI_ADC1,124,14,FLT_NORMAL|ADCFLT_NOTCH2|ADCFLT_CHOP);    // 设置滤波   AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G32,ADCCON_ADCCODE_INT);  // ADC输入范围,内部参考, 增益 32, 带符号整型输出   // 关闭输入缓冲和外部参考   AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPN|ADCCON_BUFBYPP|ADCCON_BUFPOWP|ADCCON_BUFPOWN);    AdcPin(pADI_ADC1,ADCCON_ADCCN_AIN1,ADCCON_ADCCP_AIN0);            // 选择AIN0为正输入,AIN1为负输入}        RTD传感器由内部的激励电流源提供10u到1mA的电流。void IEXCINIT(void){   IexcDat(IEXCDAT_IDAT_200uA,IDAT0En);         // 设置输出 200uA   IexcCfg(IEXCCON_PD_off,IEXCCON_REFSEL_Int,IEXCCON_IPSEL1_Off,IEXCCON_IPSEL0_AIN6); //设置输出端 AIN6}ADC的三种工作模式:1.转换模式包括固定速度的连续转换和通过软件触发的单次转换。连续转换采样率由寄存器ADCxFLT设置。
                                         2.校准模式 在进入校准模式之前,ADC首先必须在空闲模式下被校准。此外仅能在空闲模式下写ADCxOF和ADCxGN。                                         3.掉电模式  用来减少功耗,特别是在单次转换之间。
    测试步骤分为:
    1:通过测试AIN1到AGND的电压除以参考电阻R5得到激励电流的实际值,测试之前需要在ADC空闲模式设置参考电压、增益、和通道、转换模式
    AdcGo(pADI_ADC1,ADCMDE_ADCMD_IDLE);                 // 空闲模式  AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G1,ADCCON_ADCCODE_INT); // 增益=1, 内部参考   AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPN|ADCCON_BUFBYPP);       // 不使用缓冲  AdcPin(pADI_ADC1,ADCCON_ADCCN_AGND,ADCCON_ADCCP_AIN1);      // 选择通道AIN1和AGND       AdcGo(pADI_ADC1,ADCMDE_ADCMD_CONT);    // 开始连续装换   while ( bSendResultToUART == 0)       //  等待转换完成软件标志     {} AdcGo(pADI_ADC1,ADCMDE_ADCMD_IDLE);     //设置成空闲模式 for (ucCounter = 0; ucCounter < SAMPLENO; ucCounter++)     //SAMPLENO 连续采样值数      {         fVAIN1_AGND += (((float)ulADC1DATRtd[ucCounter]*1.2)  / 268435456);  // 电压计算 (VREF)/268435456) × ADCxDAT      }   fVAIN1_AGND = fVAIN1_AGND/SAMPLENO;     //平均值 fIexc0 = fVAIN1_AGND/5600;             // 计算激励电流2:测试AIN0和AIN1之间的差分电压 AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADC_BUF_ON);        // 差分模式下打开缓冲  AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G32,ADCCON_ADCCODE_INT); // 增益=32 ,内部参考 AdcPin(pADI_ADC1,ADCCON_ADCCN_AIN1,ADCCON_ADCCP_AIN0);         // 选择 AIN0/AIN1 差分对 AdcGo(pADI_ADC1,ADCMDE_ADCMD_CONT);                        // 开始连续转换       while (bSendResultToUART == 0)                        // 等待软件转换完标志      {} for (ucCounter = 0; ucCounter < SAMPLENO; ucCounter++)      {         fVRTD += (((float)ulADC1DATRtd[ucCounter]*1.2)  / 268435456);      } bSendResultToUART = 0; fVRTD = fVRTD/SAMPLENO;                   // 计算平RTD两端的平均电压值 AdcGo(pADI_ADC1,ADCMDE_ADCMD_IDLE);      //设置ADC到空闲模式3:计算激励电流值和RTD温度 fRrtd = fVRTD/fIexc0;                     // RTD 阻值 fTRTD = CalculateRTDTemp(fRrtd);          // RTD 温度 bSendResultToUART = 0; sprintf ( (char*)szTemp, "RTD Temperature: %fC \r\n\n\n",fTRTD );  SendString ();                      //发送到串口助手ADC中断代码里设置阈值检测及读出转换数据
    void ADC1_Int_Handler (){   volatile unsigned int uiADCSTA = 0;   volatile long ulADC1DAT = 0;   uiADCSTA = pADI_ADC1->STA;          //读ADC状态寄存器   if ((uiADCSTA & 0x4) == 0x4)        // 检查 ADC1TH 超过错误条件       {          pADI_ADC1->MSKI &= 0xFB;         // 失能阈值检测清除中断      pADI_ADC1-&gtRO = 0;              // 失能比较器   }   ulADC1DAT = AdcRd(pADI_ADC1);       // 读ADC结果寄存器;   ulADC1DATRtd[ucSampleNo++] = ulADC1DAT;  //存到数组里   if (ucSampleNo > SAMPLENO)               //判断采样次数并设转换完标志   {      ucSampleNo = 0;        bSendResultToUART = 1;                }}有关RTD电阻及温度值计算请参考RTD手册和例程。串口显示
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 23:25 , Processed in 0.127847 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.