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?
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?
Réponses:
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.
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.
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.
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.
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 ).
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.
Le Raspberry Pi ne convient à aucun logiciel PWM sérieux, car Linux n’est pas un système d’exploitation en temps réel.
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.
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 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)