Inhoudsopgave:

Arduino Timers: 8 projecten: 10 stappen (met afbeeldingen)
Arduino Timers: 8 projecten: 10 stappen (met afbeeldingen)

Video: Arduino Timers: 8 projecten: 10 stappen (met afbeeldingen)

Video: Arduino Timers: 8 projecten: 10 stappen (met afbeeldingen)
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Juni-
Anonim
Arduino-timers: 8 projecten
Arduino-timers: 8 projecten

De Arduino Uno of Nano kan nauwkeurige digitale signalen genereren op zes speciale pinnen met behulp van de drie ingebouwde timers. Ze vereisen slechts een paar commando's om in te stellen en gebruiken geen CPU-cycli om uit te voeren!

Het gebruik van de timers kan intimiderend zijn als u begint met de ATMEGA328 volledige datasheet, die 90 pagina's heeft gewijd aan hun beschrijving! Verschillende ingebouwde Arduino-commando's gebruiken de timers al, bijvoorbeeld millis(), delay(), tone(), AnalogWrite() en de servobibliotheek. Maar om hun volledige kracht te gebruiken, moet u ze via de registers instellen. Ik deel hier enkele macro's en functies om dit makkelijker en transparanter te maken.

Na een heel kort overzicht van de timers, volgen 8 coole projecten die afhankelijk zijn van signaalgeneratie met de timers.

Stap 1: Vereiste componenten

Vereiste componenten
Vereiste componenten

Om alle 8 projecten te maken, heb je nodig:

  • Een Arduino Uno of compatibel
  • Een prototype schild met mini protoboard
  • 6 breadboard-startkabels
  • 6 korte breadboard jumpers (maak jezelf van 10cm solid core aansluitdraad)
  • 2 krokodillenlijnen
  • 1 witte 5 mm LED
  • een weerstand van 220 Ohm
  • een weerstand van 10kOhm
  • een 10kOhm potentiometer
  • 2 keramische 1muF condensatoren
  • 1 elektrolytische 10muF condensator
  • 2 diodes, 1n4148 of vergelijkbaar
  • 2 micro-servomotoren SG90
  • 1 8Ohm luidspreker
  • 20 m dunne (0,13 mm) geëmailleerde draad

Stap 2: Overzicht van de Arduino-timers voor signaalgeneratie

Timer0 en timer2 zijn 8-bit timers, wat betekent dat ze maximaal van 0 tot 255 kunnen tellen. Timer1 is een 16-bits timer, dus deze kan tot 65535 tellen. Elke timer heeft twee bijbehorende uitgangspinnen: 6 en 5 voor timer0, 9 en 10 voor timer1, 11 en 3 voor timer2. De timer wordt verhoogd bij elke Arduino-klokcyclus, of met een snelheid die wordt verlaagd met een prescale-factor, die 8, 64, 256 of 1024 is (32 en 128 zijn ook toegestaan voor timer2). De timers tellen van 0 tot ‘TOP’ en dan opnieuw (snelle PWM) of naar beneden (fase correcte PWM). De waarde van ‘TOP’ bepaalt dus de frequentie. De uitgangspinnen kunnen de waarde van het Output Compare Register instellen, resetten of omdraaien, zodat deze de duty cycle bepalen. Alleen timer1 heeft de mogelijkheid om de frequentie en de duty-cycles voor beide uitgangspinnen onafhankelijk in te stellen.

Stap 3: LED knippert

Image
Image
LED Knippert
LED Knippert
LED Knippert
LED Knippert

De laagste frequentie die bereikt kan worden met de 8-bit timers is 16MHz/(511*1024)=30, 6Hz. Dus om een LED met 1 Hz te laten knipperen, hebben we timer1 nodig, die frequenties kan bereiken die 256 keer kleiner zijn, 0,12 Hz.

Verbind een LED met zijn anode (lange poot) met pin9 en verbind zijn kathode met een 220 Ohm weerstand met aarde. Upload de code. De LED knippert op exact 1 Hz met een duty cycle van 50%. De loop()-functie is leeg: de timer wordt geïnitialiseerd bij setup() en heeft geen verdere aandacht nodig.

Stap 4: LED-dimmer

Image
Image
LED-dimmer
LED-dimmer
LED-dimmer
LED-dimmer

Pulsbreedtemodulatie is een effectieve manier om de intensiteit van een LED te regelen. Met een goede driver is het ook de geprefereerde methode om de snelheid van elektromotoren te regelen. Omdat het signaal 100% aan of 100% uit is, wordt er geen stroom verspild aan een serieweerstand. Kortom, het is alsof de LED sneller knippert dan het oog kan volgen. 50Hz is in principe voldoende, maar het lijkt misschien nog steeds een beetje te flikkeren en wanneer de LED of de ogen bewegen, kan er een vervelend niet-continu 'spoor' ontstaan. Gebruikmakend van een prescale van 64 met een 8-bit timer, krijgen we 16MHz/(64*256)=977Hz, wat past bij het doel. We kiezen timer2, zodat timer1 beschikbaar blijft voor andere functies, en we interfereren niet met de Arduino time()-functie, die timer0 gebruikt.

In dit voorbeeld wordt de duty cycle, en dus de intensiteit, geregeld door een potentiometer. Een tweede LED kan onafhankelijk worden geregeld met dezelfde timer op pin 3.

Stap 5: Digitaal-naar-analoog-omzetter (DAC)

Image
Image
Digitaal-naar-analoog-omzetter (DAC)
Digitaal-naar-analoog-omzetter (DAC)
Digitaal-naar-analoog-omzetter (DAC)
Digitaal-naar-analoog-omzetter (DAC)

De Arduino heeft geen echte analoge uitgang. Sommige modules gebruiken een analoge spanning om een parameter te regelen (displaycontrast, detectiedrempel enz.). Met slechts één condensator en weerstand kan timer1 worden gebruikt om een analoge spanning te creëren met een resolutie van 5mV of beter.

Een laagdoorlaatfilter kan het PWM-signaal 'gemiddelden' naar een analoge spanning. Een condensator is via een weerstand verbonden met een PWM-pin. De karakteristieken worden bepaald door de PWM-frequentie en de waarden van de weerstand en condensator. De resolutie van de 8-bit timers zou 5V/256=20mV zijn, dus we kiezen voor Timer1 om een 10-bits resolutie te krijgen. Het RC-circuit is een laagdoorlaatfilter van de eerste orde en het zal wat rimpeling hebben. De tijdschaal van het RC-circuit moet veel groter zijn dan de periode van het PWM-signaal om de rimpel te verminderen. De periode die we krijgen voor een 10-bits precisie is 1024/16MHz= 64mus. Als we een condensator van 1muF en een weerstand van 10kOhm gebruiken, is RC=10ms. De piek-tot-piek rimpel is maximaal 5V*0,5*T/(RC)=16mV, wat hier voldoende wordt geacht.

Merk op dat deze DAC een zeer hoge uitgangsimpedantie (10kOhm) heeft, dus de spanning zal aanzienlijk dalen als deze stroom trekt. Om dat te voorkomen kan er gebufferd worden met een opamp, of kan er gekozen worden voor een andere combinatie van R en C, bijvoorbeeld 1kOhm met 10muF.

In het voorbeeld wordt de DAC-uitgang aangestuurd met een potentiometer. Een tweede onafhankelijk DAC-kanaal kan worden uitgevoerd met timer1 op pin 10.

Stap 6: Metronoom

Image
Image
Metronoom
Metronoom
Metronoom
Metronoom

Een metronoom helpt om het ritme bij te houden bij het afspelen van muziek. Voor zeer korte pulsen kan de Arduino-timeruitgang rechtstreeks naar een luidspreker worden gevoerd, die duidelijk hoorbare klikken zal produceren. Met een potentiometer kan de slagfrequentie worden geregeld van 40 tot 208 slagen per minuut, in 39 stappen. Timer1 is nodig voor de vereiste precisie. De waarde van ‘TOP’, die de frequentie bepaalt, wordt aangepast binnen de loop()-functie, en dat vereist aandacht! Je ziet hier dat de WGM-modus verschilt van de andere voorbeelden met een vaste frequentie: deze modus, met TOP ingesteld door het OCR1A-register, heeft dubbele buffering en beschermt tegen het missen van TOP en het krijgen van een lange glitch. Dit betekent echter dat we slechts 1 uitgangspin kunnen gebruiken.

Stap 7: Geluidsspectrum

Image
Image
Geluidsspectrum
Geluidsspectrum
Geluidsspectrum
Geluidsspectrum

Mensen kunnen meer dan 3 orden van grootte van geluidsfrequenties horen, van 20 Hz tot 20 kHz. Dit voorbeeld genereert het volledige spectrum met een potentiometer. Een condensator van 10 muF wordt tussen de luidspreker en de Arduino geplaatst om de gelijkstroom te blokkeren. Timer1 produceert een blokgolf. De modus voor het genereren van golfvormen is hier Phase-correct PWM. In die modus begint de teller terug te tellen wanneer deze de top bereikt, wat resulteert in pulsen waarvan het gemiddelde vast is, zelfs als de werkcyclus varieert. Het resulteert echter ook in een periode die (bijna) dubbel is, en het gebeurt gewoon dat met prescale 8 timer1 het volledige hoorbare spectrum bestrijkt, zonder de noodzaak om prescale te veranderen. Ook hier, aangezien de waarde van TOP onderweg wordt gewijzigd, vermindert het gebruik van OCR1A als top glitches.

Stap 8: Servomotoren

Image
Image
Servomotoren
Servomotoren
Servomotoren
Servomotoren

Er zijn krachtige servobibliotheken, maar als u slechts twee servo's hoeft aan te drijven, kunt u dit net zo goed rechtstreeks met timer1 doen, en zo de CPU, het geheugengebruik verminderen en onderbrekingen vermijden. De populaire SG90-servo neemt een 50Hz-signaal en de pulslengte codeert de positie. Ideaal voor timer1. De frequentie is vast, zodat beide uitgangen op pin 9 en pin 10 kunnen worden gebruikt om de servo's onafhankelijk te sturen.

Stap 9: Spanningsverdubbelaar en omvormer

Spanningsverdubbelaar en omvormer
Spanningsverdubbelaar en omvormer
Spanningsverdubbelaar en omvormer
Spanningsverdubbelaar en omvormer
Spanningsverdubbelaar en omvormer
Spanningsverdubbelaar en omvormer

Soms vereist uw project een spanning die hoger is dan 5V of een negatieve spanning. Het kan zijn om een MOSFET uit te voeren, een piëzo-element uit te voeren, een opamp van stroom te voorzien of een EEPROM te resetten. Als het stroomverbruik klein genoeg is, tot ~5mA, kan een laadpomp de eenvoudigste oplossing zijn: slechts 2 diodes en twee condensatoren aangesloten op een gepulseerd signaal van een timer maken het mogelijk om de arduino 5V tot 10V te verdubbelen. In de praktijk zijn er 2 diode-drops, dus in de praktijk zal het meer 8,6V zijn voor de verdubbelaar, of -3,6V voor de omvormer.

De frequentie van de blokgolf moet voldoende zijn om voldoende lading door de diodes te pompen. Een condensator van 1 muF verplaatst 5 muC aan verandering wanneer de spanning verandert tussen 0 en 5 V, dus voor een stroom van 10 mA moet de frequentie minimaal 2 kHz zijn. In de praktijk is een hogere frequentie beter, omdat het de rimpel vermindert. Met timer2 die van 0 tot 255 telt zonder voorschaal, is de frequentie 62,5 kHz, wat goed werkt.

Stap 10: draadloze stroomoverdracht

Image
Image
Draadloze stroomoverdracht
Draadloze stroomoverdracht
Draadloze stroomoverdracht
Draadloze stroomoverdracht

Het is niet ongebruikelijk om een smartwatch zonder kabels op te laden, maar hetzelfde kan gemakkelijk onderdeel zijn van een Arduino-project. Een spoel met een hoogfrequent signaal kan via inductie stroom overdragen naar een andere spoel in de buurt, zonder elektrisch contact.

Bereid eerst de spoelen voor. Ik gebruikte een papierrol met een diameter van 8,5 cm en geëmailleerd draad met een diameter van 0,13 mm om 2 spoelen te maken: de primaire met 20 windingen, de secundaire met 50 windingen. De zelfinductie van dit type spoel met N-wikkelingen en een straal R is ~5muH * N^2 * R. Dus voor N=20 en R=0.0425 geeft L=85muH, wat werd bevestigd met de componententester. We produceren een signaal met een frequentie van 516kHz, wat resulteert in een impedantie van 2pi*f*L=275Ohm. Dit is hoog genoeg dat de Arduino niet overstroomt.

Om de spoel zo effectief mogelijk te laten werken, willen we een echte AC-bron gebruiken. Er is een truc die kan worden uitgevoerd: de twee uitgangen van een timer kunnen in tegenfase worden gedraaid, door een van de uitgangen om te keren. Om het nog meer op een sinusgolf te laten lijken, gebruiken we de Phase-correct PWM. Op deze manier wisselt tussen pin 9 en 10 de spanning tussen beide 0V, pin 9 +5V, beide 0V, pin 10 +5V. Het effect is in de afbeelding te zien vanaf een scooptracering (met een 1024 prescale heeft deze speelgoedscope niet veel bandbreedte).

Sluit de primaire spoel aan op pin 9 en 10. Sluit een LED aan op de secundaire spoel. Wanneer de secundaire spoel dicht bij de primaire wordt gebracht, licht de LED fel op.

Aanbevolen: