TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
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->RO = 0; // 失能比较器 } ulADC1DAT = AdcRd(pADI_ADC1); // 读ADC结果寄存器; ulADC1DATRtd[ucSampleNo++] = ulADC1DAT; //存到数组里 if (ucSampleNo > SAMPLENO) //判断采样次数并设转换完标志 { ucSampleNo = 0; bSendResultToUART = 1; }}有关RTD电阻及温度值计算请参考RTD手册和例程。串口显示
|
|