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

Atmega 8 - PWM sterowany z ADC + zmiana zakresu przetwornika

opcja71 24 Sty 2011 20:31 1903 2
REKLAMA
  • #1 9051883
    opcja71
    Poziom 1  
    Witam. Realizuje sterownik prędkości obrotów wiatraka w funkcji temperatury. Wykorzystuje lm 35 (0-100st) oraz do sterowanie wiatrakem PWM + BUZ10. Sterownik działa, ale chciałbym miec 3 zakresy tj. 100st, 50st, 25st ( dla tych wartosci temperatury maxymalne obroty wiatraka - czyli pwm maxymalnie wypełniony)zakresy wybieram poprzez zwarcie pinów PD0 PD1 PD2 . Mam problem z zakresami 50 i 25 stopni a mianowicie dla praktycznie 0 napiecia wyplenieni jest dośc znaczne( o wiele za duże) a dla max napięcia wypełnienie nie jest ciągłe.Ponadto dioda zapala się gaśnie i zapala na krótszy czas niż za pierwszym razem- to jest jakby 1 cykl. do testów urzywam potncjomentru i diody na wyjsciu pwm. Coś nie tak z kodem... może ktoś pomóc???

    #include <avr/io.h>
    
    
    int main(){
    
    DDRB |= _BV(3);		//  PWM JAKO PORT WEJSCIOWY
    
    DDRD |= _BV(0);		//PIN 0  OUT STAN LO
    PORTD &= ~(_BV(0));
    
    DDRD &= ~(_BV(1));        //PIN 1  IN STAN HI
    PORTD |= _BV(1);
    
    DDRD &= ~(_BV(2));       //PIN 2  IN STAN HI
    PORTD |= _BV(2);
    
    
    
    //ustawienie przetwornika
    ADMUX |= (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(1<<MUX0);
    ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADPS0);
    
    // USTAWIENIE PWM
    TCCR2 |=(1<<WGM20)|(1<<COM21)|(1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20);
    
    
    
    unsigned char *WADCH;	//wskaznik do rejestru adch
    unsigned char wynik;
    	
    	
    					for(;;){	
    					
    					
    					
    					
    						if(bit_is_clear(PIND,1))
    						
    								{
    									*WADCH=&ADCH;									wynik=*WADCH;									wynik=wynik*2;									                          OCR2=wynik;						
    								};
    						
    						
    						
    						if(bit_is_clear(PIND,2))
    						
    								{
    									*WADCH=&ADCH;									wynik=*WADCH;									wynik=wynik*4;						
    									OCR2=wynik;						
    								};							
    					
    						OCR2=ADCH;  
    						
    						}
    	
    	return 0;
    	
    	}
  • REKLAMA
  • #2 9082964
    krizq1
    Poziom 10  
    Witam, również podłączam się do tematu... mam podobny kod i podobny problem... wypełnienie PWM nie zmienia sie proporcjonalnie do wartości napięcia na ADC.. chciałbym mieć wypełnienie 0% przy napięciu na ADC = 0V, a 100% przy 5V... Jeżeli ma ktoś działający, to będę bardzo wdzięczny.
    Pozdrawiam
  • #3 9083480
    Krauser
    Poziom 26  
    Obstawiam na złe ustawienie preskalera ADC, ale nie wiem jak taktowany jest mikrokontoler. Dla 1MHz dałbym podział przez 8:
    
    ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADFR) |(1<<ADPS1)|(1<<ADPS0);
    
REKLAMA