Arduino Nano PWM-frequentie

Ik heb een Arduino Nano gebruikt als een PWM-controller voor een verwarmingselement.

Ik gebruik momenteel D11 (PB3). Ik zou kunnen veranderen, hoewel alle pinnen met PWM in gebruik zijn, en zou opnieuw moeten worden geschreven en opnieuw moeten worden bedraad.

Dit produceert een signaal op ~ 490Hz, maar ik zou graag willen experimenteren met het veranderen van dit naar een hogere frequentie.

Ik begrijp dat het mogelijk is om de frequentie te variëren door de deler te veranderen van zijn standaard 64.

Mijn schets gebruikt Uses http://playground.arduino.cc/Main/SevenSegmentLibrary en roept millis () aan – heeft het wijzigen van de PWM-deler invloed op een van deze?

OPMERKING Ik heb de setPwmFrequency documentatie gelezen, maar vind “verstoort de normale werking” niet nuttig – ik ben eigenlijk op zoek naar enige uitleg van het concrete effect. Ik gebruik alleen millis() om de tijd op een knop te drukken en een LED te laten knipperen, die niet tijdkritisch zijn

Houd er rekening mee dat het wijzigen van de PWM-frequentie de Atmega timers en verstoort de normale werking van veel functies die afhankelijk zijn van tijd (delay (), millis (), Servo-bibliotheek).

Ik heb wat verder onderzoek gedaan. http://playground.arduino.cc/Code/PwmFrequency states Wijzigingen op pinnen 3, 5, 6 of 11 kunnen de vertraging () en millis ( ) functies om te stoppen met werken.

Andere referenties zeggen 3, 11 gebruiken timer 2 dus doen ze hebben invloed op millis() of niet op aangezien andere verwijzingen beweren dat timer 0 hiervoor wordt gebruikt.

Reacties

  • Ja en nee, afhankelijk van de gebruikte pwm-timer.

Antwoord

Ik weet niet waar deze verkeerde informatie vandaan komt … Het antwoord is nee , het opnieuw configureren van Timer 2 doet niet zijn van invloed op millis() noch delay(), aangezien deze functies afhankelijk zijn van Timer 0. AFAIK de Arduino-kern gebruikt Timer 2 helemaal niet. Houd er echter rekening mee dat er andere Arduino-bibliotheken of bibliotheken van derden kunnen zijn die afhankelijk zijn van Timer 2.

U kunt hier de broncode van millis() en delay() .

Zoals MITU RAJ correct aangeeft in zijn antwoord, wordt het PWM-signaal op pin 11 geleverd door Timer 2, zodat u deze veilig kunt gebruiken.

Reacties

  • De verkeerde informatie komt van speeltuin .arduino.cc / Code / PwmFrequency . Ik weet zeker dat ik niet de enige gebruiker ben die is misleid. Het andere antwoord publiceerde zojuist een uittreksel van de misleidende documentatie.

Answer

Het antwoord is NEE , het wijzigen van de PWM-verdeler voor pin 11 heeft geen invloed op de millis() -functie (noch delay()).


Uitleg:
De Arduino Nano gebruikt de ATMega328P-microcontroller, hetzelfde als de Arduino Uno .

De PWM van pin 11 wordt bestuurd door Timer 2. Standaard heeft Timer 2 een voorinstelling van 64 (dwz instelling 0x04). De basisfrequentie van Timer 2 is 31372,55 Hz wat resulteert in een frequentie van 490,2 Hz (dwz. 31372.55 / 64 = 490.1961).

Aan de andere kant, de microseconde timer (dat wil zeggen degene die wordt gebruikt door millis(), micros(), delay() en delayMicroseconds()) wordt bestuurd door Timer 0.

Dus het wijzigen van de voorschrijver van Timer 2 heeft geen invloed op millis().

Het zal echter de PWM-frequentie van Pin 3 veranderen.


Terug naar je vraag:
De mogelijke PWM-frequenties van pin 11 (hoger dan 488 Hz) zijn:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Waarbij 32, 8, 1 de voorschrijver zijn.
Wat gelijk staat aan naar een instellingswaarde van 0x03, 0x02 & 0x01 respectievelijk.

Voeg deze regel code toe:

TCCR2B = TCCR2B & 0b11111000 | setting; 

Waarbij setting de waarde is van de instelling voor de respectievelijke voorschrijver.

============================================ || 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 || ============================================ 

Broncode : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Reacties

  • Gewoon muggenziften, maar … de basisfrequentie van de timer ‘ in fase-correcte PWM-modus is F_CPU / 510 (31373 Hz), niet F_CPU / 512: het duurt 255 cycli om te tellen f rom 0 tot 255, dan nog 255 om terug te tellen naar nul. C.f. de vergelijking voor de PWM-frequentie in het gegevensblad.
  • @EdgarBonet Goed punt. Het antwoord is nu gecorrigeerd.
  • Zou het mogelijk zijn om een stap langzamer af te dalen naar 15.31 HZ?

Antwoord

Hangt af van de pincode die je hebt gebruikt voor de PWM.

Arduino UNO / NANO-specificaties zeggen de volgende dingen:

De basisfrequentie voor pennen 3, 9, 10 en 11 is 31250 Hz.

De basisfrequentie voor pennen 5 en 6 is 62500 Hz.

De beschikbare delers op pinnen 5, 6, 9 en 10 zijn: 1, 8, 64, 256 en 1024.

De delers die beschikbaar zijn op pinnen 3 en 11 zijn: 1, 8, 32, 64, 128, 256 , en 1024.

PWM-frequenties zijn met elkaar verbonden in paren pinnen. Als de ene in een paar wordt gewijzigd, wordt de andere ook aangepast.

Pins 5 en 6 zijn gekoppeld op timer0.

Pins 9 en 10 zijn gekoppeld op timer1.

Pins 3 en 11 zijn gekoppeld op timer2.

Wijzigingen op pin 3, 5, 6 of 11 kunnen de vertraging veroorzaken () en millis () functies om te stoppen met werken. Andere timing-gerelateerde functies kunnen ook worden beïnvloed.

Reacties

  • Omdat je ‘ onder vermelding van de specificaties, zou het ‘ leuk zijn als je er ook naar zou kunnen linken? 🙂

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *