Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVT5399 - 2-kanałowy multimetr panelowy przeróbka

badboy23 17 Lut 2015 15:56 528 0
  • #1 17 Lut 2015 15:56
    badboy23
    Poziom 27  

    Witam, posiadam 2-kanałowy multimetr panelowy "AVT5399" chciałbym go przerobić na zakres do 10A jest taka możliwość?

    Schemat

    Posiadam kod źródłowy.

    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    /*
    * main.c
    * Multimetr dwu kanałowy z pomiarem napięcia i prądu
    * Created on: 2012-11-21
    * Autor: Piotr Rosenbaum
    */
    #include <avr/io.h>
    #include <util/delay.h>
    #include "LCD/lcd44780.h"
    #include <avr/eeprom.h>

    #define KEY_PIN (1<<PB5)
    #define KEY_DOWN !(PINB & KEY_PIN)


    uint16_t pomiar(uint8_t kanal);
    void wysw_i1(void);
    void wysw_u1(void);
    void wysw_i2(void);
    void wysw_u2(void);

    uint8_t eeprom_val[1] __attribute__((section(".eeprom"))); //deklaracja 1bajta w pamięci eeprom
    void zapisz(uint8_t wartosc); //funkcja zapisu do eeprom
    uint8_t odczyt(void); //procedura odczytu z eeprom



    uint32_t pom = 0; //zmienna przechowuje wartość bezpośrednio z mierzoną z adc0 (U1)
    uint32_t pom_i = 0; //zmienna przechowuje wartość bezpośrednio z mierzoną z adc2 (I1)
    uint32_t wynik = 0; //wartość pośrednia przeliczanego pomiaru na napięcie (U1)
    uint32_t wynik_i = 0; //wartość pośrednia przeliczanego pomiaru na napięcie (I1)
    uint8_t cz_u;
    uint8_t cz_d;
    uint8_t cz_u_i;
    uint8_t cz_d_i;
    uint16_t mA;
    uint16_t mV;

    uint32_t pom2 = 0; //zmienna przechowuje wartość bezpośrednio z mierzoną z adc1 (U2)
    uint32_t pom_i2 = 0; //zmienna przechowuje wartość bezpośrednio z mierzoną z adc3 (I2)
    uint32_t wynik2 = 0; //wartość pośrednia przeliczanego pomiaru na napięcie (U2)
    uint32_t wynik_i2 = 0; //wartość pośrednia przeliczanego pomiaru na napięcie (I2)
    uint8_t cz_u2;
    uint8_t cz_d2;
    uint8_t cz_u_i2;
    uint8_t cz_d_i2;
    uint16_t mA2;
    uint16_t mV2;

    uint8_t flaga_sw = 0;
    uint8_t flaga_setup = 0;
    uint8_t set = 25;


    int main(void)
    {
    lcd_init();
    lcd_cls(); //czyszczenie lcd


    ADMUX |= (1<<REFS0) | (1<<REFS1); //wybór napięcia odniesienia jako VCC (dodanie 1<<REFS1 wybiera wewnętrzne 2,56V)
    ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); //włączenie przetwornika ADC i ustawienie preskalera dla ADC na 64

    DDRB &= ~KEY_PIN; // kierunek pinu PB5 - wejściowy
    PORTB |= KEY_PIN; // podciągnięcie pinu do VCC





    if (KEY_DOWN)
    {
    _delay_ms(1000);

    if (KEY_DOWN)
    {
    flaga_setup = 1;
    }
    }

    if (flaga_setup == 0)
    {
    lcd_locate(0,0);
    lcd_str(" Multimetr");
    lcd_locate(1,0);
    lcd_str(" 2 kanalowy");
    _delay_ms(1500);
    lcd_cls();

    lcd_locate(0,0);
    lcd_str(" Wykonal:");
    lcd_locate(1,0);
    lcd_str("Piotr Rosenbaum");
    _delay_ms(1500);
    lcd_cls();
    }
    else if (flaga_setup == 1)
    {
    lcd_locate(0,0);
    lcd_str("Tryb serwisowy:");
    _delay_ms(1500);
    lcd_cls();
    }

    set = odczyt();
    if (set == 0) set = 25;

    while(1)
    {

    if (flaga_setup == 0)
    {

    switch(flaga_sw) //switch case do wyświetlania wartości pomiarowych na LCD
    {
    case 0: //pierwszy tryb wyświetla U1 i I1
    lcd_locate(0,0);
    lcd_str("U1= ");
    wysw_u1(); //wywołanie funkcji która mierzy i wyświetla napięcie z ch1
    lcd_str(" ");
    lcd_locate(1,0);
    lcd_str("I1= "); //wywołanie funkcji która mierzy i wyświetla prąd z ch1
    wysw_i1();
    lcd_str(" ");
    _delay_ms(150);
    break;

    case 1: //drugi tryb wyświetla U2 i I2
    lcd_locate(0,0);
    lcd_str("U2= ");
    wysw_u2(); //wywołanie funkcji która mierzy i wyświetla napięcie z ch2
    lcd_str(" ");
    lcd_locate(1,0);
    lcd_str("I2= "); //wywołanie funkcji która mierzy i wyświetla prąd z ch2
    wysw_i2();
    lcd_str(" ");
    _delay_ms(150);
    break;

    case 2: //trzeci tryb wyświetla U1 i U2
    lcd_locate(0,0);
    lcd_str("U1= ");
    wysw_u1(); //wywołanie funkcji która mierzy i wyświetla napięcie z ch1
    lcd_str(" ");
    lcd_locate(1,0);
    lcd_str("U2= "); //wywołanie funkcji która mierzy i wyświetla napięcie z ch2
    wysw_u2();
    lcd_str(" ");
    _delay_ms(150);
    break;

    case 3: //czwarty tryb wyświetla I1 i I2
    lcd_locate(0,0);
    lcd_str("I1= ");
    wysw_i1(); //wywołanie funkcji która mierzy i wyświetla prąd z ch1
    lcd_str(" ");
    lcd_locate(1,0);
    lcd_str("I2= ");
    wysw_i2(); //wywołanie funkcji która mierzy i wyświetla prąd z ch2
    lcd_str(" ");
    _delay_ms(150);
    break;

    case 4:
    lcd_locate(0,0);
    lcd_str("U1=");
    wysw_u1(); //wywołanie funkcji która mierzy i wyświetla napięcie z ch1
    lcd_locate(0,8);
    lcd_str("I1="); //wywołanie funkcji która mierzy i wyświetla prąd z ch1
    wysw_i1();

    lcd_locate(1,0);
    lcd_str("U2=");
    wysw_u2(); //wywołanie funkcji która mierzy i wyświetla napięcie z ch2
    lcd_locate(1,8);
    lcd_str("I2="); //wywołanie funkcji która mierzy i wyświetla prąd z ch2
    wysw_i2();
    _delay_ms(150);
    break;
    }
    }
    else if (flaga_setup == 1)
    {
    lcd_locate(0,0);
    lcd_str("U1=");
    wysw_u1();
    lcd_locate(1,0);
    lcd_str("U2=");
    wysw_u2();

    if (KEY_DOWN)
    {
    _delay_ms(80);
    if (KEY_DOWN)
    {
    set++;
    if(set == 28) set = 23;
    zapisz(set);
    }
    }
    _delay_ms(150);

    }
    //----------------------------------------------------------------OBSŁUGA PRZYCISKU ZMIANY WYŚWIETLANEGO KANAŁU POMIARU--------------------------------------------------------

    if (KEY_DOWN)
    {
    _delay_ms(120);

    if (KEY_DOWN)
    {
    flaga_sw ++;
    if (flaga_sw == 5) flaga_sw = 0;
    }
    }

    }
    }

    uint16_t pomiar(uint8_t kanal) //funkcja pomiaru napięcia z wybranego kanału
    {
    ADMUX = (ADMUX & 0xF8) | kanal; //ustawienie wybranego kanału w rejestrze ADCSR
    ADCSRA |= (1<<ADSC); //start pomiaru

    while( ADCSRA & (1<<ADSC) ); //po zakończeniu pomiaru, zwrócenie wyniku w postaci 16-bitowej wartości
    return ADCW;
    }


    void wysw_u1 (void)
    {

    pom = pomiar(1); //wywołanie funkcji pomiaru z podaniem numeru kanału i zapisanie wartości do zmiennej pom np. 36
    wynik = pom * set * 13; //brak dzielnika 48 wynika z wynik = pom * (5/1024) * 1 5/1024 = 0,0048 * 10000 = 48 * 6 (PRZEKŁADNIA DZIELNIKA)
    cz_d = wynik/10000;
    cz_u = (wynik/100) % 100; //wartość części ułamkowej wynik/100 i dzielenie modulo na 100 wynikiem jest część ułamkowa pomiaru


    if(cz_d >= 1)
    {
    if (cz_u < 10) //jeśli część ułamkowa mniejsza od 10 dodaj zero 0 przed wynikiem
    {
    lcd_int(cz_d); //wyświetlanie części dziesiętnej napięcia
    lcd_str(".");
    lcd_str("0");
    lcd_int(cz_u);
    lcd_str("V ");
    }
    else //jeśli część ułamkowa większa od 10 wyświetl wartość
    {
    lcd_int(cz_d); //wyświetlanie części dziesiętnej napięcia
    lcd_str(".");
    lcd_int(cz_u);
    lcd_str("V ");
    }
    }
    else if (cz_d < 1) //jeśli części dziesiętne są mniejsze od jedności napięcie wyświetlane w miliwoltach
    {
    mV = wynik / 10;
    if (mV <= 5) mV = 0;
    lcd_int(mV);
    lcd_str("mV ");
    }
    }


    void wysw_i1 (void)
    {
    pom_i = pomiar(2); //wywołanie funkcji pomiaru z podaniem numeru kanału i zapisanie wartości do zmiennej pom np. 36
    wynik_i = pom_i * 25 * 2; //wynika z wynik = pom * 2,56/1024 = 0,0025 * 10000 = 25 * 2 (wzmocznienie 10 dzielnik 2)
    cz_d_i = wynik_i / 10000;
    cz_u_i = (wynik_i/100) % 100; //wartość części ułamkowej wynik/100 i dzielenie modulo na 100 wynikiem jest część ułamkowa pomiaru

    if(cz_d_i >= 1)
    {
    if (cz_u_i < 10) //jeśli część ułamkowa mniejsza od 10 dodaj zero 0 przed wynikiem
    {
    lcd_int(cz_d_i); //wyświetlanie części dziesiętnej prądu
    lcd_str(".");
    lcd_str("0");
    lcd_int(cz_u_i);
    lcd_str("A ");
    }
    else //jeśli część ułamkowa większa od 10 wyświetl wartość
    {
    lcd_int(cz_d_i); //wyświetlanie części dziesiętnej prądu
    lcd_str(".");
    lcd_int(cz_u_i);
    lcd_str("A ");
    }
    }
    else if (cz_d_i < 1) //jeśli części dziesiętne są mniejsze od jedności napięcie wyświetlane w miliamperach
    {
    mA = wynik_i / 10;
    if (mA <= 5) mA = 0;
    lcd_int(mA);
    lcd_str("mA ");
    }
    }

    void wysw_u2(void)
    {
    pom2 = pomiar(0); //wywołanie funkcji pomiaru z podaniem numeru kanału i zapisanie wartości do zmiennej pom np. 360
    wynik2 = pom2 * set * 13; //brak dzielnika 48 wynika z wynik = pom * (5/1024) * 1 5/1024 = 0,0048 * 10000 = 48 * 6 (PRZEKŁADNIA DZIELNIKA)
    cz_d2 = wynik2/10000;
    cz_u2 = (wynik2/100) % 100; //wartość części ułamkowej wynik/100 i dzielenie modulo na 100 wynikiem jest część ułamkowa pomiaru

    if(cz_d2 >= 1)
    {
    if (cz_u2 < 10) //jeśli część ułamkowa mniejsza od 10 dodaj zero 0 przed wynikiem
    {
    lcd_int(cz_d2); //wyświetlanie części dziesiętnej napięcia
    lcd_str(".");
    lcd_str("0");
    lcd_int(cz_u2);
    lcd_str("V ");
    }
    else //jeśli część ułamkowa większa od 10 wyświetl wartość
    {
    lcd_int(cz_d2); //wyświetlanie części dziesiętnej napięcia
    lcd_str(".");
    lcd_int(cz_u2);
    lcd_str("V ");
    }
    }
    else if (cz_d2 < 1) //jeśli części dziesiętne są mniejsze od jedności napięcie wyświetlane w miliwoltach
    {
    mV2 = wynik2 / 10;
    if (mV2 <= 5) mV2 = 0;
    lcd_int(mV2);
    lcd_str("mV ");
    }
    }

    void wysw_i2(void)
    {
    pom_i2 = pomiar(3); //wywołanie funkcji pomiaru z podaniem numeru kanału i zapisanie wartości do zmiennej pom np. 360
    wynik_i2 = pom_i2 * 25 * 2; //wynika z wynik = pom * 2,56/1024 = 0,0025 * 10000 = 25 * 2 (wzmocznienie 10 dzielnik 2)
    cz_d_i2 = wynik_i2 / 10000;
    cz_u_i2 = (wynik_i2/100) % 100; //wartość części ułamkowej wynik/100 i dzielenie modulo na 100 wynikiem jest część ułamkowa pomiaru

    if(cz_d_i2 >= 1)
    {
    if (cz_u_i2 < 10) //jeśli część ułamkowa mniejsza od 10 dodaj zero 0 przed wynikiem
    {
    lcd_int(cz_d_i2); //wyświetlanie części dziesiętnej prądu
    lcd_str(".");
    lcd_str("0");
    lcd_int(cz_u_i2);
    lcd_str("A ");
    }
    else //jeśli część ułamkowa większa od 10 wyświetl wartość
    {
    lcd_int(cz_d_i2); //wyświetlanie części dziesiętnej prądu
    lcd_str(".");
    lcd_int(cz_u_i2);
    lcd_str("A ");
    }
    }
    else if (cz_d_i2 < 1) //jeśli części dziesiętne są mniejsze od jedności napięcie wyświetlane w miliamperach
    {
    mA2 = wynik_i2 / 10;
    if (mA2 <= 5) mA2 = 0;
    lcd_int(mA2);
    lcd_str("mA ");
    }
    }

    void zapisz(uint8_t wartosc)
    {
    eeprom_busy_wait();
    eeprom_write_byte(&eeprom_val[0],wartosc);
    }

    uint8_t odczyt(void)
    {
    eeprom_busy_wait();
    return eeprom_read_byte(&eeprom_val[0]);
    }

    2 0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo