4-20mA 0-5V工业标准信号回望笔录

采集板

前几日同学的同学拜托我帮他整一个水压传感器到串口输出数据做演示. 时间紧急, 刚好手头有Arduino板, 花了1个下午焊板子写程序, 总算完成了. 估且叫它工业标准信号采集板:
工业标准信号采集板
大致原理:
大致原理
一些数据:

  • 输入电压12~24V, 支持4~20mA两线传感器和0~5V三线传感器, USB口输出数据.
  • 电源方面: 12~24V输入 -> SS34二极管防反接 -> LM2596S模块(在背面)转9V -> Arduino Nano板子(正面)Vin引脚, 通过板载AMS1117-5.0芯片转出5V.
  • 4~20mA两线传感器: 电压取自输入电压, 信号端串200Ω电阻到地, 把电流信号转成对应的 0.8~4V的信号, 然后通过1500Hz截止频率的低通滤波器到Arduino Nano的A1引脚.
  • 0~5V三线传感器: 5V电源取自Arduino Nano板, 信号(参考淘宝, 电压0.5~4.5V)通过1500Hz截止频率的低通滤波器到Arduino Nano的A2引脚.

程序:

//4~20mA 2-Wires current type, 
//or 5V 3-Wires voltage type, 
//you should modify them according to the sensor parameters.
//Unit: kPa. 
long minWaterPressure = 0;
long maxWaterPressure = 100;
long limitWaterPressure = 80;

int currentSensorPin = 1;  
int voltageSensorPin = 2;
long waterPressure = 0;

int savedTime = 0;
int passedTime = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(100);
  savedTime = millis();
}

void loop() {
  // put your main code here, to run repeatedly:
  passedTime = millis() - savedTime;
  if(passedTime>10) {   //100Hz
    savedTime = millis();

    if(analogRead(currentSensorPin)>100) {
      //4~20mA 2-Wires current type
      for(int i = 0; i < 10; i++) {
        waterPressure += analogRead(currentSensorPin);
      } 
      waterPressure = waterPressure / 10;
      //4~20mA * 200Ω -> 0.8~4V -> 0.8/5*1023~4.0/5*1023 -> 163.68~818.4
      waterPressure = map(waterPressure, 163, 818, minWaterPressure, maxWaterPressure);
      Serial.println(waterPressure); 
      if(waterPressure>limitWaterPressure) {
        Serial.println("\n Warning!!! Pressure is too high!!! \n");
      }
      waterPressure = 0;
    } else if(analogRead(voltageSensorPin)>100){
      waterPressure = analogRead(voltageSensorPin);
      //0.5~4.5V -> 0.5/5*1023~4.5/5*1023 -> 102.3~920.7
      waterPressure = map(waterPressure, 102, 920, minWaterPressure, maxWaterPressure);
      Serial.println(waterPressure);
      if(waterPressure>limitWaterPressure) {
        Serial.println("\n Warning!!! Pressure is too high!!! \n");
      }
      waterPressure = 0;
    } else {

    }

  }

}

输出设计

这之后两天, 同事又找到我, 希望我做一个解析产品串口数据的板子, 输出工业标准信号. 这又是一番找资料, 虽然最后没有做, 还是记录下搜集到的心得:

产品的标准输出是串口, 工作电压5V, 峰值电流1A, 哪怕用200uF的大电容滤波, 电源也还是会有200~300mA的峰值纹波.

0~5V电压型

0~16m的数据, 对应工业标准的 0.5~4.5V 信号. cm及精度那么就是 0.0025V/cm 的分辨率, 电源纹波要求很高. STM32F030或者STM32L011系列, 参考正点原子STM32 PWM模拟DA例程, PWM输出后经过二阶滤波, 输出电压经AD采样与TL431标准电压比较做反馈, 差不多就可以了, 输出电压肯定不超过3.3V, 需要用一个放大器放大2倍. LM358之类的供电电压5V时输出只有3.xV, 不满足要求, 可以到 Mouser 选一下, OPA170之类的算是不错的选择.

4.5~5.5V输入, 5V输出的Buck-Boost芯片, 使用TI WEBENCH, TPS63050是可以的. 1.5uH电感NR3015T1R5M之类的.

不知道可不可以使用TL431给MCU供电, 可以把MCU的运行频率设置在8MHz, 或使用STM32L系列, 可以把VDD 和 VDDA分开供电, 只要VDDA≥VDD就可以.

暂未查有无专用芯片。

4~20mA电流型

宽电压范围, 可以使用TI专用芯片 XTR115.

参考文献

工业控制用4~20 m A 电流变送器
工业标准信号产生与测量仪表设计
4-20ma

猜你喜欢

转载自blog.csdn.net/weifengdq/article/details/75264568