Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[ATMEGA8][C] Ograniczenie prądowe

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

[ATMEGA8][C] Ograniczenie prądowe

Postautor: Faber33 » 14 cze 2010, o 18:44

Witam. Mógłby mi ktoś doradzić na jakiej zasadzie działa wyświetlane aktualnie ustawionego ograniczenia prądowego w zasilaczu???...Chciałbym dopisać taką funkcje do takiego miernika

Obrazek

Na jakiej zasadzie wyświetlanie ograniczenie prądowego działa...gdzie jest ono mierzone i jak miernik ma je zapamiętywać????

Dodatkowo zamieszczam zawartość pliku main.c

Kod: Zaznacz cały

#define Uref 2.65 // Napiecie referencyjne #define Rpom 0.1 // Rezystor pomiarowy #define R1 100000 // Dzielnik napieciowy - R1 100k ohm #define R2 7665 // Dzielnik napieciowy - R2 7k5 ohm #define Temp_wl 60 // Temp wlaczenia wiatraka #define Temp_wy 50 // Temp wylaczenia wiatraka #define Temp_max 80 // Temp wylaczenia przekaznika #define Temp_min 70 // Temp wlaczenia przekaznika #include <avr/io.h> //#include <math.h> #include <stdio.h> #include <stdlib.h> #include "naglowkowy.h" void lcd_U_I(void); void lcd_P_R(void); void lcd_T_FAN(void); void lcd_TON_TOFF(void); char data0[8] = {0x0E, 0x11, 0x11, 0x11, 0x0A, 0x0A, 0x1B, 0x00}; //ohm numer 0 char data1[8] = {0x02, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}; //stopien numer 1 char data2[8] = {0x00, 0x04, 0x15, 0x0E, 0x15, 0x04, 0x00, 0x00}; // gwiazdka char x; int i, ADC_H, ADC_L; float prad, napiecie, temperatura; long ADC_temp, ADC_temp_sr; float Uin; int napiecie_int , napiecie_float; int prad_int , prad_float; char menu = 0; char setup; int main(void) { Ust_Portow(); LCD_init(); ADC_init(); lcd_def_char(data0,0); lcd_def_char(data1,1); lcd_def_char(data2,2); pierwsza(); write_char(0b00000010); write_text("Zas.30V"); druga(); write_text("3.15A"); write_char(0b00000010); Waitms(100); PORTB|= _BV(PB1); Waitms(500); PORTB &= ~_BV(PB1); czysc(); while(1) { prad = 0; napiecie = 0; temperatura = 0; ADC_temp = 0; ADC_temp_sr = 0; Uin = 0; // pomiar wartosci ADC0 - napiecie for(i = 0 ; i < 20 ; i++) { ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; ADC_L = ADCL; ADC_H = ADCH; ADC_temp = ADC_H*256+ADC_L; ADC_temp_sr = ADC_temp_sr + ADC_temp; if(i==19) { ADC_temp = ADC_temp_sr/20; Uin = (Uref/1024)*ADC_temp; napiecie = ((R1+R2)/R2)*Uin; napiecie_int = napiecie; napiecie_float = (napiecie*100)-(napiecie_int*100); } } temperatura = 0; ADC_temp = 0; ADC_temp_sr = 0; Uin = 0; //prad = 0; // pomiar wartosci ADC1 ADMUX |= _BV(PC0); for(i = 0 ; i < 20 ; i++) { ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; ADC_L = ADCL; ADC_H = ADCH; ADC_temp = ADC_H*256+ADC_L; ADC_temp_sr = ADC_temp_sr + ADC_temp; if(i==19) { ADC_temp = ADC_temp_sr/20; Uin = (Uref/1024)*ADC_temp; prad = Uin/Rpom; prad_int = prad; prad_float = (prad*1000)-(prad_int*1000); } } temperatura = 0; ADC_temp = 0; ADC_temp_sr = 0; Uin = 0; ADMUX &= ~_BV(PC0); // pomiar wartosci ADC2 ADMUX |= _BV(PC1); for(i = 0 ; i < 20 ; i++) { ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; ADC_L = ADCL; ADC_H = ADCH; ADC_temp = ADC_H*256+ADC_L; ADC_temp_sr = ADC_temp_sr + ADC_temp; if(i==19) { ADC_temp = ADC_temp_sr/20; Uin = (Uref/1024)*ADC_temp; temperatura = Uin*90; } } ADMUX &= ~_BV(PC1); if(temperatura >= Temp_wl) { PORTB|= _BV(PB1); } if(temperatura <= Temp_wy) { PORTB &= ~_BV(PB1); } if(temperatura >= Temp_max) { PORTD &= ~_BV(PD0); } if(temperatura <= Temp_min) { PORTD|= _BV(PD0); } if(bit_is_clear(PINB,PB2)) { // while(bit_is_clear(PINB,PB2)){} Waitms(100); menu=menu+1; if(menu > 3) { menu=0; } } if(menu==0) // prad napiecie { lcd_U_I(); } if(menu==1) /// moc rezystancja { lcd_P_R(); } if(menu==2) // temp fan { lcd_T_FAN(); } if(menu==3) // temp on off { lcd_TON_TOFF(); } // if(bit_is_set(PINB,PB1)) // { // czysc(); // write_text("Fan ON "); // } } return 0; } void lcd_U_I(void) { pierwsza(); write_text(" "); write_data(napiecie_int); write_text("."); if(napiecie_float<10) { write_text("0"); } write_data(napiecie_float); write_text("V "); druga(); write_text(" "); write_data(prad_int); write_text("."); if(prad_float<10) { write_text("0"); } if(prad_float<100) { write_text("0"); } write_data(prad_float); write_text("A "); } void lcd_P_R(void) { pierwsza(); write_text(" "); if((napiecie*prad)<1) { write_data(napiecie*prad*1000); write_text("mW "); } else { write_data(napiecie*prad); write_text("W "); } druga(); if(((napiecie/prad)>=1000000)||(napiecie==0)||(prad==0)) { write_text("R > 1M"); write_char(0b00000000); write_text(" "); } else { write_text(" "); write_data(napiecie/prad); write_char(0b00000000); write_text(" "); } } void lcd_T_FAN(void) { pierwsza(); write_text(" "); write_data(temperatura); write_char(0b00000001); write_text("C "); druga(); if(bit_is_set(PINB,PB1)) write_text("Fan ON "); if(bit_is_clear(PINB,PB1)) write_text("Fan OFF "); } void lcd_TON_TOFF(void) { druga(); write_text(" ON "); write_data(Temp_wl); write_char(0b00000001); write_text("C "); pierwsza(); write_text("OFF "); write_data(Temp_wy); write_char(0b00000001); write_text("C "); }
Z góry dziękuje za pomoc :)

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Re: [ATMEGA8][C] Ograniczenie prądowe

Postautor: Tomasz Gumny » 15 cze 2010, o 10:25

Na jakiej zasadzie wyświetlanie ograniczenie prądowego działa...gdzie jest ono mierzone i jak miernik ma je zapamiętywać????
To co przedstawiłeś tylko mierzy prąd, napięcie i temperaturę, bez możliwości regulacji prądu. Wartość prądu maksymalnego można ustawić np. potencjometrem włączonym między GND i AREF (sprawdź na ile można obciążyć), suwak np. do ADC3. Nawet jeśli program stwierdzi przekroczenie ustawionej wartości może co najwyżej wyświetlić jakiś wykrzyknik, bo bez buzzera nawet sobie nie pohałasuje...

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 15 cze 2010, o 13:36

jakoś nie bardzo to kumam...nie da się tego tak rozwiązać aby tym samym potencjometrem co reguluje prąd ustawiać ograniczenie prądowe np. przy zwarciu zasilacza???? a gdy jest podpięty jakiś układ to regulacja prądu będzie tylko poniżej wartości ograniczenia????

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 15 cze 2010, o 14:26

[...] tym samym potencjometrem co reguluje prąd ustawiać ograniczenie prądowe np. przy zwarciu zasilacza????
Jedyny potencjometr jaki widzę na schemacie służy do regulacji kontrastu wyświetlacza LCD. Układ który zaprezentowałeś tylko mierzy jakieś napięcie, spadek napięcia na boczniku i temperaturę, wylicza moc, rezystancję (chyba obciążenia) i załącza wentylator. Poza tym niczego nie reguluje, więc jak chcesz ograniczać prąd? Sposób ustawiania tej wartości jest w tym wszystkim najmniej istotny.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 15 cze 2010, o 15:50

miałem na myśli potencjometr w zasilaczu regulowanym (prąd i napięcie). Ograniczenie prądu w nim ustawia się na zwarciu zasilacza...tyle tylko że chciałbym aby było ono wyświetlane na mierniku.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 15 cze 2010, o 20:02

To chyba jedynym prostym rozwiązaniem jest wykorzystanie potencjometru podwójnego: jedna sekcja posłuży do ustawiania ograniczenia prądowego a drugą można wykorzystać jako źródło napięcia dla np. ADC3. Trochę prób zwarciowych i przeliczeń powinno programowi wystarczyć do w miarę dokładnego powiązania tego napięcia z prądem zasilacza.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 16 cze 2010, o 11:22

...aha...a jak to rozwiązać mam programowo???? :/ bo nie bardzo sie na tym znam

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 cze 2010, o 11:57

Zacznij od sprzętu:
1. to wbudowane źródło napięcia odniesienia nie jest ani dokładne ani stabilne i w dodatku nie można go obciążać (bez buforowania), więc proponuję przełączyć się na AVCC jako Vref.
2. AVCC proponuję podłączyć do VCC przez dławik tak jak to podano w karcie katalogowej ATmega8.
3. włącz między masę i AVCC potencjometr (druga sekcja potencjometru od ograniczenia prądowego) a napięcie z jego suwaka podaj na ADC3.
4. dodaj w programie odczyt ADC3 i wyświetl na LCD wynik pomiaru
5. ustaw kilka wartości prądu ograniczenia, zewrzyj wyjście zasilacza i wyznacz funkcję wiążącą prąd zmierzony wejściem ADC1 (w stanie zwarcia) z wynikiem pomiaru na ADC3.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 16 cze 2010, o 15:05

Dziękuję za odpowiedź. Czy Kolega mógłby mi bardziej wyoślić podłączenie tego potencjometru? Czy trzeba usunąć kondensator łączący Vref z masą? W ogóle nie znam się na pisaniu programów i nie ma szans abym sam dopisał coś do istniejącego wsadu . Poza tym nie wiem czy coś się tam jeszcze zmieści bo obecny wsad zajmuje prawie całą pamięć.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 cze 2010, o 15:30

podłączenie tego potencjometru?
Skrajne końce do masy i AVCC, suwak do ADC3.
Czy trzeba usunąć kondensator łączący Vref z masą?
Nie.
W ogóle nie znam się na pisaniu programów i nie ma szans abym sam dopisał coś do istniejącego wsadu .
To jak zamierzałeś to zrobić?
Poza tym nie wiem czy coś się tam jeszcze zmieści bo obecny wsad zajmuje prawie całą pamięć.
ATmega168.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 16 cze 2010, o 17:02

Tzn. nie wiem jakie komendy dopisać. Być może że proszę o zbyt wiele ale czy kolega mógłby napisać ten fragment tyczący się odczytu ADC3 i tej funkcji, czy nie można zmniejszyć objętości obecnego wsadu ? dopiero co kupiłem nową ATmegę8

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 cze 2010, o 18:52

[...]czy nie można zmniejszyć objętości obecnego wsadu ?
Nie wiem. W pewnym stopniu zależy to nawet od ustawień kompilatora. Najlepiej jeśli dodatkowe rzeczy dopisuje ten, kto to później kompiluje i uruchamia.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 16 cze 2010, o 19:29

Czy do zrealizowania odczytu wejścia ADC3 można by było użyć części kodu od pomiaru napięcia lub prądu???

Jeśli byś mógł to proszę napisz krok po kroku jak trzeba się do pisania tego zabrać...bo część definicji znam tylko mam problem co z czym połączyć aby żądany efekt otrzymać :/

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 16 cze 2010, o 19:45

Jaki masz kompilator C na AVR?

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 16 cze 2010, o 21:29

Korzystam z AVR studio 4 z AVR-GCC

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 17 cze 2010, o 09:15

Nigdy nie miałem okazji z tego korzystać, ale coś mi się wydaje, że ten program nie podda się łatwo temu kompilatorowi. Jeśli uda się go skompilować, to powiel taki fragment:

Kod: Zaznacz cały

temperatura = 0; ADC_temp = 0; ADC_temp_sr = 0; Uin = 0; //prad = 0; // pomiar wartosci ADC1 ADMUX |= _BV(PC0); for(i = 0 ; i < 20 ; i++) { ADCSRA|= _BV(ADSC); //start pojedynczej konwersji while(bit_is_set(ADCSRA,ADSC)){}; ADC_L = ADCL; ADC_H = ADCH; ADC_temp = ADC_H*256+ADC_L; ADC_temp_sr = ADC_temp_sr + ADC_temp; if(i==19) { ADC_temp = ADC_temp_sr/20; Uin = (Uref/1024)*ADC_temp; prad = Uin/Rpom; prad_int = prad; prad_float = (prad*1000)-(prad_int*1000); } }
z nowymi zmiennymi i dodaj wyświetlanie wyniku.
Poza tym zmień Vref dla ADC.

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 17 cze 2010, o 10:03

bez problemu moge stworzyć hex'a z tym nie mam problemu...Vref jak podciągnę AVCC to mam tą wartość tam zmienić???czy zamiast Vref wpisać AVCC ??

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 17 cze 2010, o 10:44

Tak, stałą Uref trzeba zmienić na 5.00, ale lepiej zmierzyć to napięcie i wpisać rzeczywistą wartość.
A tak przy okazji skąd się wzięła wartość 2.65?

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 17 cze 2010, o 10:55

aha...już rozumiem ;) taka jest wartość tego napięcie między 21 nóżką atmegi a masą

Faber33
-
-
Posty: 98
Rejestracja: 14 cze 2010, o 18:38
Lokalizacja: Warszawa

Postautor: Faber33 » 17 cze 2010, o 12:28

Czy nie trzeba zmienić rejestru ADMUX aby zmienić napięcie ref. na zewnętrzne ? bo przy obecnych ustawieniach jest wykorzystywane Uref wewnętrzne

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 52 gości