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

atmega32, problem z przetwornikiem na kwarcu 14,745MHz

qudi 05 Kwi 2010 17:45 1436 9
  • #1 7923538
    qudi
    Poziom 15  
    Witam !!!
    Założę nowy temat z tego względu, że problem jest już trochę inny, niż ten poruszany w " ustawienie rejestrow w timerze 1"

    
    ISR(TIMER1_COMPA_vect)           // przerwanie dla porownania
    {
    PORTC ^= 0x01;                 // zapalic/zgasic diode
    OCR1A=1440;
    //OCR1A=14745000/(512*(0.0185*ADC + 0.9814));
    }
    
    int main(void) {
    
    DDRC |= 0x01;
    
    // INICJALIZACJA PRZETWORNIKA
    
    ADMUX = (1<<REFS0);
    ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE);
    
    // INICJALIZACJA LICZNIKA 1
    
    TCNT1 = 0x0000;                       // wartosc poczatkowa
       
    TCCR1A = 0x0000;                    // OC1A/OC1B odlaczone
    TCCR1B |= (1 << WGM12);
    
    TCCR1B |= (1 << CS12);
    
    TIMSK |=(1<<OCIE1A);                                 // i porownania licznika T1
                            
    sei();                             // zezwolenie na przerwania
    
    while(1){}
    
    return(0);
    } 
    


    Chciałbym sterować wartością OCR1A poprzez zmianę wartości ADC,
    
    OCR1A=14745000/(512*(0.0185*ADC + 0.9814)); 
    

    Jednak program działa tylko wtedy kiedy wpiszę twardo wartość np. OCR1A =1440. Gdy chcę sterować poprzez ADC, wydaję mi się że uC pobiera zawsze (niezależnie od ustawienia potencjometru) wartość 1023 i później nie można jej już zmienić, a przecież chciałbym ją sterować. Działam na kwarcu 14,745 MHz i takim oto ustawieniu fuse bitów:
    low 7F
    high 48
    Czym może być spowodowana takie coś ? Dodam że mam też podobny program, gdzie także mam takie samo sterowanie ADC(w przerwaniu) i tam wszystko działa ale tam nie działam na zew. kwarcu lecz na wew zegarze. Więc może to przez te fuse bity? Serdecznie proszę o pomoc...

    Proszę poprawić temat, tak aby był zgodny z regulaminem.
    Robak
  • Pomocny post
    #2 7923633
    BoskiDialer
    Poziom 34  
    Sprawdź jak będzie się zachowywał program, gdy obliczenia będą całkowitoliczbowe:
    OCR1A=1556693UL/(ADC + 53);


    Sprawdź również, czy ADC nie jest taktowany zegarem o zbyt dużej częstotliwości: dozwolone maksymalne 1MHz[adc], minimalny dzielnik to /2, więc do 2MHz[cpu] nie trzeba dbać o prescaler (ale jakość pomiarów będzie porażająca). Jednak dla zegara 14,745MHz[cpu] wypadało by wpisać co najmniej /16 (ADCSRA: bit ADPS2) lub /32 (ADPS2 i ADPS0). Dla maksymalnej rozdzielczości (200kHz[adc]) należało by ustawić dzielnik /73, ale takiego nie ma, więc masz do dyspozycji jeszcze /64 oraz /128.
  • #3 7926503
    qudi
    Poziom 15  
    Rzeczywiście należało zastosować preskaler w przetworniku, dałem /64 i działa ładnie lecz nie rozumiem czemu wraz ze wzrostem wartości ADC (co zostało sprawdzone) wartość częstotliwości mi też rośnie stosując takie np. równanie:
    
    OCR1A = 28*ADC;
    


    zostało to sprawdzone też na innych równaniach w while oraz w przerwaniach i wszędzie wartość ADC jest jak gdyby odwracana ale tylko w równaniach bo jak sprawdzam wartość ADC tak jak poniżej, na diodach (zapalone pokazują wartość ADC)

    
    PORTD = ADC;
    

    to widać że ADC ma inną wartośćniż ta brana do równania(tak mi sie wydaje)... nie wiem dlaczego tak się dzieje

    Proszę o wyjaśnienie
  • #4 7940767
    qudi
    Poziom 15  
    nikt nie wie co to może być ?
  • #5 7940831
    Dexter77
    Poziom 28  
    Moze przyczyna calego zamieszania jest flaga ADLAR z rejestru ADCMUX?
  • #6 7940876
    qudi
    Poziom 15  
    więc proponujesz dać jej jakąś stałą wartość ? tzn zeby czytał od prawej ?
  • #7 7941002
    Dexter77
    Poziom 28  
    Tak naprawde to nie wiadomo jaka wartosc uzyskuje zmienna ADC. Jaki typ to jest dla kompilatora? Standardowo flaga ADLAR=0. Przetwornik jest 10 bitowy. Wartosc ADC sklada sie z dwoch bajtow. Przy ADLAR=0 mlodszy bajt przy ciagnieciu suwaka "przewinie sie" 4 razy. Jezeli dla kompilatora zmienna ADC jest typu char to wlasnie bedzie zrodlo innych odczytow niz pozycja suwaka. Pozatym wlaczasz autotriggering. A zrodlo ustawiasz? Nie widze zebys gdzies modyfikowal rejestr SFIOR.
  • #8 7941091
    qudi
    Poziom 15  
    No nie ingeruje w niego a powinienem ? Nie jestem ekspertem więc się aż tak nie znam na tych wszystkich rejestrach choć staram się czytać datasheet'a... Co do typu ADC to także nie wiem jaki on jest ale zawsze myślałem, że int...
  • #9 7941124
    Dexter77
    Poziom 28  
    Na jakiejs podstawie ustawiles bit ADATE. A w dokumentacji jest napisane:
    Bit 5 – ADATE: ADC Auto Trigger Enable
    When this bit is written to one, Auto Triggering of the ADC is enabled. The ADC will start a conversion on a positive edge of the selected trigger signal. The trigger source is selected by setting the ADC Trigger Select bits, ADTS in SFIOR.

    Tak wiec naprawde to nie wiadomo na jakiej podstawie startuje ADC (w przykladzie ktory przytoczyles)
  • #10 7941574
    qudi
    Poziom 15  
    ADTS są ustawione na 0 więc w trybie free runing. ADATE pozawala na auto-wyzwalanie... nie znam się na tym dobrze więc nie wiem w czym tkwi problem...

    Temat w dalszym ciągu należy poprawić!
    Robak
REKLAMA