Je peux actuellement définir quatre broches PWM à environ 31 kHz avec le code suivant:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
J'ai trouvé cette configuration quelque part, mais je ne sais pas comment je peux régler ces quatre broches PWM à environ 25 kHz à la place. Comment est-ce possible?
Réponses:
Je poste cette deuxième réponse depuis que j'ai réalisé qu'il était possible d'avoir 4 canaux PWM à 25 kHz avec 161 pas sur un seul Arduino Uno. Cela implique de changer la fréquence d'horloge principale à 8 MHz , ce qui a certains effets secondaires puisque l'ensemble du programme s'exécutera deux fois moins vite. Elle implique également la reconfiguration des trois minuteries, ce qui signifie perdre les fonctions de synchronisation (Arduino
millis()
,micros()
,delay()
etdelayMicroseconds()
). Si ces compromis sont acceptables, voici comment cela se passe:Contrairement à l' autre réponse , cela n'a pas besoin d'une version modifiée de
analogWrite()
: la version standard fonctionnera bien. Il ne faut veiller qu'à:analogWrite()
les broches 6 ou 11 échouera non seulement à fournir une sortie PWM, mais changera également la fréquence sur les broches 5 ou 3 respectivement.la source
Vous pouvez configurer le temporisateur 1 pour qu'il cycle à 25 kHz en mode PWM à phase correcte, et utiliser ses deux sorties sur les broches 9 et 10 comme ceci:
L'écriture d'une valeur de 0
analogWrite25k()
signifie que la broche sera toujours LOW, tandis que 320 signifie toujours HIGH. Le régulieranalogWrite()
devrait presque fonctionner, mais il interprétera 255 de la même manière que 320 (c'est-à-dire toujours HIGH).Ce code suppose une carte Arduino Uno ou similaire (ATmega168 ou 328 @ 16 MHz). La méthode utilisée ici nécessite un temporisateur 16 bits, et donc elle utilise le temporisateur 1 car c'est le seul disponible sur l'Uno; c'est pourquoi seules deux sorties sont disponibles. La méthode pourrait être adaptée à d'autres cartes basées sur AVR avec une minuterie 16 bits. Comme Gerben l'a noté, ce temporisateur devrait avoir un registre ICRx correspondant. Il y a 4 minuteries de ce type sur l'Arduino Mega, chacune avec 3 sorties.
la source
ICRx
registre. Tout au plus, vous ne pouvez avoir qu'une seule broche PWM par minuterie, pour les temporisateurs 0 et 2.COM4C1
enTCCR4A
? 2. Si ce n'est pas le problème, lisez Comment puis-je poser une bonne question? , puis mettez à jour votre question en incluant votre code source complet et en indiquant clairement ce que vous attendez du programme et ce qu'il fait à la place («Je ne vois aucun succès» n'est pas considéré comme une déclaration de problème valide).