2016-05-31 44 views
0

Ich möchte in der Lage sein, die Arduino Due PWM mit höherer Auflösung und Frequenz zu verwenden, als standardmäßig verfügbar ist. Ich benutze IDE 1.6.8, das war vor ein paar Wochen, als ich es installiert habe (ich denke, dass 1.6.9 jetzt auf dem Weg ist). Nachdem die Suche im Internet und mit dem Vorstand und einem Oszilloskop zu experimentieren, ich zu folgenden Ergebnissen kam:Arduino Due PWM

  • Um höhere PWM-Frequenzen zu erhalten, muss man die entsprechenden Zeilen in variant.h ändern. PWM scheint die Pins 6 zu beeinflussen, die in 9 enthalten sind, TC die anderen PWM-fähigen Pins; Ich denke, es ist wegen welcher Pin ist auf welchem ​​Timer? Es scheint Mikros(), millis() usw. sind nicht von der Änderung betroffen:

#define PWM_FREQUENCY 20000 // changed from 1000 #define TC_FREQUENCY 20000 // changed from 1000

  • Wie gesagt an mehreren Stellen, die analogWriteResolution() Arduino Funktion defekt ist oder zumindest reicht es alleine nicht aus, die Due PWM-Auflösung zu erhöhen. Für die analogWriteResolution() wie erwartet zu arbeiten, braucht man auch die folgenden in variant.h zu ändern:

#define PWM_MAX_DUTY_CYCLE 4095 // changed from 255 #define PWM_MIN_DUTY_CYCLE 0 #define PWM_RESOLUTION 12 // changed from 8

  • Es scheint, dass die physikalische Markierung auf dem Arduino Due R3 -E das ist der Standard, wenn ich mein Board kaufte ist irreführend: Es ist auf der Platine geschrieben DIGITAL (PWM ~) und so ein ~ ist nur auf den Pins 3, 5, 6, 9, 10, 11 während vorhanden Ich kann PWM auf allen Pins 2 erhalten, die zu 13 gehören inbegriffen.
  • Ich poste diesen Inhalt hier, da ich eine Weile gebraucht habe, um alles herauszufinden und das Oszilloskop usw. zu überprüfen, und ich konnte diese Antworten nicht auf stackoverflow finden. Ich habe auch zwei Fragen:

  • Ist es OK (wie es von den Tests aussieht, die ich tat), die PWM- und TC-Frequenzen zu ändern? Darf es mit anderen Kernfunktionen/Bibliotheken interagieren?

  • Gibt es einen Grund für die Standardwerte von PWM max Duty Cycle und Auflösung, außer Rückwärtskompatibilität?

Antwort

1

Sie können mit der PWM-Frequenz Teilern dies tun:

Dieses in der PWMfrequency Bibliothek implementiert: http://playground.arduino.cc/Code/PwmFrequency die wie folgt aussieht grundsätzlich:

void setPwmFrequency(int pin, int divisor) { 
    byte mode; 
    if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 64: mode = 0x03; break; 
     case 256: mode = 0x04; break; 
     case 1024: mode = 0x05; break; 
     default: return; 
    } 
    if(pin == 5 || pin == 6) { 
     TCCR0B = TCCR0B & 0b11111000 | mode; 
    } else { 
     TCCR1B = TCCR1B & 0b11111000 | mode; 
    } 
    } else if(pin == 3 || pin == 11) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 32: mode = 0x03; break; 
     case 64: mode = 0x04; break; 
     case 128: mode = 0x05; break; 
     case 256: mode = 0x06; break; 
     case 1024: mode = 0x07; break; 
     default: return; 
    } 
    TCCR2B = TCCR2B & 0b11111000 | mode; 
    } 
}