Search Code

Hoe om 'n Allegro ACS758-stroomsensor met Arduino vir 50A tot 200A te gebruik

Hoe om 'n Allegro ACS758-stroomsensor met Arduino vir 50A tot 200A te gebruik


Huidige meting in hoëkapasiteit-toepassings kan uitdagend wees, maar die Allegro ACS758-stroomsensor vereenvoudig hierdie taak. Hierdie sensor kan stroomvlakke van 50A tot 200A hanteer en bied 'n betroubare oplossing vir verskeie projekte. In hierdie tutoriaal sal ons ondersoek hoe om die ACS758 aan 'n Arduino te koppel en stroomwaardes akkuraat te lees.
Die uitkoms van hierdie projek is die vermoë om stroom wat deur 'n las vloei te meet en die resultate op die reeksmonitor te vertoon. Die ACS758 gebruik Hall-effek-sensortegnologie om stroom om te skakel na 'n proporsionele spanning wat deur die Arduino gelees kan word, wat maklike monitering van stroomvlakke moontlik maak. Maak seker om die video te kyk vir bykomende insigte (in video by 01:15).

Hardeware Verduidelik

Die hoofkomponent in hierdie projek is die Allegro ACS758-stroomsensor. Hierdie sensor werk op die beginsel van die Hall-effek, wat dit in staat stel om die magnetiese veld wat deur die stroom wat deur 'n geleier vloei, te meet. Dit produseer 'n uitsetspanning wat proporsioneel is aan die stroom, wat die Arduino in staat stel om hierdie waardes te lees en te interpreteer. Die ACS758 het verskeie variante, met die "100B" wat aandui dat dit tot 100A kan meet. Dit beskik oor tweerigting-stroommeting, wat akkurate lesings moontlik maak ongeag die stroomrigting. Die sensor benodig 'n kragtoevoer van 3.3V of 5V, wat sy interne stroombane aandryf, insluitend 'n operasionele versterker wat die Hall-effek-sein verwerk.

Datablad Besonderhede

VervaardigerAllegro Microsystems
DeelnommerACS758LCB-100B
Logika/IO-spanning3.3 V / 5 V
Toevoerspanning4.5 V - 5.5 V
Uitsetstroom (per kanaal)100 A
Piekstroom (per kanaal)200 A
PWM-frekwensie-riglyneN/A
Inset-logikadrumpelsTTL-versoenbaar
Spanningsval / RDS(on) / versadiging0.1 V @ 100 A
Termiese limieteWerkingstemperatuur: -40 °C tot 125 °C
Pakket5-pen-pakket
Notas / varianteBeskikbaar in verskillende stroomgraderings (50A, 100A, 150A, 200A)

  • Verseker behoorlike bedrading om spanningsval as gevolg van weerstand te vermy.
  • Gebruik toepaslike draadmeter vir hoëstroomtoepassings om oorverhitting te voorkom.
  • Hou die sensor binne gespesifiseerde temperatuurlimiete vir akkurate lesings.
  • Kalibreer die sensoruitset gebaseer op die spesifieke model wat gebruik word.
  • Oorweeg die gebruik van filterkapasitors om lesings te stabiliseer indien nodig.

Bedradingsinstruksies

Arduino-wiring-for-ACS758-Current-sensor
Om die ACS758-stroomsensor aan jou Arduino te bedraad, begin deur die sensor se VCC-pen aan die 5V-uitset van die Arduino te koppel. Koppel dan die GND-pen van die sensor aan die Arduino se grond. Die uitset van die sensor, wat die spanning proporsioneel aan die gemete stroom verskaf, kan aan die analoog insetpen op die Arduino gekoppel word, gewoonlik gemerk as A0. Verseker dat die las wat jy wil meet in serie met die sensor gekoppel is. Die stroompad moet deur die sensor vloei sodat dit die stroom wat daardeur gaan akkuraat kan meet. Die sensor het twee stroominsetpenne; koppel jou las se positiewe draad aan een van hierdie penne en die ander pen aan jou kragtoevoer se positiewe terminaal. Die negatiewe kant van die kragtoevoer moet aan die las se negatiewe terminaal koppel. Hierdie opstelling laat die sensor toe om die stroom wat na die las vloei te meet.

Kode Voorbeelde & Deurloop

Die Arduino-kode vir die lees van waardes van die ACS758-sensor is eenvoudig. Hieronder is 'n uittreksel uit die gevorderde kode wat die sensor initialiseer en die spanning lees:

#define VIN A0 // definieer die Arduino-pen A0 as spanningsinset (V in)
const float VCC = 5.0; // toevoerspanning
const float FACTOR = 20.0 / 1000; // sensitiwiteit vir die ACS758-100B
Hierdie kode definieer die analoog insetpen en stel die toevoerspanning. Dit bereken ook die sensitiwiteitsfaktor gebaseer op die model wat gebruik word, wat noodsaaklik is vir akkurate stroomlesings. Nog 'n belangrike afdeling van die kode is die lusfunksie, wat voortdurend die spanning van die sensor lees:

void loop() {
  float voltage_raw = (5.0 / 1023.0) * analogRead(VIN); // Lees die spanning van sensor
  float current = (voltage_raw - (VCC * 0.5)) / FACTOR; // Bereken stroom
  Serial.print("Stroom: ");
  Serial.println(current, 2); // Druk stroomwaarde
}
In hierdie deel lees die kode die spanning van die sensor, pas dit aan gebaseer op die rustende uitsetspanning, en bereken die stroom met behulp van die gedefinieerde sensitiwiteitsfaktor. Die stroomwaarde word dan op die reeksmonitor gedruk. Vir 'n volledige begrip van die kodestruktuur en funksionaliteit, verwys asseblief na die volledige kode wat onder die artikel gelaai is.

Demonstrasie / Wat om te Verwag

Sodra alles korrek bedraad is en die kode opgelaai is, behoort jy stroomwaardes op die reeksmonitor te sien vertoon. Die lesings sal elke halwe sekonde opdateer soos in die kode gedefinieer. As die stroom onder die afsnyperk is wat in die kode gestel is, sal jy 'n "Geen Stroom"-boodskap sien vertoon. Hierdie afsnyperk help om geraas en klein variasies in stroomlesings uit te filter. Wees versigtig met omgekeerde polariteitsverbindings, aangesien dit die sensor kan beskadig. Verseker altyd dat die sensor korrek in serie met die las bedraad is, en monitor die uitset om akkurate lesings te bevestig. Die video verskaf bykomende konteks en demonstrasies (in video by 12:30).

Beelde

Allegro ACS758 current sensor with Arduino
Allegro ACS758 Current Sensor with Arduino
Arduino-wiring-for-ACS758-Current-sensor
Arduino-wiring-for-ACS758-Current-sensor
ACS758-sensor-0
ACS758-sensor-0
ACS758-sensor-1
ACS758-sensor-1
ACS758-sensor-3
ACS758-sensor-3
ACS758-sensor-4
ACS758-sensor-4
ACS758-sensor-5-schematic
ACS758-sensor-5-schematic
100-Advanced Arduino code for the Allegro ACS758 current sensor
Taal: C++
/*
 * 
 * Arduino Sketch for Allegro ACS758 Current Sensor (Advanced)
 * This sensor can measure current at a range of up to 200A.
 * It operates with 3.3V or 5V.
 * Please watch the video instruction and explanation for this code.
 * 
 * Written by Ahmad Shamshiri on Saturday, May 27, 2018 at 13:19 in Ajax, Ontario, Canada
 * for Robojax.com
 * View the video instruction at
 * This code has been downloaded from Robojax.com
 */
#define VIN A0 // define the Arduino pin A0 as voltage input (V in)
const float VCC   = 5.0;// supply voltage 5V or 3.3V. If using PCB, set to 5V only.
const int model = 2;   // enter the model (see below)

float cutOffLimit = 1.00;// reading cutoff current. 1.00 is 1 Ampere

/*
          "ACS758LCB-050B",// for model use 0
          "ACS758LCB-050U",// for model use 1
          "ACS758LCB-100B",// for model use 2
          "ACS758LCB-100U",// for model use 3
          "ACS758KCB-150B",// for model use 4
          "ACS758KCB-150U",// for model use 5
          "ACS758ECB-200B",// for model use 6
          "ACS758ECB-200U"// for model use 7   
          // sensitivity array is holding the sensitivity of the ACS758
          // current sensors. Do not change.          
*/
float sensitivity[] ={
          40.0,// for ACS758LCB-050B
          60.0,// for ACS758LCB-050U
          20.0,// for ACS758LCB-100B
          40.0,// for ACS758LCB-100U
          13.3,// for ACS758KCB-150B
          16.7,// for ACS758KCB-150U
          10.0,// for ACS758ECB-200B
          20.0,// for ACS758ECB-200U     
         }; 

/*         
 *   Quiescent output voltage is a factor of VCC that appears at the output       
 *   when the current is zero. 
 *   For bidirectional sensors, it is 0.5 x VCC.
 *   For unidirectional sensors, it is 0.12 x VCC.
 *   For model ACS758LCB-050B, the B at the end represents Bidirectional (polarity doesn't matter).
 *   For model ACS758LCB-100U, the U at the end represents Unidirectional (polarity must match).
 *   Do not change.
 */
float quiescent_Output_voltage [] ={
          0.5,// for ACS758LCB-050B
          0.12,// for ACS758LCB-050U
          0.5,// for ACS758LCB-100B
          0.12,// for ACS758LCB-100U
          0.5,// for ACS758KCB-150B
          0.12,// for ACS758KCB-150U
          0.5,// for ACS758ECB-200B
          0.12,// for ACS758ECB-200U            
          };
const float FACTOR = sensitivity[model]/1000;// set sensitivity for selected model
const float QOV =   quiescent_Output_voltage [model] * VCC;// set quiescent Output voltage for selected model
float voltage;// internal variable for voltage
float cutOff = FACTOR/cutOffLimit;// convert current cut off to mV

void setup() {
    //Robojax.com ACS758 Current Sensor 
    Serial.begin(9600);// initialize serial monitor
    Serial.println("Robojax Tutorial");
    Serial.println("ACS758 Current Sensor");
}

void loop() {
  //Robojax.com ACS758 Current Sensor 
  float voltage_raw =   (5.0 / 1023.0)* analogRead(VIN);// Read the voltage from sensor
  voltage =  voltage_raw - QOV + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  float current = voltage / FACTOR;
  if(abs(voltage) > cutOff ){
    Serial.print("V: ");
    Serial.print(voltage,3);// print voltage with 3 decimal places
    Serial.print("V, I: ");
    Serial.print(current,2); // print the current with 2 decimal places
    Serial.println("A");
  }else{
    Serial.println("No Current");
  }
  delay(500);
}
101-Arduino code for Allegro ACS758 current sensor (basic)
Taal: C++
/*
 * Arduino Sketch for Allegro ACS758 Current Sensor (Basic Simple)
 * This sensor can measure current at a range of up to 200A.
 * It operates with 3.3V or 5V (the module works with 5V, the sensor can work with 3.3V or 5V).
 * Please watch the video instruction and explanation for this code.
 * 
 * Written by Ahmad Shamshiri on Saturday, May 26, 2018 at 7:05 PM in Ajax, Ontario, Canada
 * for Robojax.com
 * View the video instruction at https://youtu.be/SiHfjzcqnU4
 * This code has been downloaded from Robojax.com
 */
#define VIN A0
const float vcc    = 5.00;// supply voltage 5V or 3.3V
const float factor = 0.02;// 20mV/A is the factor

float voltage;

void setup() {
    //Robojax.com ACS758 Current Sensor 
    Serial.begin(9600);
    Serial.println("Robojax Tutorial");
    Serial.println("ACS758 Current Tester");
    Serial.println("Basic Simple Code");
}

void loop() {
  //Robojax.com ACS758 Current Sensor 
  voltage =   (5.0 / 1023.0)* analogRead(VIN);// Read the voltage from sensor
  voltage =  voltage - (vcc * 0.5) + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  float current = voltage / factor;
  Serial.print("V: ");
  Serial.print(voltage,3);
  Serial.print("V, I: ");
  Serial.print(current,2); Serial.println("A");
  delay(500);
}
102-Advanced Arduino code for four Allegro ACS758 current sensors
Taal: C++
/*
 * 
 * Arduino Sketch for 4 modules Allegro ACS758 Current Sensor (Advanced)
 * This sensor can measure current at a range of up to 200A.
 * It operates with 3.3V or 5V.
 * Please watch the video instruction and explanation for this code.
 * 
 * Written by Ahmad Shamshiri on August 4, 2018 at 13:19 in Ajax, Ontario, Canada
 * for Robojax.com in request from Ross M. from YouTube video https://youtu.be/SiHfjzcqnU4 
 * View the video instruction at
 * This code has been downloaded from Robojax.com
 */
#define VIN1 A0 // define the Arduino pin A0 as voltage input (V in)
#define VIN2 A1 
#define VIN3 A2 
#define VIN4 A3 

const float VCC   = 5.0;// supply voltage 5V or 3.3V. If using PCB, set to 5V only.
const int model = 2;   // enter the model (see below)

float cutOffLimit = 1.00;// reading cutoff current. 1.00 is 1 Amper

/*
          "ACS758LCB-050B",// for model use 0
          "ACS758LCB-050U",// for model use 1
          "ACS758LCB-100B",// for model use 2
          "ACS758LCB-100U",// for model use 3
          "ACS758KCB-150B",// for model use 4
          "ACS758KCB-150U",// for model use 5
          "ACS758ECB-200B",// for model use 6
          "ACS758ECB-200U"// for model use 7   
sensitivity array is holding the sensitivity of the ACS758
current sensors. Do not change.          
*/
float sensitivity[] ={
          40.0,// for ACS758LCB-050B
          60.0,// for ACS758LCB-050U
          20.0,// for ACS758LCB-100B
          40.0,// for ACS758LCB-100U
          13.3,// for ACS758KCB-150B
          16.7,// for ACS758KCB-150U
          10.0,// for ACS758ECB-200B
          20.0,// for ACS758ECB-200U     
         }; 

/*         
 *   Quiescent output voltage is a factor of VCC that appears at the output       
 *   when the current is zero. 
 *   For bidirectional sensors it is 0.5 x VCC
 *   For unidirectional sensors it is 0.12 x VCC
 *   For model ACS758LCB-050B, the B at the end represents bidirectional (polarity doesn't matter).
 *   For model ACS758LCB-100U, the U at the end represents unidirectional (polarity must match).
 *   Do not change.
 */
float quiescent_Output_voltage [] ={
          0.5,// for ACS758LCB-050B
          0.12,// for ACS758LCB-050U
          0.5,// for ACS758LCB-100B
          0.12,// for ACS758LCB-100U
          0.5,// for ACS758KCB-150B
          0.12,// for ACS758KCB-150U
          0.5,// for ACS758ECB-200B
          0.12,// for ACS758ECB-200U            
          };
const float FACTOR = sensitivity[model]/1000;// set sensitivity for selected model
const float QOV =   quiescent_Output_voltage [model] * VCC;// set quiescent Output voltage for selected model
float voltage1;// internal variable for voltage1
float voltage2;// internal variable for voltage2
float voltage3;// internal variable for voltage3
float voltage4;// internal variable for voltage4

float cutOff = FACTOR/cutOffLimit;// convert current cut off to mV

void setup() {
    //Robojax.com ACS758 Current Sensor 
    Serial.begin(9600);// initialize serial monitor
    Serial.println("Robojax Tutorial");
    Serial.println("Four ACS758 Current Sensors");
}

void loop() {
  //Robojax.com ACS758 Current Sensor 
  float voltage_raw1 =   (5.0 / 1023.0)* analogRead(VIN1);// Read the voltage from sensor
  float voltage_raw2 =   (5.0 / 1023.0)* analogRead(VIN2);// Read the voltage from sensor
  float voltage_raw3 =   (5.0 / 1023.0)* analogRead(VIN3);// Read the voltage from sensor
  float voltage_raw4 =   (5.0 / 1023.0)* analogRead(VIN4);// Read the voltage from sensor
  
  voltage1 =  voltage_raw1 - QOV + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  voltage2 =  voltage_raw2 - QOV + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  voltage3 =  voltage_raw3 - QOV + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  voltage4 =  voltage_raw4 - QOV + 0.007 ;// 0.007 is a value to make voltage zero when there is no current
  
  float current1 = voltage1 / FACTOR;
  float current2 = voltage2 / FACTOR;
  float current3 = voltage3 / FACTOR;
  float current4 = voltage4 / FACTOR;
  
  if(abs(voltage1) > cutOff ){ //Corrected abs(voltage) to abs(voltage1)

    Serial.print("I1: ");
    Serial.print(current1,2); // print the current with 2 decimal places
    Serial.println("A");
	
    Serial.print("I2: ");
    Serial.print(current2,2); // print the current with 2 decimal places
    Serial.println("A");

    Serial.print("I3: ");
    Serial.print(current3,2); // print the current with 2 decimal places
    Serial.println("A");
	
    Serial.print("I4: ");
    Serial.print(current4,2); // print the current with 2 decimal places
    Serial.println("A");	
	
  }else{
    Serial.println("No Current");
  }
  delay(500);
}

Hulpbronne en verwysings

Geen hulpbronne nog.

Lêers📁

Ander lêers