Quelle est la manière la plus simple de générer du PWM sans microcontrôleur?

15

Quelle est la manière rapide et élégante de générer du PWM sans microcontrôleur pour contrôler un servomoteur? Avec potentiomètre ou autres moyens de contrôler le rapport cyclique avec période fixe.

  • désolé pour le désordre, je veux contrôler un servo de passe-temps.
pstan
la source
Voulez-vous vraiment dire contrôler un moteur dans le cadre d'un système de servocommande, ou posez-vous des questions sur la commande d'un "servomoteur amateur"? Voir l'addition à ma réponse.
Olin Lathrop
1
Pourquoi voulez-vous PWM? Le PWM n'est souvent qu'un moyen pour un micro d'approcher une fonction de contrôle analogique. Si ce que vous voulez vraiment, c'est une tension ou un courant analogique, il existe probablement de bien meilleures façons de le faire.
Le Photon
2
@ThePhoton S'il contrôle un servo amateur, PWM est ce qui est requis comme signal de contrôle.
Nick Johnson
Si vous supprimez l'exigence de période fixe, un oscillateur delta-sigma serait une solution très simple. J'ai vu des implémentations avec un seul opamp et une poignée de résistances / condensateurs. Cela suppose que vous ne parlez pas de servomoteurs RC.
jippie
1
@jippie - Qu'est-ce qu'un oscillateur delta-sigma? Je sais qu'un ADC delta-sigma a besoin d'un oscillateur, mais j'ai toujours supposé que c'était une chose courante, car il ne faisait pas vraiment partie du convertisseur lui-même.
stevenvh

Réponses:

25

Je recommande le (GASP!) 555 Timer en mode "astable" . Vous trouverez tout ce dont vous avez besoin dans le lien, mais je les ai copiés ici juste pour vous!

Le mode astable vous donne une fréquence PWM variable et permet également un rapport cyclique réglable (équations de temps fort et de temps bas dans la liaison).

Le circuit:

555 Timer, astable mode

Remarque: j'ajouterais un capuchon électrolytique entre Vcc (fil positif) et GND (fil négatif) pour réduire l'effet des creux de la tension d'alimentation.

La fréquence PWM:

Output frequency of 555 Timer in astable mode

Une défense pour ma réponse par rapport aux autres dans ce post. La plupart des autres réponses nécessitent une forme d'onde intermédiaire pour générer un signal PWM variable, comme la méthode d'onde triangulaire / comparateur commune. Je ne vois pas beaucoup d'intérêt à construire un générateur d'ondes triangulaires (un circuit important en soi) juste comme une étape intermédiaire pour résoudre votre problème.

Le 555 est une excellente puce analogique et fait exactement ce dont vous avez besoin. Je souhaite que les gens ne les détestent pas autant.

kevlar1818
la source
2
J'aime les 555, mais je pense que @supercat a raison, car un seul 555 ne pourra pas vous fournir un signal à fréquence fixe et à rapport cyclique variable. C est chargé par R1 + R2 et déchargé par R2. Si vous augmentez R2, vous augmenterez les temps d'activation et de désactivation, et donc la période. Si vous augmentez R1, vous n'augmentez que le temps d'activation, mais aussi la période. Si vous augmentez C, vous augmenterez à tout moment, y compris la période. Vous avez besoin de deux 555. Un, en mode astable, qui déterminera la période, déclenchant un second, en mode monostable, qui déterminera le rapport cyclique.
Telaclavo
5
"Vous trouverez tout ce dont vous avez besoin dans le lien". Non, ce n'est pas la bonne façon de répondre. Fournissez les détails ici.
stevenvh
1
Je ne déteste pas le 555, je souhaite juste que les gens ne s'y réfèrent pas comme la meilleure solution pour tout . Un seul 555 n'est pas le meilleur moyen de contrôler un servo de loisir.
stevenvh
1
@Telaclavo - Vous avez raison; vous ne pouvez pas faire varier le rapport cyclique et maintenir la fréquence constante. Cependant, comme WoutervanOoijen le mentionne, vous n'avez pas besoin d'une fréquence fixe pour exécuter un servo. La variation du rapport cyclique crée probablement une oscillation d'environ 10 à 20% (estimation approximative) de la fréquence d'impulsion, qui devrait être suffisamment précise pour la plupart des servos. Et là encore, vous n'avez pas vraiment besoin d'ajuster le rapport cyclique pour contrôler un servo de toute façon.
kevlar1818
2
@stevenvh Vous m'avez informé de la mort de Wikipédia. Même si c'est le cas, comme Dean l'a montré avec son commentaire ci-dessus, le 555 est (était) si omniprésent qu'il serait difficile de ne pas trouver un vieux livre, un petit blog ou un site Web de loisirs avec des informations à leur sujet.
kevlar1818
8

La manière Ye Olde Phashenced de faire du PWM avec un rapport cyclique contrôlé analogique est de comparer le signal de contrôle analogique à une onde triangulaire. Vous créez un générateur d'ondes triangulaires qui fonctionne à la fréquence PWM souhaitée. Celui-ci est envoyé à l'entrée négative d'un comparateur et le signal de commande analogique à l'entrée positive. Le résultat est soit complètement haut, soit complètement bas, mais le rapport cyclique est linéairement proportionnel au signal de commande. Les premiers amplis audio de classe D fonctionnaient sur ce principe, par exemple.

Dans de nombreux cas, le PWM n'avait pas besoin d'être super linéaire, donc l'onde triangulaire n'a pas besoin d'avoir des bords parfaitement droits. Leur permettre d'être un peu exponentiels peut simplifier le circuit.

Ajoutée:

Mark Rages a souligné que lorsque vous dites "servomoteur", vous pourriez faire référence aux petits moteurs de loisir à position contrôlée utilisés sur les modèles réduits d'avions et similaires. Ma réponse s'applique au contrôle d'un moteur en supposant que vous ayez une tension analogique proportionnelle à la force avec laquelle vous voulez conduire le moteur. Elle ne s'applique pas à ces "servos hobby". Celles-ci ne sont pas contrôlées par PWM dans le sens courant de ce terme, mais par la largeur des impulsions qui doivent généralement être de 1 à 2 ms répétées toutes les 20 à 50 ms environ. Si cette question concerne vraiment les servos de loisir, elle devrait être corrigée pour que cela soit clair.

Olin Lathrop
la source
Bien que cela accomplisse la tâche, il est important de noter que @pstan veut piloter un servo, et donc avoir un générateur de fonctions dans son implémentation ne sera probablement pas très portable.
kevlar1818
1
Les cycles de service des servomoteurs sont généralement assez faibles, comme 10% ou moins. Et le servo utilise directement la largeur d'impulsion, pas la valeur moyenne, il est donc préférable d'utiliser un circuit qui dissocie la largeur d'impulsion du taux de répétition.
markrages
1
@kevlar: J'ai revérifié ma réponse et je ne vois toujours pas de mention d'un générateur de fonction là-dedans. Tout ce que j'ai dit, c'est que vous avez besoin d'une onde triangulaire ou de quelque chose d'assez proche. Vous n'avez certainement pas besoin d'un générateur de fonctions pour en créer un.
Olin Lathrop
@Markrages: Hein? Les moteurs voient la moyenne d'un train d'impulsions s'il est assez rapide. Quelques 100 Hz suffisent largement à cet égard pour la plupart des moteurs. La partie servo est accomplie par le schéma de contrôle, que l'OP n'a pas demandé. Il semble qu'il ait déjà un niveau analogique proportionnel à la force avec laquelle le moteur doit être entraîné.
Olin Lathrop
@Markrages: Il m'est venu à l'esprit que vous parliez de servos de loisirs, qui veulent une impulsion de 1-2 ms toutes les 20 ms environ? Votre commentaire est logique à cet égard, mais l'OP n'a pas du tout mentionné les servos de loisir.
Olin Lathrop
7

Vague triangulaire. Comparateur. Seuil de contrôle. C'est la façon fondamentale de le faire.

Cependant, si vous souhaitez contrôler un servo de loisir, ce n'est pas la meilleure façon. Le rapport cyclique varie entre 5% et 10% (1 à 2 ms de largeur d'impulsion dans une période de 20 ms), ce qui est court, et vous voudrez probablement le contrôler avec une certaine précision. Sur un 5VPPtriangle, vous devez faire varier le seuil du comparateur entre 4,5 V et 4,75 V. Toute déviation et vous ne pourrez pas contrôler le servo sur toute sa gamme. Cela nécessite des composants de précision. De plus, le générateur d'ondes triangulaires a besoin de 2 opamps, et puis il y a le comparateur .. Il y a une meilleure façon.

enter image description here

Générez d'abord une onde carrée de 50 Hz. Le moyen le plus simple:

enter image description here

Pour le 74HC1G14 a 250kΩ une résistance et un condensateur de 100 nF vous donneront une période de 20 ms.

Alimentez l'onde carrée dans un MMV (Monostable MultiVibrator). Vous pouvez le faire avec un LM555 ou utiliser un périphérique logique comme le 74HC123A . Si vous utilisez ce dernier, le temps d'impulsion est défini parREXT et CEXT:

T=REXT×CEXT

Time in μs, R en kΩet C dans nF.

Pour obtenir une largeur d'impulsion variant entre 1 ms et 2 ms, vous utilisez C = 100 nF et R = 10 kΩ en série avec un 10kΩ potmètre.

J'aurais pu le faire avec deux LM555, mais j'aurais besoin de plus de composants externes.

edit (sur les microcontrôleurs)
Je suis d'accord avec Olin (voir commentaires) qu'exclure un microcontrôleur est à courte vue (Olin a dit "idiot"). Il fut un temps où le développement d'un microcontrôleur était compliqué, mais aujourd'hui ce n'est plus vrai. Vous pouvez également avoir une interface de programmation pour quelques euros. La solution serait alors si simple qu'aucune solution sans contrôleur ne peut rivaliser avec elle: vous prenez un ATTiny5 (Olin prend un PIC10F220) dans un SOT23-6. Connectez un condensateur de découplage aux connexions d'alimentation et le potmètre à l'entrée ADC. C'est ça! 3 (trois) composants. La conversion de la lecture ADC en sortie de largeur d'impulsion est si facile que c'est presque ridicule, même pour un programmeur débutant.

Une fois que vous aurez commencé à les utiliser, vous constaterez que les microcontrôleurs offrent souvent une solution plus simple et plus flexible qu'avec d'autres circuits intégrés ou composants discrets.

une note
de votre autre question , je vois que vous faites des microcontrôleurs d'utilisation. Pourquoi voulez-vous les éviter ici?

stevenvh
la source
Comment obtenir une onde triangulaire?
m.Alin
1
@ m.Alin - Si vous voulez un triangle très propre c'est la bonne façon. Mais l'entrée de l'onduleur de mon oscillateur se rapproche également d'un triangle, bien que les pentes soient vraiment exponentielles.
stevenvh
1
localement, 555 est moins cher que 74HCT1G14 ici. +1 BTW. \
Standard Sandun
3
@stevenvh "Si vous voulez un triangle très propre, c'est la bonne façon." Selon votre logique, cela est totalement inacceptable. Veuillez inclure ceci dans votre réponse très informative et complète.
kevlar1818
2
@pstan - Si vos spécifications ne sont pas trop élevées, vous utiliserez probablement le circuit 555. C'est loin d'être parfait: la fréquence varie avec le rapport cyclique et le contrôle n'est pas linéaire. Le générateur triangle + comparateur résout ces inconvénients.
stevenvh
4

Le moyen le plus simple de générer un signal PWM consiste à introduire une onde en dents de scie ou une onde triangulaire dans une entrée d'un comparateur analogique et une tension de commande dans l'autre. Si l'on ne peut pas obtenir une onde triangulaire pure, on peut raisonnablement l'approcher en passant une onde carrée à travers un filtre RC de telle sorte que la sortie du filtre oscille entre environ 1 / 4VDD et 3 / 4VDD, puis en ajustant la tension de commande dans le comparateur afin que la tension de commande qui devrait produire un rapport cyclique de 0,01% soit convertie en la tension la plus basse de l'onde carrée filtrée, et la tension de commande qui devrait produire un cycle d'utilisation de 99,99% sera convertie en la tension la plus élevée du filtré onde carrée. Cela donnera une largeur d'impulsion qui n'est pas tout à fait proportionnellement linéaire à l'amplitude, mais qui est suffisamment proche pour de nombreuses applications.

supercat
la source
1
Et c'est exactement ce que fait le circuit NE555 tel que proposé par kevlar1818 ...
Cees Meijer
2
@CeesMeijer: L'affiche demandait un cycle de service variable et une période fixe. Je ne connais aucun moyen d'utiliser un seul 555 pour convertir une tension de commande en une onde de cycle de service variable à fréquence fixe. Cependant, cela pourrait très bien générer une onde triangulaire pour alimenter un comparateur.
supercat
Cela fait 20 ans que j'ai construit ce circuit, j'ai donc dû le rechercher. Et en effet, vous avez raison. J'ai utilisé un déclencheur externe pour obtenir une fréquence constante. Vous pouvez cependant utiliser un deuxième 555.
Cees Meijer
2

Je recommande d'utiliser un CI de contrôle d'alimentation basse tension (BiCMOS) comme l'UCC3803 . La fréquence de fonctionnement peut être facilement réglée avec un simple R et C, et le contrôle du rapport cyclique se fait facilement avec un potentiomètre. Il fonctionnera sur un rail 5V.

excerpt from TI UC3842 data sheet

L'UCC3803 est compatible avec les broches de la série UCx84x de contrôleurs PWM. Si vous voulez faire du PWM facile, vous pouvez utiliser le schéma ci-dessus, en omettant R1, le 2N2222 et le pot de réglage ISENSE 5k (attachez simplement la broche 3 à la terre). Vous pouvez probablement également omettre les deux résistances de 4,7 k en série avec le potentiomètre de réglage de l'amplificateur d'erreur et passer directement à Vref et Gnd, ou utiliser un diviseur de tension explicite si aucun réglage n'est nécessaire. (Vous n'avez pas précisé si vous devez modifier facilement le cycle d'utilisation).

L'IC est capable de piloter environ 1A de courant. (Si votre servomoteur a une entrée PWM, c'est un point discutable.)

Adam Lawrence
la source
msgstr "peut nécessiter un pilote externe pour réellement alimenter le moteur". Êtes-vous sûr? J'ai toujours pensé que l'entrée PWM n'était qu'un niveau de signal à faible courant. Pour l'alimentation, un servo a une troisième connexion.
stevenvh
De plus, je me souviens juste que le rapport cyclique n'est que de 5 à 10%. Cela peut être le bon moyen de fournir de l'énergie.
stevenvh
C'est sympa. Mais compte toujours beaucoup de composants externes.
Standard Sandun
Ressemble plus à un UEMIG: Générateur EMI inutile. :-(
stevenvh
Il semble également avoir besoin d'une entrée 10V minimum. Ce n'est peut-être pas le meilleur choix ...
Steven