天天看點

4-20mA 0-5V工業标準信号回望筆錄

采集闆

前幾日同學的同學拜托我幫他整一個水壓傳感器到序列槽輸出資料做示範. 時間緊急, 剛好手頭有Arduino闆, 花了1個下午焊闆子寫程式, 總算完成了. 估且叫它工業标準信号采集闆:

4-20mA 0-5V工業标準信号回望筆錄

大緻原理:

4-20mA 0-5V工業标準信号回望筆錄

一些資料:

  • 輸入電壓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 = ;
long maxWaterPressure = ;
long limitWaterPressure = ;

int currentSensorPin = ;  
int voltageSensorPin = ;
long waterPressure = ;

int savedTime = ;
int passedTime = ;

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

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

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

繼續閱讀