Witam
Mam problem z przetwornikiem analogowo-cyfrowym i modulacją PWM w zasilaczu mojej konstrukcji . Sam odczyt prądu i napięcia z zwartym tranzystorem jest poprawny . Ale gdy chcę stabilizować prąd i napięcie , to zaczynają się przekłamania na wyświetlaczu . Ja sam dopiero zacząłem przygodę z AVR-ami .
I mam troszkę problemów z tym układem .W załączniku jest schemat układu .
A to jest mój program;
Proszę o radę .
Mam problem z przetwornikiem analogowo-cyfrowym i modulacją PWM w zasilaczu mojej konstrukcji . Sam odczyt prądu i napięcia z zwartym tranzystorem jest poprawny . Ale gdy chcę stabilizować prąd i napięcie , to zaczynają się przekłamania na wyświetlaczu . Ja sam dopiero zacząłem przygodę z AVR-ami .
I mam troszkę problemów z tym układem .W załączniku jest schemat układu .
A to jest mój program;
#include "mojenastawy.h"
ISR (TIMER1_OVF_vect)
{ OCR1A = bufor_OCR1A ;
volatile unsigned char a , b;
a=3 ;
ADMUX |= _BV(MUX0)| _BV(MUX1) ;
prad_z_aktualny = 0 ;
while(a)
{
ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania
while(bit_is_set(ADCSRA,ADSC)) {};// Oczekiwanie na zakończenie przetwarzania
b = ADCH; // Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar"
prad_z_aktualny = prad_z_aktualny + b ; // Sumowanie wyników pomiarów dokonywanych w serii
a--;
}
prad_z_aktualny = prad_z_aktualny / 7.5 ;
if(prad_z_aktualny > 70)OCR1A = 0 ;
ADMUX &= ~ _BV(MUX1) ;
a = 3;
g_wynik_v = 0 ;
while(a)
{
ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania
while(bit_is_set(ADCSRA,ADSC)) {};// Oczekiwanie na zakończenie przetwarzania
b = ADCH; // Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar"
g_wynik_v = g_wynik_v + b ; // Sumowanie wyników pomiarów dokonywanych w serii
a--;
}
ADMUX &= ~ _BV(MUX0);
a = 3 ;
g_wynik_v1 = 0 ;
while(a)
{
ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania
while(bit_is_set(ADCSRA,ADSC)) {};// Oczekiwanie na zakończenie przetwarzania
b = ADCH; // Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar"
g_wynik_v1 = g_wynik_v1 + b ; // Sumowanie wyników pomiarów dokonywanych w serii
a--;
}
napiecie_z_aktualne = ((g_wynik_v - g_wynik_v1)/2.6);
//
if(praca)
{ if((napiecie_z_aktualne > napiecie_z_ustawione)||(prad_z_aktualny > prad_z_ustawiony))
{bufor_OCR1A -- ;
if ( bufor_OCR1A == 0xFFFF) bufor_OCR1A = 0 ;
}
else{
if((napiecie_z_aktualne < napiecie_z_ustawione) && ( prad_z_aktualny <= prad_z_ustawiony))
{bufor_OCR1A ++ ;
if ( OCR1A == 1024) OCR1A = 1023;
}
}}
else OCR1A = 0 ;
}
/************************************************************************************************
przerwanie od T2 ******************************************************************************/
ISR (TIMER2_OVF_vect, ISR_NOBLOCK)
{ TCNT2 = 21;
milisek ++ ;
if (milisek == 50 )
{milisek = 0 ;
sek ++ ;
if (sek == 60 )
{minuta1 ++ ;
minuta2 ++ ;
sek = 0 ;
}
}
if(minuta1 == 60)
{if (czas_doladowania) czas_doladowania -- ;
minuta1 = minuta2 = 0 ;
}
if (! wej1 ) //
{ if (pom1_kla < 250) pom1_kla ++ ;
if (pom1_kla >2) g_jest_przycisk1 = 1 ;
if (pom1_kla >100) licznik_p = 1;
}
else { pom1_kla = 0 ;
g_jest_przycisk1 = 0 ;
licznik_p = 0 ;
}
if (! wej2 ) //
{ if (pom2_kla < 250) pom2_kla ++ ;
if (pom2_kla >2) g_jest_przycisk2= 1 ;
}
else { pom2_kla = 0 ;
g_jest_przycisk2 = 0 ;
}
if (! wej3 ) //
{ if (pom3_kla < 250) pom3_kla ++ ;
if (pom3_kla >2) g_jest_przycisk3 = 1 ;
if ( pom3_kla > 100 )licznik_p1 = 1 ;
}
else { pom3_kla = 0 ;
g_jest_przycisk3 = 0 ;
licznik_p1 = 0 ;
}
}
void poczekaj( unsigned char zt)
{
//przybliżony przelicznik argumentu na ms
volatile unsigned int zt1;
for(;zt>0;zt--)
{
for(zt1=255;zt1!=0;zt1--) ;
}
}
/////////////////////////////////////////
int main (void)//
{ DDRC = 0x00 ;
DDRD = 0xfc ;
TCNT2 = 100; // wartość początkowa T/C0
TCCR2 = _BV(CS20)|_BV(CS21)|_BV(CS22); // preskaler ck/1024
TIMSK = _BV(TOIE2)|_BV(TOIE1);
// Wybranie wewnętrznego żródła napięcia odniesienia
ADMUX |= _BV(REFS0)|_BV(ADLAR) | _BV(REFS1);
DDRB |= _BV(PB1);
TCCR1A = 0x83 ;
TCCR1B = _BV(CS11)|_BV(CS10);
TCNT1L = 0x00 ;TCNT1H = 0x00 ;
// Zezwolenie na konwersję
ADCSRA |= _BV(ADPS2) |_BV(ADPS0) |_BV(ADEN);
sei() ;
while(sek<2);
volatile unsigned char a = 0;
/////////////////////dane do wyświetlacza
//inicjalizacja wyświetlacza
for(a=0 ;a<3;a++)
{lcd_rs = 0 ;
PORTD=(PORTD&0x0f)|0x30;
poczekaj( 10);
lcd_e=0;
poczekaj( 100);
}lcd_rs = 0 ;
lcd_e=1;
PORTD=(PORTD&0x0f)|0x20;
poczekaj( 10);
lcd_e=0;
poczekaj( 255);
piszilcd(0x28) ;
piszilcd(0x08) ;
piszilcd(0x01) ;
poczekaj( 110);
piszilcd(0x06) ;
piszilcd(0x0C) ;
dss:czysclcd() ;
pisztekst_p ((prog_char *)PSTR ("ZASILACZ "));
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("PROSTOWNIK "));
while(! g_jest_przycisk2)
ds:
{
if (g_jest_przycisk1)
{lcdyx(0, 16) ;
g_zasilacz_pom = 1 ;
g_prostownik_pom = 0;
wadliwe_ustawianie = 0 ;
piszznak (0x2A);
lcdyx(1, 16) ;
piszznak (0x20);
}
if (g_jest_przycisk3)
{lcdyx(1, 16) ;
g_zasilacz_pom = 0 ;
g_prostownik_pom = 1;
wadliwe_ustawianie = 0 ;
piszznak (0x2A);
lcdyx(0, 16) ;
piszznak(0x20);
}
}
if( !g_zasilacz_pom && (!g_prostownik_pom ))
{ czysclcd() ;
wadliwe_ustawianie = 1 ;
pisztekst_p ((prog_char *)PSTR ("WADLIWE USTAWIENIE"));
}
while ( g_jest_przycisk2 && wadliwe_ustawianie) ;
while ( wadliwe_ustawianie)
{
if (g_jest_przycisk2 )
{czysclcd();
pisztekst_p ((prog_char *)PSTR ("ZASILACZ "));
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("PROSTOWNIK "));
goto ds ;
}
}
while (1)
{
if(g_jest_przycisk1 && g_jest_przycisk3 )
{goto dss ;
asm("nop");
}
// ustawiam prad zasilacza
if(g_jest_przycisk2 && g_zasilacz_pom)
{ praca = 0 ;
czysclcd() ;
pisztekst_p ((prog_char *)PSTR ("USTAW PRAD"));
lcdyx(0, 14) ;
pisztekst_p ((prog_char *)PSTR ("0.0"));
lcdyx(0, 19) ;
pisztekst_p ((prog_char *)PSTR ("A"));
bit_bez_przec = 0 ;
while (g_jest_przycisk2);
while (!g_jest_przycisk2)
{while(g_jest_przycisk1)
{ prad_z_ustawiony ++ ;
lcdyx(0, 14) ;
if(prad_z_ustawiony > 60) prad_z_ustawiony = 1;
BcdWyswietl (prad_z_ustawiony) ;
if (licznik_p) poczekaj(50);
else {while( g_jest_przycisk1 &&(!licznik_p)) ;}
}
while (g_jest_przycisk3)
{ if(!prad_z_ustawiony ) prad_z_ustawiony = 60 ;
lcdyx(0, 14) ;
if(!prad_z_ustawiony ) prad_z_ustawiony = 60 ;
prad_z_ustawiony -- ;
BcdWyswietl (prad_z_ustawiony) ;
if(licznik_p1 ) poczekaj(50);
else { while (g_jest_przycisk3 && (!licznik_p1 )) ;}
}
}
//ustawiam napiecie zasilacza
while (g_jest_przycisk2);
lcdyx(1, 3) ;
pisztekst_p ((prog_char *)PSTR ("NAPIECIE"));
lcdyx(1, 14) ;
pisztekst_p ((prog_char *)PSTR ("0.0"));
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR ("V"));
bit_bez_przec = 0 ;
while (g_jest_przycisk2) ;
while (!g_jest_przycisk2)
{if (g_jest_przycisk1)
{ napiecie_z_ustawione ++ ;
if(napiecie_z_ustawione > 170) napiecie_z_ustawione = 1 ;
if (napiecie_z_ustawione > 100)lcdyx(1, 13) ;
else
{ lcdyx(1, 13) ;
piszdlcd(0x20);
lcdyx(1, 14) ;
}
BcdWyswietl (napiecie_z_ustawione) ;
if (licznik_p) poczekaj(50) ;
else {asm ("nop") ;while( g_jest_przycisk1 && (!licznik_p )) ; }
}
if (g_jest_przycisk3)
{ if(napiecie_z_ustawione == 0) napiecie_z_ustawione = 170 ;
napiecie_z_ustawione --;
if (napiecie_z_ustawione > 100)lcdyx(1, 13) ;
else
{ lcdyx(1, 13) ;
piszdlcd(0x20);
lcdyx(1, 14) ;
}
BcdWyswietl (napiecie_z_ustawione) ;
if(licznik_p1 ) poczekaj(50) ;
else {asm ("nop") ; while (g_jest_przycisk3 && (!licznik_p1)) ; }
}
}czysclcd() ;
}
// ustawiam prad prostownika
if(g_jest_przycisk2 && g_prostownik_pom)
{czysclcd() ;bit_bez_przec = 0 ;praca = 0 ;
pisztekst_p ((prog_char *)PSTR ("USTAW PRAD"));
lcdyx(0, 14) ;
pisztekst_p ((prog_char *)PSTR ("0.0"));
lcdyx(0, 19) ;
pisztekst_p ((prog_char *)PSTR ("A"));
while (g_jest_przycisk2);
while (!g_jest_przycisk2)
{while(g_jest_przycisk1)
{ prad_z_ustawiony ++ ;
lcdyx(0, 14) ;
if(prad_z_ustawiony > 60) prad_z_ustawiony = 1;
BcdWyswietl (prad_z_ustawiony) ;
if (licznik_p) poczekaj(50);
else{ asm ("nop") ;while( g_jest_przycisk1 && (!licznik_p)) ;}
}
while (g_jest_przycisk3)
{ if(!prad_z_ustawiony ) prad_z_ustawiony = 60 ;
lcdyx(0, 14) ;
if(!prad_z_ustawiony ) prad_z_ustawiony = 60 ;
prad_z_ustawiony -- ;
BcdWyswietl (prad_z_ustawiony) ;
if(licznik_p1 ) poczekaj(50);
else {asm ("nop") ; while (g_jest_przycisk3 && (!licznik_p1)) ;}
}
}
napiecie_z_ustawione = 144 ;// podstawowe napiecie ładowania 14,4 V
czysclcd() ;
czas_doladowania = 1;
pisztekst_p ((prog_char *)PSTR ("CZAS LADOWANIA"));
lcdyx(1, 3) ;
pisztekst_p ((prog_char *)PSTR ("01"));
lcdyx(1, 7) ;
pisztekst_p ((prog_char *)PSTR ("h"));
bit_bez_przec = 1 ;
while (g_jest_przycisk2);
while (!g_jest_przycisk2)
{while(g_jest_przycisk1)
{ czas_doladowania ++ ;
lcdyx(1, 3) ;
if( czas_doladowania > 12) czas_doladowania = 1;
BcdWyswietl ( czas_doladowania) ;
if (licznik_p) poczekaj(50);
else { asm ("nop") ;while( g_jest_przycisk1 && (!licznik_p )) ;}
}
while(g_jest_przycisk3)
{ lcdyx(1, 3) ;
if( czas_doladowania == 0) czas_doladowania = 12;
czas_doladowania -- ;
BcdWyswietl ( czas_doladowania) ;
if(licznik_p1 )poczekaj(50);
else {asm ("nop") ; while (g_jest_przycisk3 && (!licznik_p1)) ;}
}
}
czysclcd() ;bit_bez_przec = 0 ;
pisztekst_p ((prog_char *)PSTR ("NAPIECIE DOLADOWANIA"));
lcdyx(1, 3) ;
pisztekst_p ((prog_char *)PSTR ("0.0"));
lcdyx(1, 7) ;
pisztekst_p ((prog_char *)PSTR ("V"));
while (g_jest_przycisk2);
while (!g_jest_przycisk2)
{while(g_jest_przycisk1)
{ nap_doladowania ++ ;
lcdyx(1, 3) ;
if( nap_doladowania > 20) nap_doladowania = 0;
BcdWyswietl ( nap_doladowania ) ;
if (licznik_p) poczekaj(50);
else {asm ("nop") ;while( g_jest_przycisk1 &&(!licznik_p)) ;}
}
} napiecie_z_ustawione = napiecie_z_ustawione + nap_doladowania;
czysclcd() ;
}
/****************************************************************************************
Koniec ustawiania **********************************************************************/
if ( g_zasilacz_pom )
{ pisztekst_p ((prog_char *)PSTR ("PRAD"));
lcdyx(0, 14) ;bit_bez_przec = 0 ;praca = 1 ;
BcdWyswietl ( prad_z_aktualny ) ;
lcdyx(0, 19) ;
pisztekst_p ((prog_char *)PSTR ("A"));
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("NAPIECIE"));
lcdyx(1, 14) ;
BcdWyswietl ( napiecie_z_aktualne) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR ("V"));
}
if( g_prostownik_pom )
{ pisztekst_p ((prog_char *)PSTR ("PRAD"));
lcdyx(0, 14) ;bit_bez_przec = 0 ;praca = 1 ;
BcdWyswietl ( prad_z_aktualny ) ;
lcdyx(0, 19) ;
pisztekst_p ((prog_char *)PSTR ("A"));
switch (sek)
{case 0:
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("POZOSTALO "));
lcdyx(1, 16) ;
bit_bez_przec = 1 ;
BcdWyswietl ( czas_doladowania) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR (" h"));
break ;
case 18:
if(nap_doladowania)
{lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("NAP DOLADOWANIA"));
bit_bez_przec = 0 ;
lcdyx(1, 16) ;
bit_bez_przec = 0 ;
BcdWyswietl ( nap_doladowania ) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR ("V"));
}
else break ;
case 22:
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("POZOSTALO "));
lcdyx(1, 16) ;
bit_bez_przec = 1 ;
BcdWyswietl ( czas_doladowania) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR (" h"));
break ;
case 38:
if(nap_doladowania)
{lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("NAP DOLADOWANIA"));
bit_bez_przec = 0 ;
lcdyx(1, 16) ;
bit_bez_przec = 0 ;
BcdWyswietl ( nap_doladowania ) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR ("V"));
}
else break ;
case 42:
lcdyx(1, 0) ;
pisztekst_p ((prog_char *)PSTR ("POZOSTALO "));
lcdyx(1, 16) ;
bit_bez_przec = 1 ;
BcdWyswietl ( czas_doladowania) ;
lcdyx(1, 19) ;
pisztekst_p ((prog_char *)PSTR (" h"));
break ;
} }
}
}
Proszę o radę .
