logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pomiar napięcia 230VAC z optoizolacją Atmega/Arduino

wojtek6000 17 Paź 2017 12:24 14955 8
  • #1 16762316
    wojtek6000
    Poziom 9  
    Posty: 66
    Witam

    Chciałbym zbudować jak najprostszy układ pozwalający na pomiar napięcia zmiennego w gniazdku, tak bym mógł odczytać go poprzez przetwornik ADC w mikrokontrolerze Atmega8. Zależy mi by układ nie posiadał transformatora. Chciałbym też mieć separację galwaniczną. Na obecną chwilę udało mi się wymyślić coś takiego:

    Pomiar napięcia 230VAC z optoizolacją Atmega/Arduino

    Rezystory R15 i R16 są 2W i mają po 100kOhm każdy.
    P8 prowadzi do wejścia ADC mikrokontrolera.

    Czy poprzez ten układ jest możliwy pomiar napięcia AC z dokładnością ~5V?
  • #2 16762356
    czareqpl
    Poziom 33  
    Posty: 1955
    Pomógł: 196
    Ocena: 579
    wojtek6000 napisał:
    kład pozwalający na pomiar napięcia zmiennego w gniazdku

    Jeżeli już to przemiennego.

    wojtek6000 napisał:
    Czy poprzez ten układ jest możliwy pomiar napięcia AC z dokładnością ~5V?


    Nie.
    Nie wiem po co ten kondensator 100uF. Jego ładowanie przez rezystor 4k7 zajmie dużo czasu...
  • #3 16762371
    wojtek6000
    Poziom 9  
    Posty: 66
    Hmm... a jeżeli zrezygnowałbym z optoizolacji i pozostawił tylko R15, R16 i diodę? Dla mikrokontrolera bezpieczne to nie bedzię, ale czy wtedy uzyskam pożądany efekt?
  • #4 16762394
    czareqpl
    Poziom 33  
    Posty: 1955
    Pomógł: 196
    Ocena: 579
    Nie powinieneś rezygnować z izolacji galwanicznej. Może to być też niebezpieczne dla programatora i komputera, kończąc na Tobie.

    Separacja galwaniczna za pomocą malutkiego transformatora jest tutaj mocno wskazana.
  • #5 16762446
    wojtek6000
    Poziom 9  
    Posty: 66
    Czyli rozwiązaniem pozwalającym na "w miarę" dokładny pomiar napięcia przemiennego 230V jest układ z załącznika? Rezystor i kondensator musiałby być dobrany w zależności od zastosowanego transformatora.

    Pomiar napięcia 230VAC z optoizolacją Atmega/Arduino
  • Pomocny post
    #6 16762492
    czareqpl
    Poziom 33  
    Posty: 1955
    Pomógł: 196
    Ocena: 579
    wojtek6000 napisał:
    Czyli rozwiązaniem pozwalającym na "w miarę" dokładny pomiar napięcia przemiennego 230V jest układ z załącznika?


    Nie. Układem z załącznika zmierzysz napięcie stałe a nie przemienne. Po co dałeś diody i kondensator? Aby mierzyć napięcie przemienne?

    Jedno z wyprowadzeń transformatora daj do masy obwodu mikrokontrolera, z drugiego poprowadź diodę w kierunku przewodzenia do mikrokontrolera. Za diodą daj dzielnik rezystorowy tak aby na nim mieć spadek napięcia, który nie zabije Twojego mikrokontrolera (0-5V + zapas na przepięcia). Takim układem będziesz mógł dokonywać pomiarów jednopołówkowych napięcia przemiennego. Czyli diodą odcinasz sobie dodatnią część sinusa. Łatwo wtedy pomierzyć częstotliwość, wartość skuteczną i maksymalną.
  • #7 16762547
    wojtek6000
    Poziom 9  
    Posty: 66
    Czy ten układ jest już poprawny abym mógł zmierzyć wartość skuteczną napięcia? Wiem, że będę musiał dopisać kawałek kodu który to oblicza, ale z tym dam sobie radę:)

    Pomiar napięcia 230VAC z optoizolacją Atmega/Arduino
  • Pomocny post
    #8 16762759
    czareqpl
    Poziom 33  
    Posty: 1955
    Pomógł: 196
    Ocena: 579
    Myślę, że się nada. Wyprowadzenie, które oznaczyłeś ADC najlepiej przed podłączeniem do mikrokontrolera sprawdzić oscyloskopem. Jeżeli nie przekracza dopuszczalnej wartości napięcia to będzie ok. Dla pewności można jeszcze w szereg dać rezystor 470Ohm a za nim przeciwlegle do masy obwodu diodę zenera na napięcie 3.6V lub 5.1V. To ochroni Twój układ przed przepięciami, jednak może wprowadzić zniekształcenia w mierzonym sygnale.
  • #9 16778434
    wojtek6000
    Poziom 9  
    Posty: 66
    Udało mi się zaprojektować układ i napisać program, który ma mierzyć napięcie skuteczne z ośmiu kanałów przy pomocy multipleksera analogowego CD4051B. W innym wątku znalazłem informację, że aby wyznaczyć zgrubną wartość napięcia skutecznego należy pomnożyć napięcie szczytowe razy pierwiastek z 2. Tak też zrobiłem. Jednak mam pewien problem. Układ bez podłączenia żadnych przewodów pomiarowych wskazuje prawidłowo 0V, jednak po podłączeniu przewodu z napięciem 230VAC do jednego z ośmiu transformatorów TEZ 1,5/D 230/6 układ odczytuje na wejściu 169V, a na innych niepodłączonych wskazuje około 16V. Co może być nie tak? Poniżej program i schemat układu (rezystory w dzielnikach to 4,7k).
    Pomiar napięcia 230VAC z optoizolacją Atmega/Arduino
    
    
    #define WA A1
    #define WB A2
    #define WC A3
    
    void setup() {
    // put your setup code here, to run once:
    pinMode(A0,INPUT);
    pinMode(WA,OUTPUT);
    pinMode(WB,OUTPUT);
    pinMode(WC,OUTPUT);
    Serial.begin(9600);
    }
    
    /*
    * ustawieniee kanału multipleksera 
    */
    void set_kanal(byte nr){
    switch(nr){
    case 0:{set_0();}break;
    case 1:{set_1();}break;
    case 2:{set_2();}break;
    case 3:{set_3();}break;
    case 4:{set_4();}break;
    case 5:{set_5();}break;
    case 6:{set_6();}break; 
    case 7:{set_7();}break;
    default:{res();}break;
    }
    delay(20);
    }
    
    void set_0(){
    digitalWrite(WA,LOW);
    digitalWrite(WB,LOW);
    digitalWrite(WC,LOW);
    //Serial.print("Odczyt z zero:\t\t"); 
    }
    
    void set_1(){
    digitalWrite(WA,HIGH);
    digitalWrite(WB,LOW);
    digitalWrite(WC,LOW);
    //Serial.print("Odczyt z jeden:\t\t"); 
    }
    
    void set_2(){
    digitalWrite(WA,LOW);
    digitalWrite(WB,HIGH);
    digitalWrite(WC,LOW);
    //Serial.print("Odczyt z dwa:\t\t"); 
    }
    void set_3(){
    digitalWrite(WA,HIGH);
    digitalWrite(WB,HIGH);
    digitalWrite(WC,LOW);
    //Serial.print("Odczyt z trzy:\t\t"); 
    }
    void set_4(){
    digitalWrite(WA,LOW);
    digitalWrite(WB,LOW);
    digitalWrite(WC,HIGH);
    //Serial.print("Odczyt z cztery:\t\t"); 
    }
    void set_5(){
    digitalWrite(WA,HIGH);
    digitalWrite(WB,LOW);
    digitalWrite(WC,HIGH);
    //Serial.print("Odczyt z piec:\t\t"); 
    }
    void set_6(){
    digitalWrite(WA,LOW);
    digitalWrite(WB,HIGH);
    digitalWrite(WC,HIGH);
    //Serial.print("Odczyt z szesc:\t\t"); 
    }
    void set_7(){
    digitalWrite(WA,HIGH);
    digitalWrite(WB,HIGH);
    digitalWrite(WC,HIGH);
    //Serial.print("Odczyt z siedem:\t\t"); 
    }
    void res(){
    digitalWrite(WA,LOW);
    digitalWrite(WB,LOW);
    digitalWrite(WC,LOW);
    delay(5);
    }
    
    double get_voltage(){
    long czas_start=millis();
    long teraz=0;
    int _max=0;
    int pomiar=0;
    while(teraz<czas_start+100){
    teraz=millis();
    pomiar=analogRead(A0);
    if(pomiar>_max){
    _max=pomiar;
    }
    }
    return map(_max,0,1024,0,240)/sqrt(2); //obliczenie watości skutecznej
    }
    
    void loop() {
    for(byte i=0;i<8;i++){
    set_kanal(i);
    Serial.print("\t");
    Serial.print(get_voltage());
    //delay(1000);
    }
    Serial.println(" ");
    }
    

Podsumowanie tematu

✨ Użytkownik poszukiwał prostego układu do pomiaru napięcia zmiennego 230VAC z optoizolacją, aby móc odczytać wartości za pomocą przetwornika ADC w mikrokontrolerze Atmega8. W dyskusji poruszono kwestie dotyczące bezpieczeństwa, konieczności zachowania izolacji galwanicznej oraz zastosowania transformatora. Użytkownik zaproponował różne schematy, jednak otrzymał sugestie, aby nie rezygnować z optoizolacji oraz aby stosować dzielnik napięcia i diodę do pomiaru napięcia przemiennego. Ostatecznie zaprojektował układ z multiplekserem analogowym CD4051B, ale napotkał problemy z odczytem napięcia, które były nieprawidłowe po podłączeniu do transformatora TEZ 1,5/D 230/6. Wskazano na potrzebę sprawdzenia wartości napięcia na wyjściu przed podłączeniem do mikrokontrolera oraz zastosowania diody Zenera dla ochrony.
Wygenerowane przez model językowy.
REKLAMA