Inhoudsopgave:

4-20ma generator/tester met Arduino - Ajarnpa
4-20ma generator/tester met Arduino - Ajarnpa

Video: 4-20ma generator/tester met Arduino - Ajarnpa

Video: 4-20ma generator/tester met Arduino - Ajarnpa
Video: 4-20mA sensor explained with a simple Arduino example! 2024, Juni-
Anonim
4-20ma generator/tester met behulp van Arduino
4-20ma generator/tester met behulp van Arduino

Generatoren van 4-20 mA zijn verkrijgbaar op ebay, maar ik ben dol op het doe-het-zelf-gedeelte van dingen en het gebruik van onderdelen die ik heb liggen.

Ik wilde de analoge ingangen van onze PLC testen om onze scada-uitlezingen te verifiëren en om de output van 4-20mA-instrumenten te testen. Er zijn heel veel stroom-naar-spanning-omzetters en spanning-naar-stroom-omzetters voor arduino op ebay, ze moeten echter worden gekalibreerd. Ik kan dit gebruiken om elk van die converters te kalibreren die op eBay en dergelijke te vinden zijn.

Ik besloot dat ik een generator en tester zou maken. Op dit moment is het nog een work in progress en een prototype.

Ik had een oud 2.1-geluidssysteem dat niet werd gebruikt (kleine luidsprekers). Dus ik gebruikte een van de luidsprekerboxen als behuizing. Ik had ook een versterker die het begaf door blikseminslag, ik heb de luidsprekeraansluiting van die versterker verwijderd om het aansluiten een fluitje van een cent te maken. Ik ben van plan om in de toekomst een PCB te maken en een betere behuizing.

Benodigdheden:

Onderdelen lijst.

LCD // 20x4 (pas de code aan als de jouwe kleiner is)

LM7808 // 8volt regelaar

LED // Elk type of formaat

Weerstand voor LED // Passend bij het LED type en 8volt

100 ohm weerstand + 47 ohm weerstand in serie // Wordt gebruikt als shuntweerstand

10K weerstand // Arduino analoog in bescherming tegen hoogspanning

22K weerstand // Om te voorkomen dat A0 gaat zweven

Trimpot 100 ohm + 47 ohm weerstand in serie // PT100 simulator

35 volt condensator // Ik gebruikte 470uF, alleen om fluctuaties in de voedingsspanning laag te houden

RTD (PT100-transducer) // Span doet er niet toe (bereik)

DIODE (voor polariteitsbeveiliging)

INA219

Arduino

Stap 1:

Afbeelding
Afbeelding

Door het schema te volgen, kunt u beginnen waar u de onderdelen moet toevoegen en bedraden.

De LM7808 staat maximaal 25 volt toe wat prima is voor PLC-systemen, ze gebruiken over het algemeen 24 volt voedingen. Voeg een koellichaam toe aan de regelaar en gebruik deze niet voor langere tijd. Als je 16 volt laat vallen, genereert de regelaar veel warmte.

De ingangsvoeding voedt de regelaar en maakt verbinding met de INA219 VIN, in deze configuratie kan de INA219 ook de juiste voedingsspanning meten minus de spanningsval van de diode. U moet de spanningsval van uw diode meten en aan de code toevoegen, zodat u de juiste voedingsspanningsaflezing krijgt.

Van de INA219 VOUT tot de RTD+ zet de RTD aan. RTD-naar aarde voltooit het circuit.

Om een analoge PLC-kaart te testen, sluit u RTD- aan op de ingang op de analoge kaart en de aarde van de kaart op Arduino-aarde. (Zorg ervoor dat u elk instrument dat op het te testen kanaal is aangesloten loskoppelt).

R5 en LED1, wat aangeeft dat het systeem is ingeschakeld.

De regelaar voedt zich met de arduino VIN (arduino heeft een ingebouwde regelaar tot 5 volt).

Arduino 5V-pin gaat naar INA219 om de ingebouwde chip van stroom te voorzien. INA219 GND naar arduino-aarde.

Trimpot-afstrijker naar RTD PIN1 en Trimpot-pin 3 naar RTD-pin 2 simuleren een PT100-verbinding. (Verwissel de draden als het draaien van de trimpotmeter met de klok mee de mA niet verhoogt).

Stap 2: Instrumentuitgangstest

Om de output van het instrument te testen zijn extra onderdelen nodig, zoals een shuntweerstand. Normale weerstanden van 0,25 W zullen het werk prima doen. U kunt de shuntweerstand laten staan en een tweede INA219 toevoegen om de instrumentuitgang te testen. Ik had er nog maar één over, dus ik gebruikte in plaats daarvan een weerstand.

Testen met een shunt kan alleen aan de negatieve kant van het apparaat. Als je de positieve kant gebruikt, voorzie je je Arduino van meer dan 4 keer de toegestane spanning en laat je de rook ontsnappen.

Voeg de shuntweerstand toe in serie met de negatieve draad van het instrument. De kant van de shunt die zich het dichtst bij het apparaat bevindt, wordt de positieve analoog voor Arduino. De andere kant van de shunt die zich het dichtst bij de voeding bevindt, wordt de arduino-aarde die het analoge ingangscircuit voltooit.

Een shuntweerstand van 150 ohm is het absolute maximum dat moet worden gebruikt bij het gebruik van een arduino. De weerstand heeft een spanningsval die lineair is met de mA die er doorheen stroomt. Hoe groter de mA, hoe groter de spanning.

Bij 20mA stroom # 150ohm*0.02A = 3volt naar arduino.

Bij 4mA stroom # 150ohm*0.004A = 0.6volt naar arduino.

Nu wil je misschien dat de spanning dichter bij 5 volt ligt, zodat je het volledige ADC-bereik van de Arduino kunt gebruiken. (Geen goed idee).

RTD's kunnen een output van 30,2 mA bereiken (de mijne wel). 150ohm*0.03A = 4.8volt. Dat is zo dichtbij als ik zou willen zijn.

Een andere website gaf aan een 250ohm weerstand te gebruiken.

Bij 20mA stroom # 250ohm*0.02A = 5volt naar arduino.

Bij 30mA stroom # 250ohm*0.03A = 7.5volt naar arduino.

Je loopt het risico je ADC en Arduino te verbranden.

Om een instrument in het veld te testen, neem je een 12 volt batterij mee en sluit je deze aan op de voedingsingang. Het gebruik van een externe voedingsbron heeft geen invloed op de huidige PLC-setup.

Om een analoge ingangskaart in het veld te testen, neem je een 12volt batterij mee. Koppel het instrument + los van het circuit. Sluit aarde aan op instrumentaarde en de RTD- op de losgekoppelde instrumentdraad.

Stap 3: Kalibratie

Kalibratie
Kalibratie

Om de aflezing van uw shuntweerstand te kalibreren, sluit u RTD- aan op de shunt Analog in. Stel uw trimpot zo in dat de gegenereerde mA 4 mA is. Als de mA van uw apparaat niet gelijk is, wijzigt u de eerste waarde in de code op regel 84. Als u deze waarde verhoogt, wordt de mA-uitlezing lager.

Stel vervolgens uw trimpot in om 20mA te genereren. Als de mA van uw apparaat niet gelijk is, wijzigt u de tweede waarde in de code op regel 84.

Dus je 4-20mA wordt nu 0,6-3volt (theoretisch). Meer dan voldoende bereik. Als u de bibliotheek van eRCaGuy gebruikt, geeft oversampling u een betere en stabielere uitlezing.

Hopelijk leest u dit. Dit is mijn eerste instructable, dus doe het rustig aan als ik ergens een fout heb gemaakt of iets heb weggelaten.

Dit project is waarschijnlijk niet de beste manier om het aan te pakken, maar het werkt voor mij en het was leuk om te doen.

Enkele ideeën heb ik extra…

Voeg een servo toe om de trimpot in de doos te draaien.

Voeg drukknoppen toe om de servo naar links of rechts te draaien.

Voeg een digitale temperatuursensor toe aan het koellichaam van de regelaar om te waarschuwen voor gevaarlijke hitte.

Stap 4: Arduino programmeren

#erbij betrekken

// #include // Uncomment als je een LCD met een shift register gebruikt.

#erbij betrekken

#erbij betrekken

#erbij betrekken

#erbij betrekken

//A4 = (SDA)

//A5 = (SCL)

Adafruit_INA219 ina219;

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

// LiquidCrystal_SR lcd (3, 4, 2); // Uncomment als u een LCD met een schuifregister gebruikt.

// | | |_ Vergrendelpen

// | \_ Klok Pin

// \_ Gegevens/Pin inschakelen

byte bitsOfResolution = 12; //opdracht overbemonsterde resolutie

unsigned long numSamplesToAvg = 20; //aantal monsters BIJ DE OVERSAMPLED RESOLUTIE die u wilt nemen en het gemiddelde nemen

ADC_prescaler_t ADCSpeed = ADC_DEFAULT;

unsigned lange vorigeMillis = 0;

vlotter-shuntspanning = 0,0; //Van INA219

vlotterbusspanning = 0,0; //Van INA219

vlotter stroom_mA = 0,0; //Van INA219

vlotterbelastingsspanning = 0,0; //Van INA219

float arduinovoltage = 0.0; // Spanningsberekening van A0-pin

Niet-ondertekende lange A0analogReading = 0;

byte analoogIn = A0;

float ma_mapped = 0.0; // Kaartspanning van A0 tot 4-20mA

ongeldige setup() {

adc.setADCSpeed(ADCSpeed);

adc.setBitsOfResolution(bitsOfResolution);

adc.setNumSamplesToAvg(numSamplesToAvg);

uint32_t stroomfrequentie;

ina219.begin();

ina219.setCalibration_32V_30mA(); // Gewijzigde bibliotheek voor meer precisie op mA

lcd.begin(20, 4); // initialiseer het LCD-scherm

lcd.wissen();

lcd.home (); // ga naar huis

lcd.print("********************");

vertraging (2000);

lcd.wissen();

}

lege lus()

{

unsigned long currentMillis = millis();

const lang interval = 100;

//&&&&&&&&&&&&&&&&&

Lees I2C-apparaten met tussenpozen en doe wat berekeningen

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

if (currentMillis - previousMillis >= interval) {

vorigeMillis = huidigeMillis;

Interval();

}

Print_Naar_LCD(); // Ik hoef het LCD-scherm waarschijnlijk niet zo snel bij te werken en kan worden verplaatst naar onder Interval()

}

leegte

Interval() {

shuntspanning = ina219.getShuntVoltage_mV();

busspanning = ina219.getBusVoltage_V();

huidige_mA = ina219.getCurrent_mA();

belastingsspanning = (busspanning + (shuntspanning / 1000)) + 0,71; // +0,71 is mijn diodespanningsval

A0analogReading = adc.newAnalogRead(analogIn);

arduinovoltage = (5,0 * A0analoge uitlezing); // Berekend naar mV

ma_mapped = map (arduinovoltage, 752, 8459, 30, 220) / 10.0; // Kaart kan geen drijvers gebruiken. Voeg een 0 toe achter de toegewezen waarde en deel deze door 10 om de float-uitlezing te krijgen.

// In kaart brengen van spanningsberekening geeft een stabielere uitlezing dan het gebruik van de onbewerkte adc-uitlezing.

if (shuntvoltage >= -0.10 && shuntvoltage <= -0.01) // Zonder belasting heeft de INA219 de neiging om onder -0.01 te lezen, de mijne wel.

{

stroom_mA = 0;

busspanning = 0;

belastingsspanning = 0;

shuntspanning = 0;

}

}

leegte

Print_To_LCD() {

lcd.setCursor(0, 0);

if (ma_mapped < 1.25) { // Zonder stroom is dit mijn mA-waarde, dus ik gooi het gewoon weg.

lcd.print ("* 4-20mA-generator *");

}

anders {

lcd.print("** Analoge tester **");

}

lcd.setCursor(0, 1);

lcd.print("Apparaat:");

lcd.setCursor(10, 1);

if (ma_mapped < 1.25) {

lcd.print("geen apparaat");

}

anders {

lcd.print(ma_mapped);

}

lcd.print("mA");

lcd.setCursor(0, 2);

lcd.print("Genereren:");

lcd.setCursor(10, 2);

lcd.print(current_mA);

lcd.print("mA");

lcd.setCursor(0, 3);

lcd.print("Aanbod:");

lcd.setCursor(10, 3);

lcd.print(laadspanning);

lcd.print("V ");

}

Stap 5: Nog wat foto's

Nog wat foto's
Nog wat foto's

Versterker luidsprekeraansluiting. LED aangedreven door de stroomgenerator (RTD). Analoge kaartbedrading zal de LED vervangen.

Terminal uiterst links is voor voedingsingang. Aansluitingen aan de rechterkant zijn voor instrumentinvoer.

Stap 6: Inpassen

Erbij horen
Erbij horen

Alles lijkt te passen. Ik gebruikte siliconen om tijdelijk wat spullen bij elkaar te houden. De trimpot is rechtsboven gesiliconeerd. Er werd een klein gaatje voorgeboord. Ik kan de stroom vanaf de bovenkant van de doos aanpassen.

Stap 7: Alleen foto's

Alleen foto's
Alleen foto's
Alleen foto's
Alleen foto's
Alleen foto's
Alleen foto's
Alleen foto's
Alleen foto's

Stap 8: Laatste woorden

Ik heb de output van dit apparaat getest met een Allan Bradley PLC. De resultaten waren erg goed. Ik heb het volledige bereik. Ik heb dit apparaat ook getest met een 4-20mA-druksensor met een ingebouwd LCD-scherm. De resultaten waren weer erg goed. Mijn metingen waren een paar decimalen afwijkend.

Ik schrijf mijn Arduino-code in tabbladen. In PLC's worden ze subroutines genoemd. Maakt het debuggen gemakkelijker voor mijn.

Bijgevoegd zijn tekstbestanden van die tabbladen.

Aanbevolen: