Skip to content

Commit 02074da

Browse files
committed
Add examples in L14
1 parent 1f9c874 commit 02074da

6 files changed

Lines changed: 109 additions & 21 deletions

File tree

14_ADC.md

Lines changed: 109 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ narrator: Deutsch Female
99
import: https://raw.githubusercontent.com/liascript-templates/plantUML/master/README.md
1010
https://github.com/LiaTemplates/Pyodide
1111
12+
script: https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js
13+
link: https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css
14+
link: https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css
15+
1216
mark: <span style="background-color: @0;
1317
display: flex;
1418
width: calc(100% + 32px);
@@ -329,9 +333,6 @@ Vorteil
329333

330334
## Herausforderungen bei der Wandlung
331335

332-
333-
334-
335336
**Fehlertypen**
336337

337338
![Bild](./images/14_ADC/Fehler.png)<!-- style="width: 85%; max-width: 1000px" -->
@@ -349,9 +350,7 @@ Vorteil
349350

350351
**Referenzspannung**
351352

352-
Bereitstellung einer hinreichend stabilen Referenzspannung
353-
354-
Diode als Referenzspannung
353+
Eine Herausforderung liegt in der Stabilen Bereitstellung der Referenzspannung für den Analog-Digital-Wandler.
355354

356355
## Parameter eines Analog-Digital-Wandlers
357356

@@ -364,7 +363,7 @@ Diode als Referenzspannung
364363
+ Ausgangsinterfaces (parallele Pins, Bus)
365364
+ Temperaturabhängigkeit und Rauschverhalten (Gain, Nicht-Linearität, Offset)
366365

367-
### Umsetzung im AVR
366+
## Umsetzung im AVR
368367

369368
| Handbuch des Atmega328p | Bedeutung |
370369
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
@@ -393,15 +392,105 @@ Grundsätzlich sind 3 Modi für die Wandlung möglich:
393392

394393
[^3]: Firma Microchip, megaAVR® Data Sheet, Seite 247, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
395394

395+
![Bild](./images/14_ADC/TimeLineADC.png)<!-- style="width: 75%; max-width: 1000px" -->[^4]
396+
397+
[^4]: Firma Microchip, megaAVR® Data Sheet, Seite 250, [Link](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf)
398+
399+
**Ergebnisregister**
400+
401+
Die Atmega Prozessoren bieten eine Auflösung von 10Bit oder 8Bit für die analogen Wandlungen. Entsprechend stehen zwei Register `ADCL` und `ADCH` für die Speicherung bereit. Standardmäßig (d.h. `ADLAR == 0`) werden die niederwertigsten 8 im Register `ADCL` bereitgehalten und die zwei höherwertigsten im Register `ADCH`.
402+
403+
<!--
404+
style="width: 80%; min-width: 420px; max-width: 720px;"
405+
-->
406+
```ascii
407+
ADCH ADCL
408+
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
409+
| | | | | | | | | | | | | | | | | |
410+
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
411+
9 8 7 6 5 4 3 2 1 0
412+
```
413+
414+
Das Ergebnis ergibt sich dann zu
415+
416+
```c
417+
uint8_t theLowADC = ADCL
418+
uint16_t theTenBitResults = ADCH<<8 | theLowADC;
419+
```
420+
421+
Ist keine 10-bit Genauigkeit erforderlich, wird diese Zuordnung durch das Setzen des `ADLAR` Bits im `ADMUX` Register angepasst. Auf diese Weise kann das ADC Ergebnis direkt als 8 Bit Zahl aus `ADCH` ausgelesen werden.
422+
423+
<!--
424+
style="width: 80%; min-width: 420px; max-width: 720px;"
425+
-->
426+
```ascii
427+
ADCH ADCL
428+
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
429+
| | | | | | | | | | | | | | | | | |
430+
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
431+
9 8 7 6 5 4 3 2 1 0
432+
```
433+
434+
> **Merke: ** Immer zuerst ADCL und erst dann ADCH auslesen.
435+
436+
Beim Zugriff auf ADCL wird das ADCH Register gegenüber Veränderungen vom ADC gesperrt. Erst beim nächsten Auslesen des ADCH-Registers wird diese Sperre wieder aufgehoben. Dadurch ist sichergestellt, dass die Inhalte von ADCL und ADCH immer aus demselben Wandlungsergebnis stammen, selbst wenn der ADC im Hintergrund im Free-Conversion-Mode arbeitet.
396437

397438

398439
## Beispiele
399440

400-
**Beispiel 1 - Lesen eines Analogen Distanzsensors**
441+
**Beispiel 1 - Heißleiter**
442+
443+
NTC-Widerstände (_Negative Temperature Coefficient_) werden zur Messung der Temperatur eingesetzt. Wichtigster Kennwert eines NTCs ist der Nennwiderstand R25 bei einer Nenntemperatur von 25 °C.
444+
445+
446+
NTC-Widerstand Kennlinie
447+
40 | * (* Temperaturverlauf)
448+
| * (r 25 Grad Celsius)
449+
|
450+
|rrrrrrrrr*
451+
R in kOhm| r
452+
| r *
453+
| r *
454+
| r *
455+
| r
456+
0 +------------------------------------------
457+
0 Temperatur in Grad Celsius 100
458+
459+
460+
![Bild](./images/14_ADC/Heissleiter.png)<!-- style="width: 75%; max-width: 500px" -->
461+
462+
463+
$$
464+
\begin{aligned}
465+
\frac{R_{NTC}}{R_1} &= \frac{U_{NTC}}{U_{R1}} = \frac{U_{NTC}}{(U_{ges} - U_{NTC})} \\
466+
R_{NTC} &= R_{1} \cdot \frac{U_{NTC}}{(U_{ges} - U_{NTC})}
467+
\end{aligned}
468+
$$
469+
470+
Wenn wir davon ausgehen, dass die Referenzspannung des AD-Wandlers gleich $U_{ges}$ ist, generieren wir eine digitale Repräsentation $U_{NTC_d}$ entsprechend
471+
472+
$$
473+
U_{NTC_d} = U_{NTC} \cdot \frac{U_{ges}}{ADC_{resolution}}
474+
$$
475+
476+
Wie interpretieren wir somit einen beispielhaften Wert von `628` am Ende des Wandlungsprozesses?
477+
478+
$$
479+
U_{NTC} = U_{NTC_d} \cdot \frac{ADC_{resolution}}{U_{ges}}
480+
$$
481+
482+
Mit diesem Spannungswert können wir nun den zugrundeliegenden Widerstand berechnen und letztendlich die Temperatur.
483+
484+
**Beispiel 2 - Lesen eines Analogen Distanzsensors**
401485

402486
Für das Beispiel wird der AtMega2560 verwendet, der eine interne Referenzspannung von 2.56 V anstatt der des AtMega328 von 1.1 V bereit stellt.
403487

404-
Die Bedeutung ergibt sich beim Blick ins Datenblatt des Sensors GP2D, dessen Maximalwertausgabewert liegt bei etwa 2.5V
488+
489+
![Bild](./images/14_ADC/AtMega2560Refs.png)<!-- style="width: 75%; max-width: 1000px" -->[^5]
490+
491+
[^5]: Firma Atmel, Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V, Seite 281, [Link](https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf)
492+
493+
Die Bedeutung ergibt sich beim Blick ins Datenblatt des Sensors GP2D, dessen Maximalwertausgabewert liegt bei etwa 2.55V
405494

406495
```c
407496
#ifndef F_CPU
@@ -420,31 +509,32 @@ int readADC(int channel) {
420509
// Den ADC initialisieren und einen sog. Dummyreadout machen
421510
ADCSRA |= (1<<ADSC);
422511
while(ADCSRA & (1<<ADSC));
423-
//4 Leseoperationen
424-
for(i=0; i<4; i++) {
425-
ADCSRA |= (1<<ADSC);
426-
while(ADCSRA & (1<<ADSC)); // Auf Ergebnis warten...
427-
result += ADCW; }
512+
ADCSRA |= (1<<ADSC);
513+
while(ADCSRA & (1<<ADSC)); // Auf Ergebnis warten...
514+
// Lesen des egisters "ADCW" takes care of how to read ADCL and ADCH.
515+
result = ADCW;
428516
// ADC wieder deaktivieren
429-
ADCSRA &= ~(1<<ADEN);
430-
return result>>2;
517+
ADCSRA = 0;
518+
return result;
431519
}
432520

433521
int main(void)
434522
{
435523
Serial.begin(9600);
436524
while (1) //infinite loop
437525
{
438-
int result = readADC(0);
439-
Serial.println(result);
526+
int result_individual = readADC(0);
527+
Serial.println(result_individual);
440528
Serial.flush();
441529
_delay_ms(10); //1 second delay
442530
}
443531
return 0; // wird nie erreicht
444532
}
445533
```
446534
447-
**Beispiel 2 - Temperaturüberwachung des Controllers**
535+
> _The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result._ Handbuch Seite 252
536+
537+
**Beispiel 3 - Temperaturüberwachung des Controllers**
448538
449539
> _The temperature measurement is based on an on-chip temperature sensor that is coupled to a single ended ADC8 channel. Selecting the ADC8 channel by writing the MUX3...0 bits in ADMUX register to "1000" enables the temperature sensor. The internal 1.1V voltage reference must also be selected for the ADC voltage reference source in the temperature sensor measurement. When the temperature sensor is enabled, the ADC converter can be used in single conversion mode to measure the voltage over the temperature sensor._ Handbuch Seite 256
450540
@@ -473,8 +563,6 @@ double getTemp(void)
473563
474564
// Detect end-of-conversion
475565
while (ADCSRA & (1<<ADSC));
476-
477-
// Reading register "ADCW" takes care of how to read ADCL and ADCH.
478566
wADC = ADCW;
479567
480568
// The offset of 324.31 could be wrong. It is just an indication.

images/14_ADC/AtMega2560Refs.png

102 KB
Loading

images/14_ADC/Heissleiter.png

39.1 KB
Loading

images/14_ADC/TimeLineADC.png

63.8 KB
Loading

images/15_Timer/16BitTimerAVR.png

76.9 KB
Loading
26.6 KB
Loading

0 commit comments

Comments
 (0)