Am folosit un Arduino Nano ca controler PWM pentru un element de încălzire.
În prezent folosesc D11 (PB3). Aș putea schimba, deși toți pinii cu PWM sunt în uz și ar necesita o re-scriere și re-cablare.
Acest lucru produce un semnal la ~ 490Hz, dar aș dori să experimentez schimbând acest lucru în o frecvență mai mare.
Înțeleg că este posibil să variați frecvența schimbând divizorul din 64 implicit.
Schița mea folosește Utilizări http://playground.arduino.cc/Main/SevenSegmentLibrary și apelează millis () – schimbarea divizorului PWM va avea impact asupra oricăreia dintre acestea?
NOTĂ Am citit documentația setPwmFrequency
, dar consider că „perturbă funcționarea normală” nefolositoare – sunt de fapt după o explicație a efectului concret. Folosesc doar millis()
pentru a apăsa butonul de timp și a aprinde un LED, care nu sunt critice pentru timp
Vă rugăm să rețineți că modificarea frecvenței PWM modifică Timerele Atmega și perturbă funcționarea normală a multor funcții care se bazează pe timp (întârziere (), milis (), bibliotecă Servo).
Am făcut câteva studii suplimentare. http://playground.arduino.cc/Code/PwmFrequency stări Modificările la pinii 3, 5, 6 sau 11 pot cauza întârzierea () și milis ( ) funcții pentru a nu mai funcționa.
Alte referințe spun 3, 11 folosesc timer 2
așa că afectează millis()
sau nu deoarece alte referințe susțin timer 0
pentru acestea.
Comentarii
- Da și nu, în funcție de temporizatorul pwm utilizat.
Răspuns
Nu știu de unde provine această dezinformare … Răspunsul este nu , reconfigurarea temporizatorului 2 nu nu afectează millis()
și nici delay()
, deoarece aceste funcții se bazează pe Timer 0. AFAIK nucleul Arduino nu folosește deloc Timer 2. Dar rețineți că pot exista alte biblioteci Arduino sau terțe părți care se bazează pe Timer 2.
Puteți vedea aici codul sursă al millis()
și delay()
.
După cum afirmă corect MITU RAJ în răspunsul său, semnalul PWM de pe pinul 11 este furnizat de Temporizatorul 2, astfel încât să îl puteți folosi în siguranță.
Comentarii
- Dezinformarea provine din loc de joacă .arduino.cc / Code / PwmFrequency . Sunt sigur că nu sunt singurul utilizator care a fost indus în eroare. Celălalt răspuns tocmai a publicat un extras din documentația înșelătoare.
Răspuns
Răspunsul este NO , modificarea divizorului PWM pentru pinul 11 nu va afecta funcția millis()
(nici delay()
).
Explicație:
Arduino Nano utilizează microcontrolerul ATMega328P, la fel ca Arduino Uno .
Pinul 11 „s PWM este controlat de Timer 2. În mod implicit, Timer 2 are o prescală de 64 (adică setarea 0x04). Frecvența de bază a Timerului 2 este 31372,55 Hz, rezultând o frecvență de 490,2 Hz (adică. 31372.55 / 64 = 490.1961).
Pe de altă parte, temporizatorul de microsecundă (adică cel folosit de millis()
, micros()
, delay()
și delayMicroseconds()
) este controlat de temporizatorul 0.
Deci schimbarea prescalerului Timer 2 nu va afecta millis()
.
Cu toate acestea, va schimba frecvența PWM a Pinului 3.
Înapoi la întrebarea dvs.:
Frecvențele posibile PWM ale Pinului 11 (mai mari de 488 Hz) sunt:
31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz
Unde 32, 8, 1 sunt prescaler.
Care echivalează la o valoare de setare 0x03, 0x02 & 0x01 respectiv.
Adăugați această linie de cod:
TCCR2B = TCCR2B & 0b11111000 | setting;
Unde setting
este valoarea setării pentru prescalerul respectiv.
============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================
Cod sursă : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
Comentarii
- Pur și simplu, dar … cronometrul ' frecvența de bază în modul PWM corect de fază este F_CPU / 510 (31373 Hz), nu F_CPU / 512: este nevoie de 255 de cicluri pentru a conta f de la 0 la 255, apoi încă 255 pentru a număra înapoi la zero. C.f. ecuația pentru frecvența PWM din foaia de date.
- @EdgarBonet Punct bun. Răspunsul a fost acum corectat.
- ar fi posibil să coborâți cu un pas mai încet la 15,31 HZ?
Răspuns
Depinde de pinul pe care l-ați folosit pentru PWM.
Specificațiile Arduino UNO / NANO spun următoarele lucruri:
Frecvența de bază pentru pinii 3, 9, 10 și 11 este de 31250 Hz.
Frecvența de bază pentru pinii 5 și 6 este de 62500 Hz.
Divizorii disponibili pe pinii 5, 6, 9 și 10 sunt: 1, 8, 64, 256 și 1024.
Divizorii disponibili pe pinii 3 și 11 sunt: 1, 8, 32, 64, 128, 256 și 1024.
Frecvențele PWM sunt legate între ele în perechi de pini. Dacă unul dintr-o pereche este schimbat, celălalt este, de asemenea, modificat pentru a se potrivi.
Pinii 5 și 6 sunt asociați pe timer0.
Pinii 9 și 10 sunt asociați pe timer1.
Pinii 3 și 11 sunt asociați pe timer2.
Modificările la pinii 3, 5, 6 sau 11 pot cauza întârzierea () și funcțiile millis () pentru a nu mai funcționa. Alte funcții legate de sincronizare pot fi, de asemenea, afectate.
Comentarii
- Deoarece ' re citând specificațiile, ' ar fi frumos dacă ați putea să vă conectați și la ele? 🙂