2017-07-14 6 views
0

Ich programmiere derzeit Curie Nano v2.0 Arduino Board. Und ich muss eine Funktion mit einer Rate von 250Hz aufrufen. Eine Möglichkeit, dies zu tun, ist einfach eine Verzögerung von 3 oder 4 Millisekunden, um eine Annäherung von 250 Hz zu erhalten.Arduino Uhr Ereignis

Gibt es eine Bibliothek oder ein Taktereignis, das alle 4ms auslösen kann, um ein Ereignis zu senden und damit die Funktion auszuführen, die ich brauche, oder eine andere intelligente Methode, ohne die Funktion delay() zu verwenden.

Eine Möglichkeit wäre, einen eventEmitter zu erstellen, der ständig die Uhr sucht und nach der Uhrzeit fragt und, falls der gewünschte Zeitraum verstrichen ist, ein Ereignis sendet. Aber ich vermute, dass diese Methode rechenintensiv ist und immer die Uhr sucht. Kann jemand helfen?

+0

Bitte beachten Sie meine Antwort unten, die keine zusätzliche Bibliothek und daher wahrscheinlich kompakter Code erfordert. – TomServo

Antwort

0

Sie könnten dafür die CurieTimerOne-Bibliothek und ihre Methode CurieTimerOne.start(int timerPeriodUsec, userCallBack) verwenden. Hier

ist der Beispielcode:

#include "CurieTimerOne.h" 

bool ledState = false; 
#define LED_PIN 13 

// callback which toggles the LED 
void blinkProc() 
{ 
    digitalWrite(LED_PIN, ledState); 
    ledState = !ledState; // change state. 
} 

void setup() 
{ 
    pinMode(LED_PIN, OUTPUT); 
    // 4000us is 4ms or 250Hz. 
    CurieTimerOne.start(4000, blinkProc); 
} 

void loop() 
{ 
    // do other stuff. 
} 

Was bei der Verwendung von Timern (Interrupts) gut ist, ist, dass Ihre Funktion bei genauer Frequenz genannt werden Sie wollen, die mit delay() nicht möglich ist.

Reference to CurieTimeOne libary at official Arduino website

0

Sie könnten einen Interrupt an den Timer hinzuzufügen, die bereits für millis() ausgeführt ist, die sehr geringen Overhead entstehen. Hier ist ein interruptbasiertes Beispiel, in dem Ihr Code andere Dinge tun kann, außer wenn der 4ms-Timer abgelaufen ist. Dies hat den Vorteil, dass keine zusätzlichen Bibliotheken benötigt werden, kleinere Code-Größe. Es ist auch eine kleine Einführung in Interrupts auf Hardware-Ebene, wenn Sie das noch nie zuvor erforscht haben.

volatile uint8_t reduce4 = 0;  // used to get 4 ms 
volatile uint8_t timerAlert = LOW; // flag that tells you 4ms is up 

void setup() { 
    pinMode(12, OUTPUT); // an output pin just for testing on my oscilloscope 
    OCR0A = 0xAF;   // set up interrupt 
    TIMSK0 |= _BV(OCIE0A); 
} 

SIGNAL(TIMER0_COMPA_vect) // interrupt handler 
{ 
    reduce4++; 
    if (reduce4 == 4) 
    { 
    timerAlert = HIGH; // only fire every 4th time 
    reduce4 = 0; 
    } 
} 

void loop() 
{ 
    if (timerAlert == HIGH) 
    { 
    digitalWrite(12, !digitalRead(12)); 
    // DO OTHER STUFF 
    timerAlert = LOW; 
    } 
} 
+0

Ich bekomme diesen Fehler. sketch_jul14b: 4: Fehler: erwartet Konstruktor destructor, oder Typ-Konvertierung vor '(' Token SIGNAL (TIMER0_COMPA_vect) // Interrupthandler ^ Wert 1 erwartet Konstruktor destructor, oder Typ-Konvertierung vor '(' Token – user3630461

+0

@ user3630461 habe ich gerade bearbeitet, direkt aus laufender Skizze eingefügt. – TomServo