2017-06-29 3 views
-1

J'essayais de contrôler la luminosité de la LED par PWM. J'ai quelques doutes sur la façon dont fonctionne PWM,Comment PWM fonctionne pour contrôler la luminosité des LED?

  1. Si je donne un cycle de service (50%), si la fréquence de la sortie est de 500 Hz, chaque cycle sera 2 millisecondes. Est-ce que 50% du cycle de service signifie en 2 ms, 50% du temps (1 ms) la LED est allumée et 50% du temps la LED est éteinte (1 ms)? J'utilisais Analogwrite() pour créer un rapport cyclique spécifique, le rapport cyclique de 0.04% se réfère à Analogwrite = 1, le cycle de travail de 0.8% correspond à Analogwrite = 2. Pourquoi l'Analogwrite ne fonctionnera pas à 0.5? ou si je veux un cycle de service de 0.02%, que dois-je faire?

Commentaire: Avant d'utiliser l'Arduino pour mesurer l'intensité LED, je viens de mesurer l'intensité en faisant varier la tension continue à laquelle sont connectées les LED. Mais je n'étais pas capable d'obtenir des valeurs de luminosité cohérentes pour la même tension au fil du temps. J'ai été informé que PWM est la façon précise de contrôler la luminosité des LED. Je recevais des valeurs cohérentes aussi. Mais je ne peux pas aller au-dessous du cycle de service de 0,4% avec l'arduino car elle correspond à analogWrite valeurs inférieures à 1. Toutes les suggestions seront très appréciés

Répondre

0

1.

Si je donne un cycle de service (50%), si la fréquence de la sortie est 500 Hz, alors chaque cycle sera de 2 millisecondes. Donc, 50% du cycle de service signifie en 2 ms, 50% du temps (1 ms) la LED est allumée et 50% du temps La LED est éteinte (1 ms)?

Ceci est totalement correct.

2.

I utilisait le analogWrite() pour créer un rapport cyclique spécifique, le rapport cyclique de 0,04% se réfère à analogWrite = 1, le rapport cyclique de 0,8% correspond à analogWrite = 2. Pourquoi l'Analogwrite ne fonctionnera pas à 0,5 ou si je veux un cycle de service de 0,02%, que dois-je faire?

Regarder le prototype analogWrite:

void analogWrite(uint8_t, int); 

nous montre la valeur est un entier, ce qui signifie que vous ne pouvez pas passer une valeur décimale. Cela signifie que le cycle de service minimum utilisant analogWrite est de 0,04% car un temporisateur de 8 bits est utilisé en arrière-plan. Vous pouvez obtenir plus d'informations à ce sujet au this discussion. La seule façon d'obtenir un cycle de travail plus petit est d'utiliser la minuterie 16 bits de résolution inférieure1. Mais vous devez faire votre propre implémentation et vous devez vérifier s'il y a des conflits de temporisation possibles avec d'autres librairies. La façon de mettre en œuvre le PWM est décrite dans this article.

EDIT: Avez-vous pensé à utiliser une résistance devant vos LED pour réduire la luminance?De cette façon, vous êtes en mesure de réduire la luminance beaucoup plus en augmentant la gamme (également la luminance maximale bien sûr)

+0

Le prototype de fonction n'est pas la cause de la limitation mais l'effet de celle-ci. – riodoro1

+0

@Fruchtzwerg merci pour vos commentaires. Vraiment utile. –

+0

@Fruchtzwerg. Mais si je mets une résistance, ça va réduire la tension ryt? Comme l'intensité des LED dépend de la tension de manière non linéaire, est-ce une bonne façon de réduire l'intensité? –

0

George,

Une valeur de 1 pour analogWrite() = 1/256 = 0,0039, ou 0,4%. Vos calculs sont corrects. Et vous écrivez aussi, cette commande donne une fréquence PWM de ~ 490 Hz. Une valeur de 0 désactive le port, ce qui correspond à un cycle de service de 0,0%. La seule façon d'obtenir des "tranches de temps" plus petites est d'abandonner les bibliothèques intégrées qui utilisent les valeurs par défaut pour divers paramètres et d'utiliser une interruption de minuterie et/ou l'un des modes PWM définis avec vos propres paramètres. Et la seule façon d'obtenir des tranches inférieures à 1/256 est d'utiliser le Timer1 de 16 bits, qui peut être utilisé par d'autres fonctions dans les bibliothèques Arduino. Pour cela, vous devrez entrer dans la fiche technique Atmega328 ou utiliser certains des settings on this cheatsheet.

+1

@ JLH merci pour les commentaires. Très instructif et utile. –