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

[Atmega8 ][c] problem z PWM

robert_sk 17 Sie 2010 22:33 1648 5
  • #1 8409489
    robert_sk
    Poziom 11  
    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;
    #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ę .
  • #2 8409874
    Konto nie istnieje
    Konto nie istnieje  
  • #3 8410167
    tmf
    VIP Zasłużony dla elektroda
    Na pocżątek standard - nie pokazałeś całego programu. Po drugie - czy zmienne globalne wykorzystywane w przerwaniach i poza nimi są volatile? Po trzecie twoja obsługa przerwań jest do kitu - w jednym robisz kilka konwersji ADC, co trwa długo i kłóci się z ogólną ideą, że procedura obsługi przerwania powinna być jak najkrótsza.

    Dodano po 2 [minuty]:

    I kolejna rzecz - wywal tą swoją funkcję poczekaj i wstaw coś z delay.h. Jeśli robisz własne opóżnienia to musisz zadbać, żeby optymalizator ci tego nie wywalił - tu znowu kłania się volatile.
  • #4 8410408
    robert_sk
    Poziom 11  
    Pomiar zaczyna pulsować . Troszkę za dużo wrzuciłem programu . Wystarczyło przerwanie od licznika PWM . Jeżeli chodzi o długość przerwania to może błędnie myślałem , że lepiej jedno dłuższe niż kilka krótszych . Spróbuje zastosować przerwanie od przetwornika ac .Ile pomiarów najlepiej zrobić i jak rozwiązać rzutowanie zmiennych int na char ? Na początku chciałem przez "unie" ale coś mi nie wyszło .
     typedef union 
    {
     unsigned int zmienna_int;
    unsigned char zmienna_char[2];
    } unia_moja; 
    
    
    ISR (TIMER1_OVF_vect)
    { OCR1A = bufor_OCR1A ;
      volatile unsigned char a , b;
       volatile  unia_moja c ,c1;
      c.zmienna_int = 0 ;
            a=30 ;
            ADMUX |= _BV(MUX0)| _BV(MUX1) ;
    		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"
    				c.zmienna_int +=  b ;			 // Sumowanie wyników pomiarów dokonywanych w serii
    				a--;
                }
    		c.zmienna_int = c.zmienna_int / 75 ;	
    		prad_z_aktualny = c.zmienna_char[1] ;	
    	    if(prad_z_aktualny > 70)OCR1A = 0 ;
             ADMUX &= ~ _BV(MUX1) ; 
            a = 30;
    		c.zmienna_int = 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"
    				c.zmienna_int +=  b ;			 // Sumowanie wyników pomiarów dokonywanych w serii
    				a--;
                }
            ADMUX &= ~ _BV(MUX0);
            a = 30 ;
    		c1.zmienna_int = 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"
    				c1.zmienna_int +=  b ;			 // Sumowanie wyników pomiarów dokonywanych w serii
    				a--;
                }
           napiecie_z_aktualne = ((c.zmienna_char[1] - c1.zmienna_char[1])/30);
    	
    
    
     
    Średnia pomiarów będzie w zmiennej typu int a do wyświetlenia typu char. I jeszcze jedno pytanie odnośnie podłączenia nie używanych końcówek wzmacniacza . Czy nie zostawić ich"pływających"?
  • #5 8410508
    tmf
    VIP Zasłużony dla elektroda
    Typu int nie da się sensownie rzutować na typ char - int ma 16 bitów, a char tylko 8. Więc coś jakby nie pasi. Jak się domyślam ty chcesz wyświetlić na LCD wartość zmiennej int - w tym celu posłuż się itoa.
  • #6 9353195
    robert_sk
    Poziom 11  
    Witam
    Udało mi się rozwiązać problem . Układ działa poprawnie . Może komuś się przyda
    moje rozwiązanie ?
    ISR   (  ADC_vect)    
    { volatile static unsigned char adc_a ;
     adc_a ++ ;
     if(adc_a == 2)
     {tab_prad [ adc_b ] = ADCH ;
        adc_b ++ ;
        if(adc_b >3) adc_b = 0 ; 
    	ADMUX |= _BV(MUX0) ;
      }
      if( adc_a >3) 
       { tab_nap [adc_b1 ] = ADCH ;
         adc_b1 ++ ;
         if(adc_b1 >3) adc_b1 = 0 ; 
       	 ADMUX &= ~ _BV(MUX0);
    	 adc_a =0 ; 
    	 } 
    	if(prad_z_aktualny < 3) prad_z_aktualny = 0 ;
    	if(prad_z_aktualny > 150) praca = 0 ;
    	
     }
    ISR (TIMER1_OVF_vect,ISR_NOBLOCK)
     { volatile  unsigned char a , b,d ;
       volatile  unsigned int c ;
       a = b = c = 0 ;
       for (d = 0;d < 4 ; d ++  )  {c  += tab_prad [ a];a++ ;}
       prad_z_aktualny = (c / 8); 
       c = 0 ;                                              
       for (d = 0;d< 4;d ++  )  {c  += tab_nap [ b];b++ ;}
       napiecie_z_aktualne = (c  / 3.5) ;
          OCR1A = bufor_OCR1A ;
      if(praca)
       { if((napiecie_z_aktualne > napiecie_z_ustawione)||(prad_z_aktualny > prad_z_ustawiony))
          {bufor_OCR1A -- ;
             if ( bufor_OCR1A == 0) bufor_OCR1A = 1;
    	  }
    	 else{ bufor_OCR1A ++ ;
             if ( bufor_OCR1A > 1022) bufor_OCR1A = 1023;
    	     } 
         } 
    	
       else OCR1A = 0 ;
      } 


    adc_a -- zmienna określająca jaki pomiar
    tab_prad [ ] -- tab_nap [ ] -- tablica do obliczania średniej pomiaru
    Pomiar jest wykonywany w przerwaniach.
    W przerwaniu ISR (TIMER1_OVF_vect,ISR_NOBLOCK) jest obliczana wartość prądu , napięcia i OCR1A ,
REKLAMA