Timerinterrupts am Uno: Timer 2

Funktionierendes Script, um Timer-Register Nr. 2 am Atmel AVR 328P zu schalten. Besonderheiten: im CTC-Modus bleiben die Pins 3 und 11 passiv, es müssen aktiv die Timer-Interrupts gesetzt werden. Im 011-Fast-PWM werden automatisch die Pins 3 und 11 angesteuert. Achtung: die ‚tone()‘-Funktion läuft nicht mehr bei Nutzung de Timer2-Registers.

void setup() {
  //Disable Interrupts, damit man die Register setzen kann.
  cli();
  /////////////////////////////////////////////////
  // BIT Nr.      1        2        3        4         5       6        7       8
  // TCCR2A = [ COM2A1 | COM2A0 | COM2B1 | COM2B0 |   --   |   --   |  WGM21 | WGM20 ]
  // TCCR2B = [ FOC2A  | FOC2B  |   --   |   --   |  WGM22 |  CS22  |  CS21  | CS20  ]
  /////////////////////////////////////////////////
  //Register 2A und 2B löschen.
  TCCR2A = 0;
  TCCR2B = 0;
  //Counter auf 0 zurücksetzen
  TCNT2  = 0;
  /////////////////////////////////////////////////
  //Compare Match Output, Funktionsmodus setzen
  // 00: OC2A aus | 10: NichtInvertiert | 11: Invertiert
  TCCR2A |= (1 << COM2A1);
  TCCR2A |= (0 << COM2A0);
  // 00: OC2B aus | 10: NichtInvertiert | 11: Invertiert
  TCCR2A |= (1 << COM2B1);
  TCCR2A |= (0 << COM2B0);

  //WGM: Waveform Generation Bits
  //100: PWM Phasenkorrigiert bei 255   | 010: CTC Clear Timer on Compare  !!!!
  //101: PWM Phasenkorrigiert bei OCR0A | 011: Fast-PWM bei OCR2A und OCR2B!!!!
  TCCR2B |= (0 << WGM22);
  TCCR2A |= (1 << WGM21);
  TCCR2A |= (0 << WGM20);

  // Prescaler Values, Basis ist 16 MHz;  000: "Disabled" Timer ist ausgeschaltet
  // 001: /1 | 010: /8 | 011: /32 | 100: /64 DEFAULT | 101: /128 | 110: /256 | 111: /1024
  TCCR2B |= (1 << CS22);
  TCCR2B |= (0 << CS21);
  TCCR2B |= (1 << CS20);
  /////////////////////////////////////////////////
  //Duty Cyles für die Pins: Output Compare Register
  OCR2A = 255; // Pin 11 für 011-Fast-PWM-Modus und beliebigem Pin bei 010-CTC-Modus
  OCR2B = 1; // Pin 3
  /////////////////////////////////////////////////
  // Nur relevant bei CTC-Modus
  TIMSK2 |= (1 << OCIE2A); // Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.
  TIMSK2 |= (1 << OCIE2B); // Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.
  //Enable interrupts
  sei();
  /////////////////////////////////////////////////
  //Für Fast-PWM-Modus 011
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  
  //Für CTC-Modus an beliebigem Pin, hier 12:
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop() {
}

ISR(TIMER2_COMPA_vect) {
  digitalWrite(12,!digitalRead(12));
}
///////////////////////////////////
ISR(TIMER2_COMPB_vect) {
  digitalWrite(13,!digitalRead(13));
}

AC-Coupling mit dem Verstärker

Heute kam der LMC6482IN-OPV mit der Post. Er ist Rail-to-Rail-Out fähig. Damit kann man den unten beschriebenen Transimpedanz-verstärker so erweitern, dass man damit seinen Puls messen kann:

Abb. 1: Screenshot Serieller Plotter der Arduino-Entwicklungsumgebung

Abb. 2: Simulierte Schaltung in Multisim Blue

Erläuterung der Schaltung:

a) Transimpedanzverstärker, siehe unten.

b) Hochpass: Ein Herzschlag ist eine periodische Bewegung. Das Blut wird dabei ‚ruckartig‘ durch die Gefäße gepumpt. Ist das Blutgefäß gerade voll, schwillt es an, wird damit dicker und absorbiert mehr Licht. Die perio-dische Bewegung zeigt sich also über eine periodische Volumenänderung in den Blutgefäßen als messbare Helligkeitsänderung. Diese periodische Helligkeitsänderung wird vom Schaltungsteil a) in eine Wechselspannung umgewandelt.

Allerdings ist die Fotodiode dabei niemals komplett abgedunkelt, es bleibt also eine Resthelligkeit, die einen Gleichspannungsanteil erzeugt. Diesen Gleichspannungsanteil muss man entfernen; damit „schält“man quasi den sehr schwachen Wechelspannunganteil heraus. Man spricht von einem ‚Filtern‘ der Spannung: Der hier verwendete Hochpassfilter sperrt die unveränderlichen Gleichspannungsanteile, die ‚hochfrequenten‘ periodischen Spannungsimpulse werden aber durchgelassen.

Diese Aufgabe übernimmt der Kopplungskondensator mit 2.2μF. Kondensatoren wirken auf Wechselspannungen wie Widerstände (Blindwiderstand). Dabei gilt zweierlei:

  • Je höher die Kapazität des Kondensators, desto geringer ist sein sogenannter ‚kapazitiver Blindwiderstand‘.
  • Je höher die Frequenz der Wechselspannung, desto geringer ist der ‚kapazitive Blindwiderstand‘.

Die Größe des Kondensators muss daher so gewählt werden, dass die zu erwartende Frequenz noch durchgelassen wird, niedrigere Frequenzen aber nicht mehr, bzw. deutlich abgeschwächt werden.

Auf das gefilterte Wechselspannungssignal (AC-Signal genannt, „AC“ für „Alternating Current“) wird nun noch ein Offset von 2.5Volt gelegt, damit es für den 5Volt-betriebenen zweiten Operationsverstärker optimal vorbereitet ist. Diesen 2.5Volt-Offset erzeugen die beiden Reihenwiderstände, die zusammen einen Spannungsteiler bilden.

c) AC-Gain: „Gain“ bedeutet „Verstärkung“. Da es sich hier um eine Nicht-Invertierende Verstärkerschaltung eines Operationsverstärkers handelt, besitzt die Verstärkung hier den Wert (1+R1/R2), das ist hier etwa (1+100kΩ/4,7kΩ) = 22,27. Damit wird das äußerst schwache AC-Signal der Herzschlagsmessung verstärkt. Der parallel zum 100kΩ -Widerstand geschaltete 1nF-Kondensator filtert hochfrequentes Rauschen – ähnlich wie der 10pF-Kondensator in der Transimpedanzstufe.

Die Schaltung „Inverting Amplifier (AC Coupled)“ ist vom Prinzip her in diesem Aufsatz vom MIT (Massachusetts Institute of Technology) sehr schön beschrieben:

https://ocw.mit.edu/courses/media-arts-and-sciences/mas-836-sensor-technologies-for-interactive-environments-spring-2011/readings/MITMAS_836S11_read02_bias.pdf