Inhaltsverzeichnis:

Arduino Timer: 8 Projekte - Gunook
Arduino Timer: 8 Projekte - Gunook

Video: Arduino Timer: 8 Projekte - Gunook

Video: Arduino Timer: 8 Projekte - Gunook
Video: How To Make 8 Channel Reprogrammable Relay Timer 2024, November
Anonim
Arduino-Timer: 8 Projekte
Arduino-Timer: 8 Projekte

Der Arduino Uno oder Nano kann mithilfe der drei integrierten Timer auf sechs dedizierten Pins genaue digitale Signale erzeugen. Sie benötigen nur wenige Befehle zum Einrichten und verwenden keine CPU-Zyklen zum Ausführen!

Die Verwendung der Timer kann einschüchternd sein, wenn Sie mit dem vollständigen Datenblatt des ATMEGA328 beginnen, das 90 Seiten enthält, die ihrer Beschreibung gewidmet sind! Mehrere eingebaute Arduino-Befehle verwenden bereits die Timer, zum Beispiel millis(), delay(),tone(), AnalogWrite() und die Servobibliothek. Um ihre volle Leistung zu nutzen, müssen Sie sie jedoch über die Register einrichten. Ich teile hier einige Makros und Funktionen, um dies einfacher und transparenter zu machen.

Folgen Sie nach einem sehr kurzen Überblick über die Timer 8 coole Projekte, die auf die Signalerzeugung mit den Timern angewiesen sind.

Schritt 1: Erforderliche Komponenten

Erforderliche Komponenten
Erforderliche Komponenten

Um alle 8 Projekte zu erstellen, benötigen Sie:

  • Ein Arduino Uno oder kompatibel
  • Ein Prototyp-Schild mit Mini-Protoboard
  • 6 Steckbrett-Überbrückungskabel
  • 6 kurze Steckbrett-Jumper (machen Sie sich aus 10cm Vollkern-Anschlussdraht)
  • 2 Krokodilleinen
  • 1 weiße 5mm LED
  • ein 220 Ohm Widerstand
  • ein 10kOhm Widerstand
  • ein 10kOhm Potentiometer
  • 2 keramische 1muF-Kondensatoren
  • 1 elektrolytischer 10muF-Kondensator
  • 2 Dioden, 1n4148 oder ähnlich
  • 2 Mikro-Servomotoren SG90
  • 1 8Ohm-Lautsprecher
  • 20 m dünner (0,13 mm) Lackdraht

Schritt 2: Übersicht über die Arduino-Timer für die Signalerzeugung

Timer0 und Timer2 sind 8-Bit-Timer, das heißt, sie können maximal von 0 bis 255 zählen. Timer1 ist ein 16-Bit-Timer, kann also bis zu 65535 zählen. Jeder Timer hat zwei zugehörige Ausgangspins: 6 und 5 für Timer0, 9 und 10 für Timer1, 11 und 3 für Timer2. Der Timer wird bei jedem Arduino-Taktzyklus inkrementiert oder mit einer Rate, die um einen Vorskalierungsfaktor reduziert wird, der entweder 8, 64, 256 oder 1024 beträgt (32 und 128 sind auch für Timer2) zulässig. Die Timer zählen von 0 bis „TOP“und dann wieder (schnelle PWM) oder abwärts (phasenkorrekte PWM). Der Wert von „TOP“bestimmt somit die Frequenz. Die Ausgangspins können auf den Wert des Ausgangsvergleichsregisters gesetzt, zurückgesetzt oder gekippt werden, sodass diese den Arbeitszyklus bestimmen. Nur Timer1 kann die Frequenz und das Tastverhältnis für beide Ausgangspins unabhängig voneinander einstellen.

Schritt 3: LED blinkt

Image
Image
LED-Blinken
LED-Blinken
LED-Blinken
LED-Blinken

Die niedrigste Frequenz, die mit den 8-Bit-Timern erreicht werden kann, beträgt 16MHz/(511*1024)=30, 6Hz. Um also eine LED mit 1Hz blinken zu lassen, brauchen wir Timer1, der Frequenzen 256 mal kleiner erreichen kann, 0,12 Hz.

Verbinden Sie eine LED mit ihrer Anode (langes Bein) mit Pin9 und verbinden Sie ihre Kathode mit einem 220 Ohm Widerstand mit Masse. Laden Sie den Code hoch. Die LED blinkt mit genau 1 Hz bei einem Tastverhältnis von 50%. Die Funktion loop() ist leer: Der Timer wird bei setup() initialisiert und benötigt keine weitere Aufmerksamkeit.

Schritt 4: LED-Dimmer

Image
Image
LED-Dimmer
LED-Dimmer
LED-Dimmer
LED-Dimmer

Pulsweitenmodulation ist eine effektive Möglichkeit, die Intensität einer LED zu regulieren. Mit einem richtigen Treiber ist es auch die bevorzugte Methode, um die Drehzahl von Elektromotoren zu regulieren. Da das Signal entweder zu 100 % an oder zu 100 % aus ist, wird keine Leistung an einem Serienwiderstand verschwendet. Im Grunde ist es so, als würde die LED schneller blinken, als das Auge folgen kann. 50Hz sind im Prinzip ausreichend, es kann aber trotzdem vorkommen, dass es noch ein bisschen flackert und wenn sich die LED oder die Augen bewegen, kann eine störende nicht durchgehende „Spur“entstehen. Bei einer Vorskalierung von 64 mit einem 8-Bit-Timer erhalten wir 16MHz/(64*256)=977Hz, was dem Zweck entspricht. Wir wählen timer2, damit Timer1 für andere Funktionen verfügbar bleibt, und wir stören nicht die Arduino-Funktion time(), die timer0 verwendet.

In diesem Beispiel wird das Tastverhältnis und damit die Intensität über ein Potentiometer geregelt. Eine zweite LED kann unabhängig mit dem gleichen Timer an Pin 3 geregelt werden.

Schritt 5: Digital-Analog-Wandler (DAC)

Image
Image
Digital-Analog-Wandler (DAC)
Digital-Analog-Wandler (DAC)
Digital-Analog-Wandler (DAC)
Digital-Analog-Wandler (DAC)

Der Arduino hat keinen echten Analogausgang. Einige Module benötigen eine analoge Spannung, um einen Parameter (Anzeigekontrast, Erkennungsschwelle usw.) zu regulieren. Mit nur einem Kondensator und Widerstand kann Timer1 verwendet werden, um eine analoge Spannung mit einer Auflösung von 5 mV oder besser zu erzeugen.

Ein Tiefpassfilter kann das PWM-Signal zu einer analogen Spannung „mitteln“. Ein Kondensator ist über einen Widerstand mit einem PWM-Pin verbunden. Die Eigenschaften werden durch die PWM-Frequenz und die Werte von Widerstand und Kondensator bestimmt. Die Auflösung der 8-Bit-Timer wäre 5V/256=20mV, also entscheiden wir uns für Timer1, um eine 10-Bit-Auflösung zu erhalten. Die RC-Schaltung ist ein Tiefpassfilter erster Ordnung und weist eine gewisse Welligkeit auf. Die Zeitskala der RC-Schaltung sollte viel größer sein als die Periode des PWM-Signals, um die Welligkeit zu reduzieren. Die Periode, die wir für eine 10-Bit-Präzision erhalten, beträgt 1024/16MHz = 64mus. Wenn wir einen 1muF-Kondensator und einen 10kOhm-Widerstand verwenden, beträgt RC=10ms. Die Spitze-Spitze-Welligkeit beträgt maximal 5V*0,5*T/(RC)=16mV, was hier als ausreichend angesehen wird.

Beachten Sie, dass dieser DAC eine sehr hohe Ausgangsimpedanz (10 kOhm) hat, sodass die Spannung erheblich abfällt, wenn er Strom zieht. Um dies zu vermeiden, kann es mit einem Opamp gepuffert werden oder eine andere Kombination von R und C gewählt werden, zum Beispiel 1kOhm mit 10muF.

Im Beispiel wird der DAC-Ausgang mit einem Potentiometer gesteuert. Ein zweiter unabhängiger DAC-Kanal kann mit Timer1 an Pin 10 betrieben werden.

Schritt 6: Metronom

Image
Image
Metronom
Metronom
Metronom
Metronom

Ein Metronom hilft dabei, den Rhythmus beim Abspielen von Musik zu verfolgen. Für sehr kurze Impulse kann der Arduino-Timer-Ausgang direkt an einen Lautsprecher gespeist werden, der deutlich hörbare Klicks erzeugt. Mit einem Potentiometer lässt sich die Schlagfrequenz von 40 bis 208 Schlägen pro Minute in 39 Stufen regulieren. Timer1 wird für die erforderliche Genauigkeit benötigt. Der Wert von ‚TOP‘, der die Frequenz bestimmt, wird in der Funktion loop() geändert, und das erfordert Aufmerksamkeit! Sie sehen hier, dass sich der WGM-Modus von den anderen Beispielen mit fester Frequenz unterscheidet: Dieser Modus, bei dem TOP vom OCR1A-Register gesetzt wird, hat eine doppelte Pufferung und schützt vor fehlendem TOP und einem langen Glitch. Dies bedeutet jedoch, dass wir nur 1 Ausgangspin verwenden können.

Schritt 7: Klangspektrum

Image
Image
Klangspektrum
Klangspektrum
Klangspektrum
Klangspektrum

Der Mensch kann über 3 Größenordnungen von Schallfrequenzen hören, von 20 Hz bis 20 kHz Dieses Beispiel erzeugt das volle Spektrum mit einem Potentiometer. Zwischen dem Lautsprecher und dem Arduino wird ein 10muF-Kondensator geschaltet, um den Gleichstrom zu blockieren. Timer1 erzeugt eine Rechteckwelle. Der Wellenform-Generierungsmodus ist hier phasenkorrektes PWM. In diesem Modus beginnt der Zähler rückwärts zu zählen, wenn er die Spitze erreicht hat, was zu Impulsen führt, deren Mittelwert fest ist, selbst wenn das Tastverhältnis variiert. Es ergibt sich jedoch auch eine (fast) doppelte Periode, und es kommt einfach vor, dass Timer1 mit Prescale 8 das gesamte hörbare Spektrum abdeckt, ohne dass die Prescale geändert werden muss. Da der Wert von TOP auch hier unterwegs geändert wird, reduziert die Verwendung von OCR1A als Oberteil Störungen.

Schritt 8: Servomotoren

Image
Image
Servomotoren
Servomotoren
Servomotoren
Servomotoren

Es gibt leistungsstarke Servobibliotheken, aber wenn Sie nur zwei Servos ansteuern müssen, können Sie dies auch direkt mit Timer1 tun und so die CPU- und Speichernutzung reduzieren und Interrupts vermeiden. Das beliebte SG90 Servo nimmt ein 50Hz Signal auf und die Pulslänge kodiert die Position. Ideal für Timer1. Die Frequenz ist fest eingestellt, sodass beide Ausgänge an Pin9 und Pin 10 verwendet werden können, um die Servos unabhängig voneinander zu steuern.

Schritt 9: Spannungsverdoppler und Wechselrichter

Spannungsverdoppler und Wechselrichter
Spannungsverdoppler und Wechselrichter
Spannungsverdoppler und Wechselrichter
Spannungsverdoppler und Wechselrichter
Spannungsverdoppler und Wechselrichter
Spannungsverdoppler und Wechselrichter

Manchmal erfordert Ihr Projekt eine Spannung von mehr als 5 V oder eine negative Spannung. Es kann sein, einen MOSFET zu betreiben, ein Piezoelement zu betreiben, einen Operationsverstärker mit Strom zu versorgen oder einen EEPROM zurückzusetzen. Wenn die Stromaufnahme klein genug ist, bis zu ~ 5 mA, könnte eine Ladungspumpe die einfachste Lösung sein: Nur 2 Dioden und zwei Kondensatoren, die an ein gepulstes Signal von einem Timer angeschlossen sind, ermöglichen die Verdoppelung des Arduino von 5 V auf 10 V. In der Praxis gibt es 2 Diodenabfälle, so dass es in der Praxis eher 8,6 V für den Verdoppler oder -3,6 V für den Wechselrichter sind.

Die Frequenz der Rechteckwelle sollte ausreichend sein, um genügend Ladung durch die Dioden zu pumpen. Ein 1-muF-Kondensator bewegt sich um 5 µC, wenn sich die Spannung zwischen 0 und 5 V ändert. Bei einem Strom von 10 mA muss die Frequenz also mindestens 2 kHz betragen. In der Praxis ist eine höhere Frequenz besser, da sie die Welligkeit reduziert. Wenn Timer2 von 0 bis 255 ohne Vorskalierung zählt, beträgt die Frequenz 62,5 kHz, was gut funktioniert.

Schritt 10: Drahtlose Energieübertragung

Image
Image
Drahtlose Energieübertragung
Drahtlose Energieübertragung
Drahtlose Energieübertragung
Drahtlose Energieübertragung

Es ist nicht ungewöhnlich, eine Smartwatch ohne Kabel aufzuladen, aber dieselbe kann problemlos Teil eines Arduino-Projekts sein. Eine Spule mit einem Hochfrequenzsignal kann durch Induktion Strom ohne elektrischen Kontakt auf eine andere Spule in der Nähe übertragen.

Bereiten Sie zuerst die Spulen vor. Ich habe eine Papierrolle mit 8,5 cm Durchmesser und Lackdraht mit 0,13 mm Durchmesser verwendet, um 2 Spulen herzustellen: die Primärspule mit 20 Windungen, die Sekundärspule mit 50 Windungen. Die Eigeninduktivität dieses Spulentyps mit N Wicklungen und einem Radius R beträgt ~5muH * N^2 * R. Für N=20 und R=0.0425 ergibt sich also L=85muH, was mit dem Komponententester bestätigt wurde. Wir erzeugen ein Signal mit einer Frequenz von 516kHz, was eine Impedanz von 2pi*f*L=275Ohm ergibt. Dies ist hoch genug, dass der Arduino nicht in Überstrom geht.

Um die Spule am effektivsten zu betreiben, möchten wir eine echte Wechselstromquelle verwenden. Dazu gibt es einen Trick: Die beiden Ausgänge eines Timers können gegenphasig betrieben werden, indem einer der Ausgänge invertiert wird. Um es einer Sinuswelle noch ähnlicher zu machen, verwenden wir die phasenkorrekte PWM. Auf diese Weise wechselt die Spannung zwischen Pin 9 und 10 zwischen 0V, Pin 9 +5V, beiden 0V, Pin 10 +5V. Der Effekt wird im Bild anhand einer Oszilloskopspur gezeigt (mit einer 1024-Vorskalierung hat dieses Spielzeugfernrohr nicht viel Bandbreite).

Schließen Sie die Primärspule an Pin 9 und 10 an. Schließen Sie eine LED an die Sekundärspule an. Wenn die Sekundärspule in die Nähe der Primärspule gebracht wird, leuchtet die LED hell auf.

Empfohlen: