180 likes | 295 Views
Programmeren en Software Engineering 2. PROS2 Les 4. Globale variabele. We gebruiken liever geen globale variabele. Waarom eigenlijk niet? De variabele i in de ISR kan niet lokaal zijn. Waarom eigenlijk niet?
E N D
Programmeren en Software Engineering 2 PROS2 Les 4
Globale variabele • We gebruiken liever geen globale variabele. • Waarom eigenlijk niet? • De variabele i in de ISR kan niet lokaal zijn. • Waarom eigenlijk niet? • Oplossing: static lokaal (variabele wordt maar 1x aangemaakt en blijft daarna bestaan). staticScope (zichtbaarheid) = block (lokaal).Livetime = tot einde programma.
ADC Analog Digital Converter • Veel signalen in de buitenwereld zijn analoog en continue. • Veel meetsensoren leveren een analoge uitgangsspanning: • Temperatuursensor • Druksensor • Lichtsensor • Microfoon • enz... • Om deze signalen te kunnen inlezen met een µC (microcontroller) moeten ze discreet en digitaal gemaakt worden. • Veel µC’s hebben een ingebouwde ADC.
Bijv: ADC 0-3V => 2 bits Analoog Continue afkomstig van sensor Analoog Discreet na sample (1 ms) en hold 2 bits Digitaal Discreet uitgang ADC U 3 11 2 10 01 1 00 0 0 2 4 6 8 10 12 14 16 18 t (ms) 0 1 3 3 1 1 1 3 2 1 0 2 2 1 0 0 1 3 3
Bijv: ADC 0-3V => 2 bits • Omrekenen:Uin = Umax * (DIGout + ½) / (DIGmax + 1) • Kwantiseringsfout:±½ LSB = ±½ * Umax / (DIGmax + 1)
ADC • Sample frequentie: • Volgens theorie (bemonsteringstheorema van Nyquist-Shannon) 2x hoogst voorkomende frequentie in signaal. • spraak 4KHz => sample frequentie 8 KHz (telefoon => 8KHz) • muziek 20 KHz => sample frequentie 40 KHz (CD => 44,1 KHz) • oventemperatuur 10 Hz => sample frequentie 20Hz • omgevingstemperatuur 0,01Hz => sample frequentie 0,02 Hz • maximale sample frequentie is afhankelijk van de conversiesnelheid van de ADC. • AVR: fADC = 50 – 200 KHz. Conversion time (single ended, free running) = 13,5 ADC clocks. Dus max fsample = 14,8 KHz. • Signaal bewerkingen voor S&H: • Versterken of verzwakken. • Verschuiven. • Filteren (te hoge frequenties eruit = Anti-aliasing filter). • Resolutie ADC: • AVR: 10 bits
ADC eenvoudig blokschema ADEN en ADSC in ADCSRA Analoginput ADIF in ADCSRA Comparator ADC_vect interrupt PA0..PA7 Controller ADIE in ADCSRA MUX4..0 in ADMUX D/A Register ADC D/A converter 10 bits digital output
Huiswerk • Bestudeer: • AVR boek blz. 97 t/m 99 (tot program K). • AVR boek blz. 109 t/m 112 (tot program M). • Lees: • Hoofdstuk over de ADC in ATmega16 datasheets:http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf 19 pagina’s. Dit soort documentatie moet je aan het einde van het 2de jaar zelfstandig kunnen gebruiken! (Wordt volgende les uitgelegd.) • Programmeer: • Maak een programma dat de spanning op PA0 op de LCD display laat zien. Maak gebruik van de LCD display library (zie BB)!
Programmeren en Software Engineering 2 PROS2 Les 5
ADC Atmega16 • ADC gebruikt relatief veel energie daarom staat de ADC na reset uit. Aanzetten met bit ADEN(ADc ENable) in het ADCSRA(ADc Control and Status Register A) register. • Alle ingangen van poort A (PA0 t/m PA7) kunnen als single-ended ingang van de ADC gebruikt worden. Meten t.o.v. GND (GrouND) en AREF (Analog REFerence). • ADC heeft ook differential mode (wordt later besproken). • De ADC wordt bestuurd met behulp van het ADMUX(ADc MUltipleXer selection Register), ADCSRA en SFIOR(Special Function IO Register).
ADC ATmega16 • Schrijven van 1 naar ADSC(ADc Start Conversion) bit in ADCSRA start de conversie. • Flag ADIF(ADc Interrupt Flag) van ADCSRA register wordt 1 als de conversie klaar is en resultaat in ADC register (16 bits) staat. Dit bit kun je resetten door er een 1 naar toe te schrijven. • Als ADIE(ADc Interrupt Enable) bit in ADCSRA register geset is wordt een ADC_vect interrupt gegeven als ADIF geset wordt. ADIF wordt bij afhandelen van de interrupt automatisch gereset.
ADC ATmega16 • Automatisch starten van conversie (auto trigger). • Set bit ADATE(ADc Auto Trigger Enable) in ADCSRA en kies een trigger source met de bits ADTS2 (ADc Trigger Source), ADTS1 en ADTS0 in het SFIOR register. • ADC Interrupt flag ADIF => Free Running Mode (continue bemonsteren). • Timer/Counter0 Overflow TOV0 => Equidistant bemonsteren. • Timer/Counter1 Overflow TOV1 => Idem.
ADCMUX Pas op! Verkeerde waarde in REFS1 of REFS0 maakt ADC stuk!
ADCSRA • Division Factor = fclk / fADC • Voor maximale (10 bits) nauwkeurigheid: 50 KHz ≤fADC ≤ 200 KHz. Weet je het nog? ADEN = ...ADSC = ...ADATE = ...ADIF = ...ADIE = ...
Opdracht • Maak een programma dat de spanning op PA0 op de LCD display laat zien. Maak gebruik van de LCD display library (Zie BB)!
Uitwerking • Spanning als getal 0-1023. Uitleg snprintf zie BB!
Uitwerking • Spanning in Volts. Zie BB voor gebruik float met snprintf! 50