Arduino UNO驱动ADS1220模数转换模块


简介

ADS1220 是一款精密的 24 位模数转换器 (ADC),它提供许多集成功能,可降低测量小传感器信号的应用中的系统成本和元件数量。该器件具有两个差分输入或四个单端输入(通过灵活的输入多路复用器 (MUX)、低噪声可编程增益放大器 (PGA)、两个可编程激励电流源、电压基准、振荡器、低侧开关和精密温度传感器。该器件可以以高达 2000 样本/秒 (SPS) 的数据速率进行转换,并具有单周期稳定功能。在 20 SPS 时,数字滤波器可为嘈杂的工业应用提供同时 50 Hz 和 60 Hz 抑制。内部 PGA 提供高达 128 V/V 的增益。使用 PGA 时,该器件支持伪差分或全差分信号的测量。或者,该器件可以配置为绕过内部 PGA,同时仍提供高输入阻抗和高达 4 VV 的增益,从而实现单端测量。在 PGA 禁用的情况下以占空比模式运行时,功耗低至 120 uA。额定温度范围为 -40C 至 +125C。

ADS1220特性参数

  • 模拟电源:AVDD / AVSS (AGND) 时为 2.3 至 5.5 伏。
  • 数字电源:DVDD / DGND 时为 2.3 至 5.5 伏。
  • 双极电源选项:例如 AVSS 到 DGND = -2.5 伏,AVDD 到 DGND = +2.5 伏。
  • 功耗:占空比模式下为 120 微安。
  • 通信:通过 SPI。
  • 参考电压:
      内部:2.048 伏。
      外部:VREFPx– VREFNx= 最小 0.75 伏,最大 AVDD。
  • 增益:1 – 128(带 PGA = 可编程增益放大器),1 – 4(不带 PGA)。
  • 数据速率:5 – 2000 SPS(每秒采样数)
  • 转换模式:连续和“单发”模式。
  • 电压输入:4 个单端(相对于 AVSS)或 2 个差分输入。
  • 在多路复用模式下进行测量。
  • 两个可编程 IDAC(电流数模转换器):10 μA 至 1.5 毫安(在数据表中也称为“激励电流源”)。
  • 数字滤波器:50 和/或 60 Hz。
  • 集成温度传感器。

ADS1220模数转换模块原理图


DRDY数据就绪引脚,当数据可用时为低电平
MISO串行数据输出
MOSI串行数据输入
SCLK串行时钟输入
CS片选
CLK外部时钟(可选)
DVDD数字电压正
DGND数字电压负
AIN0/REFP1模拟输入通道 0,也可以用作附加外部参考电压的输入正
AIN1模拟输入通道 1
AIN2模拟输入通道 2
AIN3/REFN1模拟输入通道 3,也可以用作附加外部参考电压的输入负
REFN0外部参考电压负
REFP0外部参考电压正
AVDD模拟电压电源正
AVSS模拟电压电源负

Arduino UNO与ADS1220接线

Arduino UNOADS1220
5VDVDD,AVDD
GNDDGND,AVSS
D6DRDY
D7CS
D11MOSI
D12MISO
D13SCLK

简单测试接线

K型热电偶测试接线

简单测试

  在此示例中,使用 2.048 伏的内部电压基准。这意味着您只能测量 -2.048 至 +2.048 伏范围内的电压。PGA 的输出电压必须大于 AVSS 加 200 毫伏,并且低于 AVDD 减去 200 毫伏。超出这些限制时,ADS1220 将不再线性运行。由于默认增益为 1,因此这些限制也适用于第一个示例中的输入电压。为了安全起见,使用了.bypassPGA(true)函数。
测得的电压根据原始值计算如下:

相关参数和函数介绍:

  • ADS1220_MUX_REFPX_REFNX_4:该参数导致测量参考电压 REFP0/REFN0 或 REFP1/REFN1。无论您的设置如何,都会绕过 PGA,增益为 1,并使用内部参考。为了确保这也适用于大于 2.048 伏的参考电压,在测量前将电压降低到四分之一。
  • ADS1220_MUX_AVDD_M_AVSS_4:使用该参数时,您可以测量电源电压的四分之一。
  • ADS1220_MUX_AVDD_P_AVSS_2:决定了使用双极电压电源时的偏移量。
  • setGain():设置增益系数(1、2、4、8、16、32、64 或 128)。
  • bypassPGA(true/false):绕过 PGA 或再次打开它。
  • isPGABypassed():如果绕过 PGA,则返回 true,否则返回 false。
  • setCompareChannels():定义用于测量的输入。
  • getVoltage_mV()和getVoltage_muV():函数 / 以毫伏和微伏为单位提供结果。
  • getRawData():查询 A/D 转换的原始值。
  • getVRef_V():获得以伏特为单位的参考电压。这不是测量的结果,但函数会返回您设置的内容。默认设置为 2.048 伏。
  • getTemperature():提供以摄氏度为单位的温度。

注意:

  • 如果设置增益系数 >= 8,则不会绕过 PGA,这与您使用所做的设置无关。
  • 如果执行单端测量 (AINx = AVSS),则必须旁路 PGA,并且只能获得 1、2 和 4 的增益。
  • 在测量外部参考电压或电源电压时,PGA 也会被强制旁路。增益系数降低到 1。

AIN0-AIN1:1.2V差分测试,AIN2,AIN3:1.49V单端测:

/***************************************************************************
* Example sketch for the ADS1220_WE library
*
* This sketch shows how to change channels and get data. The sketch uses the 
* the default settings, e.g. the internal voltage reference. This limits the 
* maximum voltage that can be measured to 2.048 volts.
* 
* On my website you find:
*   1) An article about the ADS1220 and the use of this library
*      https://wolles-elektronikkiste.de/ads1220-4-kanal-24-bit-a-d-wandler  (German) 
*      https://wolles-elektronikkiste.de/en/4-channel-24-bit-adc-ads1220     (English)
* 
*   2) An article how to use the ADS1220 for typical applications, such as thermocouples, 
*      NTCs, RTDs or Wheatstone bridges:
*      https://wolles-elektronikkiste.de/ads1220-teil-2-anwendungen          (German)
*      https://wolles-elektronikkiste.de/en/ads1220-part-2-applications      (English)
* 
***************************************************************************/

#include <ADS1220_WE.h>
#include <SPI.h>

#define ADS1220_CS_PIN    7 // chip select pin
#define ADS1220_DRDY_PIN  6 // data ready pin 

/* Create your ADS1220 object */
ADS1220_WE ads = ADS1220_WE(ADS1220_CS_PIN, ADS1220_DRDY_PIN);
/* Alternatively you can also pass the SPI object as reference */
// ADS1220_WE ads = ADS1220_WE(&SPI, ADS1220_CS_PIN, ADS1220_DRDY_PIN);

void setup(){
  Serial.begin(9600);
  if(!ads.init()){
    Serial.println("ADS1220 is not connected!");
    while(1);
  }
/* The voltages to be measured need to be between negative VREF + 0.2 V and positive
 * VREF -0.2 V if PGA is enabled. For this basic example I disable PGA, to be on the 
 * safe side. */ 
 ads.bypassPGA(true);
}

/* 
 *  You set the channels to be measured with setCompareChannels(); You
 * can choose the following parameters:
 * Parameter                  Pos. Input     Neg. Input         Comment
 * ADS1220_MUX_0_1              AIN0           AIN1
 * ADS1220_MUX_0_2              AIN0           AIN2
 * ADS1220_MUX_0_3              AIN0           AIN3
 * ADS1220_MUX_1_2              AIN1           AIN2
 * ADS1220_MUX_1_3              AIN1           AIN3
 * ADS1220_MUX_2_3              AIN2           AIN2
 * ADS1220_MUX_1_0              AIN1           AIN0
 * ADS1220_MUX_3_2              AIN3           AIN2
 * ADS1220_MUX_0_AVSS           AIN0           AVSS           single-ended
 * ADS1220_MUX_1_AVSS           AIN1           AVSS           single-ended  
 * ADS1220_MUX_2_AVSS           AIN2           AVSS           single-ended
 * ADS1220_MUX_3_AVSS           AIN3           AVSS           single-ended
 * ADS1220_MUX_REFPX_REFNX_4   REFP0/REFP1   REFN0/REFN1     (REFPX-REFNX)/4; PGA bypassed
 * ADS1220_MUX_AVDD_M_AVSS_4    AVDD           AVSS           (AVDD-AVSS)/4; PGA bypassed
 * ADS1220_MUX_AVDD_P_AVSS_2    AVDD           AVSS           (AVDD+AVSS)/2
 * 
 * The last three modes use the internal reference (2.048 V) and gain = 1, independent of 
 * your settings.
 */


void loop(){
  float result = 0.0;
  long longResult = 0;
    
  ads.setCompareChannels(ADS1220_MUX_0_1);
  result = ads.getVoltage_mV();
  longResult = ads.getRawData();
  Serial.print("AIN0 vs. AIN1  [mV]: ");
  Serial.println(result);
  Serial.print("AIN0 vs. AIN1 (raw): ");  // raw data
  Serial.println(longResult);
  
  // ads.setCompareChannels(ADS1220_MUX_0_AVSS);
  // result = ads.getVoltage_mV();
  // Serial.print("AIN0 vs. AVSS  [mV]: ");
  // Serial.println(result);

  // ads.setCompareChannels(ADS1220_MUX_1_AVSS);
  // result = ads.getVoltage_mV();
  // Serial.print("AIN1 vs. AVSS  [mV]: ");
  // Serial.println(result);
  
  ads.setCompareChannels(ADS1220_MUX_2_AVSS);
  result = ads.getVoltage_muV();    // request result in microvolts
  Serial.print("AIN2 vs. AVSS  [µV]: ");
  Serial.println(result);
  
  ads.setCompareChannels(ADS1220_MUX_3_AVSS);
  result = ads.getVoltage_mV();
  Serial.print("AIN3 vs. AVSS  [mV]: ");
  Serial.println(result);
  
  ads.setCompareChannels(ADS1220_MUX_AVDD_M_AVSS_4); // voltage supply / 4
  result = ads.getVoltage_mV() * 4.0;
  Serial.print("Supply Voltage [mV]: ");
  Serial.println(result);

  result = ads.getVRef_V();                 // get the reference voltage
  Serial.print("Reference       [V]: ");
  Serial.println(result,3); 
  
  Serial.print("Temperature    [°C]: ");    // get the temperature
  result = ads.getTemperature();
  Serial.println(result);
  
  Serial.println();
 
  delay(2000);
}

K型热电偶测试

  将热电偶 K 的热电电压/温度值复制到 Excel 中,并从中计算出类似线性回归线。根据测得的电压,草图计算出温度。
温水测试:

#include <ADS1220_WE.h>
#include <SPI.h>

#define ADS1220_CS_PIN    7 // chip select pin
#define ADS1220_DRDY_PIN  6 // data ready pin 

ADS1220_WE ads = ADS1220_WE(ADS1220_CS_PIN, ADS1220_DRDY_PIN);

void setup(){
  Serial.begin(9600);
  if(!ads.init()){
    Serial.println("ADS1220 is not connected!");
    while(1);
  }
  ads.setCompareChannels(ADS1220_MUX_0_1);
  ads.setGain(ADS1220_GAIN_128);
}

void loop(){
  float ambTemp = 0.0;
  float deltaTemp = 0.0; // thermocouple temperature minus ambient temperature
  float tCTemp = 0.0; // thermocouple temperature
  float tCV = 0.0; // thermocouple voltage
  
  ads.enableTemperatureSensor(true);
  ambTemp = ads.getTemperature();
  ads.enableTemperatureSensor(false); 
  Serial.print("Ambient Temperature [°C]:          ");
  Serial.println(ambTemp);

  tCV = ads.getVoltage_muV(); // get result in millivolts
  deltaTemp = 0.0244821*tCV + 0.106873;
  Serial.print("Thermocouple T vs. ambient T [°C]: ");
  Serial.println(deltaTemp);
  
  tCTemp = ambTemp + deltaTemp;
  Serial.print("Thermocouple Temperature [°C]:     ");
  Serial.println(tCTemp);
  Serial.println();

  delay(2000);
}

总结

  ADS1220 是一款高性能 ADC,具有高分辨率、高增益、高数据速率、低噪声和低功耗等特点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值