Care este frecvența ieșirii PWM pe Arduino

Ce frecvență utilizează Arduinos pentru PWM normal atunci când utilizați analogWrite ()?

Și este diferit pentru diferite modele Arduino? Mă interesează în mod special Mega 2560, dar vreau să știu, de asemenea, dacă este consecvent între modele.

Am văzut referințe trecătoare la Arduino folosind 500 Hz, ceea ce pare foarte lent.

Comentarii

  • Acest lucru depinde și de pinul pe care îl utilizați.

Răspuns

Semnalul PWM este generat de cronometrele de pe cipurile AVR. Fiecare cronometru poate genera un semnal PWM pe doi sau trei pini diferiți. Fiecare pin poate avea propriul ciclu de funcționare, dar împărtășesc frecvența PWM. Puteți modifica frecvența PWM schimbând sursa de ceas pentru temporizatoare. În mod implicit, utilizează ceasul CPU împărțit la 64, adică. au prescalerul setat la 64 prin codul de inițializare Arduino. Pentru a confunda lucrurile mai mult, există două moduri PWM diferite: PWM rapid și PWM corect de fază. În PWM rapid, cronometrul contează la 255, apoi debordează și pornește de la 0 (256 de stări diferite). În fază corectă PWM, temporizatorul contează la 255, apoi schimbă direcția și numără în jos la zero, schimbă direcția și așa mai departe (510 stări diferite).

Arduino Mega are 5 temporizatoare, timer0 – timer4. Deoarece timer0 este, de asemenea, utilizat pentru funcțiile de milis și micros, acesta utilizează PWM rapid, în timp ce celelalte temporizatoare sunt configurate pentru PWM corect de fază. Acest lucru are ca rezultat diferite frecvențe pe diferiți pini:

  • Pinii 4 și 13, controlați de timer0:
    16 Mhz / 64/256 = 976,56 Hz

  • Alte pini PWM, controlate de timer1-4:
    16 Mhz / 64/510 = 490,20 Hz

Calculul este: Ceas / Numărul de stări ale modului Prescaler / PWM

Situația este aceeași pentru toate celelalte plăci Arduino pe care le cunosc, cu excepția faptului că au mai puține cronometre care se conectează la pini diferiți.

Puteți schimba Frecvența PWM prin schimbarea temporizatorului. Vedeți această pagină: http://playground.arduino.cc/Main/TimerPWMCheatsheet

De asemenea, este posibil să faceți temporizatoarele să numere până la o valoare diferită de 255. Pe temporizatoarele pe 8 biți veți pierde un pin de ieșire, dar pe temporizatoarele pe 16 biți puteți utiliza Registrul de captură de intrare pentru a defini o valoare TOP. Funcționalitatea de captare a intrărilor este o caracteristică rar utilizată în comunitatea Arduino, așa că probabil nu o veți pierde.

Bibliotecile Arduino vă permit să utilizați doar rezoluția de 8 biți, chiar și pe temporizatoarele de 16 biți. doriți rezoluția mai mare, va trebui să scrieți propriul dvs. analogWrite sau să utilizați o bibliotecă realizată în acest scop. Pe Arduino Mega timer0 și timer2 sunt de 8 biți, în timp ce restul sunt de 16 biți.

Prin schimbarea modul cronometrelor de 16 biți pentru a utiliza rezoluția completă, în combinație cu schimbarea prescalerului și a valorii TOP, puteți obține o gamă foarte largă de frecvențe PWM.

Frecvența maximă pe care o puteți obține este clock / 4, setând prescalerul la 1 și TOP la 3 în modul PWM rapid – o valoare mai mică nu este permisă. Acest lucru vă va oferi un PWM de 4 MHz cu rezoluție de 2 biți. Poate fi pe 0%, 25%, 50% sau 75% din timp. O valoare TOP mai mare vă va oferi o rezoluție mai mare la o frecvență mai mică.

Pentru o explicație mai lungă, citiți acest articol sau consultați foaie tehnică .

Schimbarea prescalerului, a modului PWM sau a valorii TOP pentru timer0 se va încurca cu millis() și micros().

Comentarii

  • Înțeleg, deci, că cea mai rapidă frecvență pe care o puteți obține pentru PWM este 16Mhz / 256 (prescaler = 1), sau 62,5Khz?
  • Și mai mult, frecvența PWM trebuie să fie un factor egal de 62,5KHz? Cineva de pe un alt fir a vrut să controleze viteza ventilatorului unui ventilator PC cu 4 pini. Se pare că vrea un semnal de control PWM de 25KHz. 62,5 / 25 este 2,5, care nu este o valoare întreagă.
  • Am actualizat răspunsul pentru a detalia mai multe despre posibilitățile de realizare a unor frecvențe specifice,
  • La sfârșitul frecvenței joase, ați putea prescalați un temporizator de 16 biți în modul corect de fază de către un prescaler 1024 pentru a obține 16e6 / 1024/2 ^ 16/2 = 0.119Hz, sau 7.1 cicluri / minut. Pentru mai puțin de atât, ar trebui să comutați biții pe ceva de genul millis (). Sau poate declanșa contorul pe pinul de intrare extern T ?.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *