Puis-je utiliser le GPIO pour la modulation de largeur d'impulsion (PWM)?


97

Puis-je utiliser le GPIO comme sortie de modulation de largeur d'impulsion ?

Si oui, comment pourrais-je m'y prendre et combien de sorties PWM distinctes et simultanées puis-je avoir?


Vous devez probablement spécifier le modèle que vous utilisez. Ils sont tous légèrement différents.
not2qubit

2
@ user1147688 Cette question a été posée lorsqu'il n'y avait qu'un seul modèle!
Berry120

Réponses:


76

Comme l'a suggéré Alex Chamberlain , la bibliothèque WiringPi semble prendre en charge la sortie matérielle PWM sur une ou deux broches GPIO, selon le modèle, et le logiciel PWM sur l'une des autres broches GPIO. Pendant ce temps, la bibliothèque RPIO.PWM effectue PWM par DMA sur n’importe quelle broche GPIO. Effectivement, il s’agit d’un compromis entre matériel et logiciel PWM, offrant une résolution de synchronisation de 1 µs par rapport à 100 µs avec le logiciel PWM de WiringPi [1] .

Laquelle de celles-ci convient à vos applications dépend du nombre de sorties PWM dont vous avez besoin et des performances que vous souhaitez obtenir de ces sorties.

Si votre application tolère une résolution de synchronisation faible et une forte gigue, vous pouvez utiliser un logiciel ou une boucle de synchronisation assistée par DMA. Si vous souhaitez une PWM plus précise et à plus faible jitter, vous aurez peut-être besoin d'une assistance matérielle.

Quand le logiciel PWM peut-il convenir?

Si vous souhaitez faire clignoter une série de DEL avec différentes cadences visibles par l'homme (10 de hertz) avec des exigences de réponse en temps réel, la boucle logicielle peut gérer autant de PWM que vous avez de broches GPIO.

Quand le matériel PWM peut-il convenir?

Si vous souhaitez contrôler un servo-moteur avec des exigences de réponse en temps réel difficiles, vous devrez utiliser du matériel PWM. Même dans ce cas, vous pouvez avoir des problèmes pour assurer une réponse en temps réel à la boucle d'asservissement qui lie l'entrée du codeur à la sortie PWM.

Une boucle d'asservissement stable doit lire les codeurs à un débit régulier (faible gigue), écrire les valeurs de sortie PWM révisées à un débit normal et le temps de latence entre ceux-ci doit être fixé (faible gigue globalement). Si vous ne pouvez pas faire cela, vous devrez alors accorder un réglage doux à votre moteur afin d'éviter qu'il ne devienne instable sous charge. C'est difficile à faire avec un système d'exploitation multitâche sans support bas niveau.

Que faire si j'ai besoin de plus de sorties PWM matérielles?

Si vous devez exécuter plus de boucles d'asservissement que de sorties PWM matérielles, vous devrez probablement les décharger sur un autre périphérique pour garantir des performances temps réel dures, reléguant votre Raspberry Pi au rang de superviseur temps réel .

Une option pourrait être quelque chose comme le pilote PWM / Servo 12 bits Adafruit 16 - interface I²C - PCA9685 qui vous permettrait de contrôler 16 sorties PWM avec seulement quelques broches de GPIO pour le bus I²C. Pour un exemple de son utilisation, consultez la publication de travail I²C 16 canaux PWM / Servo Breakout sur les forums Raspberry Pi.

1. Merci à dm76 pour cette suggestion, mais heather indique que RPIO.PWM risque de ne plus fonctionner pour les nouveaux modèles pi.


Puis-je utiliser l'approche logicielle PWM pour faire fonctionner des moteurs à courant continu?
Gideon

@ gideon - Oui, les amplificateurs de puissance de moteur que j'ai utilisés ont tous pris l'entrée PWM.
Mark Booth le

2
Pour votre information, la bibliothèque RPI ( pythonhosted.org/RPIO/pwm_py.html ) semble avoir une résolution bien meilleure (1us) par rapport à WiringPi avec une résolution de
100us

@ MarkBooth - Pas de probs. La bibliothèque est vraiment bien écrite et peut être utilisée comme remplacement immédiat de RPi.GPIO, ce qui est très pratique si vous démarrez un projet avec ce dernier et
réalisez

RPIO.PWM risque de ne plus fonctionner pour les nouveaux modèles pi, je pense.
bruyère

39

Matériel PWM

Oui, il existe une sortie PWM matérielle sur le Raspberry Pi, connectée à P1-12 (GPIO18). De plus, des sorties PWM pourraient être ajoutées en utilisant une interface I²C ou SPI ; certaines personnes ont eu du succès avec cela ( post sur le forum ).

Exemple de code

Vous pouvez utiliser la bibliothèque WiringPi pour contrôler la broche PWM; vous pouvez consulter le code pour éviter d'inclure toute la bibliothèque.

Logiciel PWM

Le Raspberry Pi ne convient à aucun logiciel PWM sérieux, car Linux n’est pas un système d’exploitation en temps réel.


1
Question, quelle est la définition ou un exemple de logiciel sérieux PWM? Et quels sont les "systèmes d'exploitation en temps réel" et y at-il une chance d'obtenir un sur un Pi?
AnthonyBlake

@AnthonyBlake Eh bien, vous pouvez probablement contrôler la luminosité d'une lumière à l'aide du logiciel PWM, mais je suspecte un moteur de caler. Il n’est pas nécessaire de faire un logiciel PWM, le matériel est plus simple et plus efficace. Les systèmes d'exploitation en temps réel seront mieux expliqués par Google; ils garantissent certaines choses sur la durée et la fréquence d'exécution des logiciels.
Alex Chamberlain

2
@AnthonyBlake Un "système d'exploitation temps réel" (RTOS) est un système d'exploitation qui vous donne une garantie quant à la limite supérieure de temps d'exécution. Comme si vous disiez au programme "Oui, vous aurez un temps d’exécution de 33 ms (avec une tolérance de 2 ms) pour inverser ce bit de la broche GPIO afin de donner à votre moteur pas à pas un signal dans la fenêtre temporelle exacte quand il en a besoin. sur ça!" Il y a une RT Linux là-bas. Je ne sais pas si cela a été porté sur le RPi (pour le moment).
Orithena

Désolé Alex, je n'ai pas intentionnellement volé une autre partie de votre réponse, mais je viens de remarquer que nous sommes arrivés au même message sur le forum via différents itinéraires.
Mark Booth

2
Les modèles plus récents à 40 broches ont un deuxième PWM matériel connecté à GPIO19 (broche 35).
Kevin

12

Les PIS récents disposent de deux canaux PWM matériels. De plus, des impulsions PWM temporisées par le matériel peuvent être générées indépendamment sur tout le GPIO connecté à l'en-tête d'extension à 40 broches.

En pratique, cela signifie qu'il existe deux canaux PWM extrêmement précis et que tous les autres GPIO peuvent avoir un PWM de style Arduino (800 Hz, 0 désactivé - 255 entièrement activé).

Par exemple , servoblaster et mon pigpio , etc.


Bonne réponse! Comment puis-je utiliser ces deux PWM HW? Je dois contrôler 2 servos, je sais que vous dites que servoblaster et pigpio sont acceptables, mais je me pose des questions sur le HW PWM, car je ne trouve rien à leur sujet ... existe-t-il une documentation à ce sujet? J'ai un RPi 2 V1.1 pour les tests.
Kozuch


2
Une charge de processeur importante ne devrait pas faire la différence. Une charge réseau importante peut faire la différence pour gpioServo, en particulier si l’échantillonnage est effectué à 1 MHz plutôt qu’à la fréquence par défaut de 200 kHz. La fréquence est de 50 (Hz), la plage de cycles de travail va de 0 à 1 000 000 (mappée à la vraie valeur sous-jacente de 0 à 5000000). 1 ms correspond à 1 ms en 20 ms, donc un cycle de travail de 5%, donc 50000, 1,5 ms -> 7,5% -> 75000, 2 ms -> 10% -> 100000.
joan

1
Page 102 de BCM2835 Périphériques ARM indique les différents modes pouvant être attribués au GPIO. Recherchez en ligne les GPIO vers les différents en-têtes d’extension de modèle Pi.
joan

1
@ user1147688 PLLD (500 MHz) est utilisé comme horloge PWM principale. En raison de la manière dont cela fonctionne, la fréquence de base du PWM est de 250 MHz. Pour pouvoir allumer et éteindre (assez essentiel pour PWM), le maximum est de 125 MHz. Vous pouvez doubler les chiffres en utilisant PLLC (1000 MHz), mais cette PLL varie en fonction de la vitesse d'horloge principale.
joan

2

Ce n’est pas vraiment un système d’exploitation temps réel, mais RISC OS pour Raspberry Pi est un système multitâche coopératif. Vous pouvez ainsi exécuter facilement une application dotée de 100% de CPU, ce qui vous permet de mieux gérer votre minutage. Ne vous attendez pas à faire autre chose que votre propre code.


J'ai lu quelque part qu'il existe aussi une limite matérielle quant à la fréquence de commutation d'une broche de sortie. Je pense que c'était autour de 20 MHz. Donc, ne vous attendez pas à pouvoir tirer de 300 MHz PWM ou autre, même avec une utilisation à 100% du processeur.
Ponkadoodle

@Wallacoloo: Quelles applications nécessitent 300 MHz PWM?
Peter Mortensen

2
@ PeterMortensen: Je ne sais pas comment les émetteurs radio génèrent leurs signaux, mais certains pourraient le faire avec PWM. PiFM le fait à 100 MHz. Cela semble cependant contredire mon commentaire. Je me demande donc si la broche peut toujours être commandée à cette fréquence, mais c’est simplement que la capacité de la broche atténue de tels signaux, de sorte qu’une onde carrée de 100 MHz puisse en fait osciller, par exemple (1,0 V). , 2,3 V) au lieu de la plage complète (0 V, 3,3 V).
Ponkadoodle

2

J'ai trouvé cette bibliothèque ( pi-blaster ) qui se veut "extrêmement efficace: n'utilise pas le processeur et donne des impulsions très stables".

Je ne l'ai pas encore testé, mais je le mettrai à jour dès que je le ferai (probablement aujourd'hui)


J'ai essayé cela mais jusqu'à présent, pas de chance. Autant que je sache, cela ne change pas réellement le matériel?
MrMowgli

1
Je veux juste cogner ça. Pi-Blaster a travaillé pour moi là où ces autres réponses n’ont pas fonctionné.
Seph Reed
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.