Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino's Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing

Onderdelen en benodigdheden

Onderdeel Aantal
Arduino UNO 1
LED (standaard) 1
Weerstand 220 ohm 1

Over dit project

Overzicht

Als je nauwkeurig tijd wilt meten, heb je een timer nodig, maar meestal is het niet zo makkelijk om de interne timers van Arduino te gebruiken. In deze tutorial probeer ik uit te leggen hoe je ze op een eenvoudige manier kunt gebruiken.

Het is zo belangrijk om timers te gebruiken omdat je tijdens de delay() functie niets anders kunt doen, maar met een timer kun je alles doen omdat wanneer het moment aankomt, de interrupt geactiveerd wordt.

Ik gebruik de TIMER0 omdat dit de makkelijkste timer is; misschien leg ik in de toekomst de andere timers uit.

Hoe het werkt

Het eerste wat je moet bekijken is de datasheet van de ATmega328P.

Arduino s Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing

Dit is het teller-blokdiagram, en door ernaar te kijken begrijp je hoe het werkt.

De prescaler ontvangt een puls van een klokcyclus en geeft deze door aan de Control Logic, waarna de Control Logic het TCNTn-register met 1 verhoogt.

Nu kunnen we de waarde van TCNTn vergelijken met een specifieke waarde. Wanneer het TCNTn-register deze waarde bereikt, weet je dat een specifieke tijd verstreken is.

Deze methode heet CTC-modus voor "Clear Timer on Compare". De waarde van het TCNTn-register wordt vergeleken met het OCRn-register; wanneer een vergelijkingsmatch optreedt, genereert de TOVn een interrupt.

Een ander belangrijk aspect is de prescaler; hiermee kun je verschillende delingen van de klok maken. 16MHz is namelijk te veel, maar dankzij de prescaler kun je enkele submultiplen ervan maken. Dit hangt af van de configuratie van het TCCR0B-register.

Arduino s Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing
Arduino s Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing

Een ander belangrijk punt is het bepalen van de waarde van het OCRn-register om een specifieke tijd te tellen; hiervoor heb je wat wiskunde nodig.

Arduino s Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing

Ik weet dat al dit ingewikkeld kan lijken, maar ik ben er zeker van dat de onderstaande code alle vragen opheldert.

In dit geval activeren we een interrupt-request elke 0,001 seconden (1ms).

TCCR0A |= (1 << WGM01);  // CTC-modus instellen
OCR0A = 0xF9;             // Waarde voor 1ms
TIMSK0 |= (1 << OCIE0A);  // Interrupt request instellen
sei();                    // Interrupts inschakelen
TCCR0B |= (1 << CS01);    // Prescaler 1/64 klok instellen
TCCR0B |= (1 << CS00);

ISR(TIMER0_COMPA_vect) {
  // Dit is de interrupt service routine
}

Het is belangrijk om de prescaler aan het eind in te stellen, want na deze instructie begint de timer te tellen. Als je hem wilt stoppen, moet je alle bits van TCCR0B resetten.

Hieronder volgt een voorbeeld.

Code

Interne timer (Arduino)

/* Dit programma laat een LED op pin 13 elke 1 seconde knipperen met een interne timer */
int timer = 0;
bool state = 0;

void setup() {
  pinMode(13, OUTPUT);
  TCCR0A = (1 << WGM01);    // CTC-modus instellen
  OCR0A = 0xF9;             // Waarde voor OCR0A voor 1ms
  TIMSK0 |= (1 << OCIE0A);  // Interrupt request instellen
  sei();                    // Interrupts inschakelen
  TCCR0B |= (1 << CS01);    // Prescaler 1/64 klok instellen
  TCCR0B |= (1 << CS00);
}

void loop() {
  // Op deze manier kun je 1 seconde tellen omdat de interrupt elke 1ms is
  if (timer >= 1000) {
    state = !state;
    timer = 0;
  }
  digitalWrite(13, state);
}

ISR(TIMER0_COMPA_vect) {
  // Dit is de interrupt service routine
  timer++;
}

Schema's

Arduino s Interne Timers Onder De Knie Krijgen Voor Nauwkeurige Timing

Productieproces

  1. Bluetooth-gecontroleerde Arduino Spybot bouwen
  2. FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
  3. DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
  4. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  5. Find Me: Slimme Item Locator met Arduino en Bluetooth
  6. Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
  7. Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
  8. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  9. Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
  10. Bouw een Volledig Functionele CNC-machine met Arduino Nano R3
  11. Earth Analyzer: Geavanceerde IoT Sensor Kit voor Milieumonitoring