Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

wojtek6000 17 Paź 2017 12:24 2364 8
  • #1 17 Paź 2017 12:24
    wojtek6000
    Poziom 6  

    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?

    0 8
  • #2 17 Paź 2017 13:00
    czareqpl
    Poziom 28  

    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...

    0
  • #3 17 Paź 2017 13:10
    wojtek6000
    Poziom 6  

    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?

    0
  • #4 17 Paź 2017 13:21
    czareqpl
    Poziom 28  

    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.

    0
  • #5 17 Paź 2017 13:49
    wojtek6000
    Poziom 6  

    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

    0
  • Pomocny post
    #6 17 Paź 2017 14:21
    czareqpl
    Poziom 28  

    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ą.

    0
  • #7 17 Paź 2017 14:57
    wojtek6000
    Poziom 6  

    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

    0
  • Pomocny post
    #8 17 Paź 2017 17:17
    czareqpl
    Poziom 28  

    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.

    0
  • #9 25 Paź 2017 14:00
    wojtek6000
    Poziom 6  

    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

    Code:


    #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(" ");
    }

    0
  Szukaj w 5mln produktów