Tag 3 Timer, ADC und PWM 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 1
Analog-Digital-Wandler Arbeitet durch schrittweise Näherung Aktivieren des ADCs durch ADC Enable (ADEN) in ADCSRA Eingang gemultiplext Alle Pins der Ports A und F können als Eingang verwendet werden Auswahl durch MUX-Bits in den Registern ADMUX und ADCSRB Differentieller Eingang möglich Differenz zwischen zwei Eingangssignalen wird digitalisiert Eingangsverstärkung einstellbar (1x/10x/200x) Im folgenden jedoch nur normaler Single Ended Input -Modus Zwei Betriebsarten Single Conversion Mode Free Running Mode 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 2
Analog-Digital-Wandler 10-bittiges Ergebnis wird abgelegt in den ADC Data Registers (ADCH und ADCL) ADC= V in 2 10 V ref Ergebnis kann auch linksbündig in diese Register geschrieben werden ( ADC Left Adjust Result -Bit ADLAR==1 in ADMUX) Wenn 8 Bit Genauigkeit ausreicht, genügt das Auslesen von ADCH Immer ADCL vor ADCH lesen, sonst gehören die Werte möglicherweise nicht zur gleichen Wandlung! ADCH zügig nach ADCL auslesen, sonst bleiben die Register gesperrt und es werden evtl. Wandlungsergebnisse verworfen! Die avr-libc bietet auch das Pseudo-16-Bit-Register ADC an (Achtung: Zugriffe sind trotzdem nicht atomar sondern werden automatisch in 8-Bit- Zugriffe umgesetzt!) 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 3
Analog-Digital-Wandler Start der Wandlung im Single Conversion Mode: ADC Start Conversion Bit (ADSC) setzen Bleibt gesetzt solange Wandlung läuft ADC kann Interrupt auslösen wenn Wandlung abgeschlossen Dazu muss das ADC Interrupt Enable-Bit (ADCIE) im ADC Control and Status Register A (ADCSRA) gesetzt sein Automatische Triggerung kann mit ADC Auto Trigger Enable Bit (ADATE in ADCSRA) aktiviert werden Trigger Quelle einstellen mit ADC Trigger Select Bits (ADTS in ADCSRB) Positive Flanke der Triggerquelle startet Wandlung Ist ADC Interrupt Flag als Trigger Quelle ausgewählt, wird sofort nach Beenden der Wandlung eine neue gestartet (Free Running Mode) 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 4
Analog-Digital-Wandler Timing im Single Conversion Mode: Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 5
Analog-Digital-Wandler Timing im Auto Triggered Conversion Mode: Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 6
Analog-Digital-Wandler Taktverhältnis zwischen CPU-Takt und ADC-Takt ist einstellbar mittels ADC Prescaler Select Bits (ADPS0...ADPS2) im ADC Control and Status Register A (ADCSRA) Tabelle: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 7
Analog-Digital-Wandler Programmcode: /* Potentiometer 3 is connected to PF0 which is on ADC channel 0 */ DDRF &= ~(1 << PF0); /* input direction */ PORTF &= ~(1 << PF0); /* switch off internal pull-ups */ ADCSRA = (1 << ADEN); /* ADC Enable=1 */ ADMUX = 0; /* set ADC input channel, ADC */ ADMUX = (1 << REFS0); /* set ref. voltage to VCC */ /* init prescaler (ADC clock=125khz) */ ADCSRA = (1 << ADPS2) (1 << ADPS1) (1 << ADPS0); ADCSRA &= ~(1 << ADATE); /* Single Conversion Mode */ _delay_us(125); /* wait for reference voltage to stabilize */ ADCSRA = (1 << ADSC); /* Start Conversion=1 */ while (ADCSRA & (1 << ADSC)) ; /* wait for conversion to finish */ result = ADC; /* read value */ 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 8
Timer/Counter Timer und Counter unterscheiden sich im Wesentlichen durch die Quelle des Zählsignals Beim Timer: periodisches Taktsignal Beim Counter: meist nicht-periodisches Signal Beides mit einer Schaltung realisierbar (konfigurierbares Verhalten) Der ATmega640 hat 6 Timer/Counter Zwei 8-Bit-Timer mit PWM-Funktion (Timer 0 und 2) Vier 16-Bit-Timer (Timer 1, 3, 4 und 5) Im Folgenden wird Timer/Counter0 beschrieben 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 9
Timer/Counter0 Wichtigste Elemente eines Timers/Counters: Zählregister (Timer Counter, TCNT0) Vorteiler um einen Timer-Takt aus dem CPU-Takt abzuleiten (Prescaler) Möglichkeit den Zählerstand mit einem vorgegebenen Wert zu vergleichen (Output Compare Registers) Oft sogar mehrfach vorhanden (OCR0A, OCR0B) Ein Compare Match kann einen Interrupt auslösen und/oder zum Reset des Counters führen 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 10
Timer/Counter0 Nomenklatur: Max - größter Wert, den der Counter annehmen kann (0xFF) Bottom - kleinster Wert, den der Counter annehmen kann (0x00) Top - größter Wert, der beim Zählen erreicht wird (je nach Betriebsmodus 0xFF oder OCR0A) 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 11
Timer/Counter0 Timer/Counter Register Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 12
Timer/Counter0 Output Compare Registers Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 13
Timer/Counter0 Compare Match Interrupt Requests Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 14
Timer/Counter0 Betriebsmodi: Normal Mode (WGM02:0 == 0) Counter Register wird hochgezählt Kein Löschen des Counter Registers sondern nur Überlauf Clear Timer on Compare Match (WGM02:0 == 2) OCR0A enthält den Wert bei dem gelöscht wird Ausgang OC0A kann bei jedem Compare Match umgeschaltet werden (Toggle Mode, COM0A1:0 == 1) f f OCnx = clk 2 N 1 OCRnx Fast-PWM Mode Phase Correct PWM Mode 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 15
Pulsweitenmodulation (PWM) Problem: Wie kann man nur mit Digitalausgängen die Helligkeit einer LED/die Drehzahl eines Motors ändern? Lösung: Periodisches Ein- und Ausschalten eines Digitalausgangs, zeitliche Mittelung über das Ausgangssignal (passiert bei hinreichender Schaltfrequenz automatisch) Abbildung: http://en.wikipedia.org/wiki/file:duty_cycle_general.png 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 16
Pulsweitenmodulation (PWM) Pulsbreite bestimmt mittlere Ausgangsspannung: Abbildung: http://en.wikipedia.org/wiki/file:pwm.png 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 17
Fast-PWM Mode Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 18
Phase Correct PWM Mode Abbildung: Datenblatt ATmega640 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 19
Fast-PWM Mode Programmcode: // PWM output is Port G Pin 5 DDRG = (1 << DDG5); // output direction TCCR0A = (1 << WGM02) (1 << WGM01) (1 << WGM00); // Fast-PWM Mode TCCR0A = (1 << COM0B1) (0 << COM0B0); // non-inverting PWM TCCR0B = (1 << CS02); // init prescaler while(1) { // percentage =...; } // Set PWM output compare value (regulates duty cycle) OCR0B = 2.55 * percentage; 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 20
Aufgaben Analogsignal vom Poti kontinuierlich digitalisieren und mit den LEDs anzeigen Timer in Hardware programmieren (Interrupt auslösen!) PWM in Software programmieren PWM in Hardware realisieren Signal des Photo-Sensors zum Dimmen der Hintergrundbeleuchtung des LC-Displays verwenden 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 21