Question:
Utilisation de PWM sur Raspberry Pi 3 vs Pi 2 avec la bibliothèque BCM2835
Sean
2016-06-03 20:53:26 UTC
view on stackexchange narkive permalink

Dans une application, nous utilisons le raspberry p pour contrôler la vitesse du moteur via PWM. Nous avons pu obtenir un code de travail valide sur le raspberry pi 2, mais lorsque nous avons transféré ce code et les pilotes sur le pi 3, le code ne fonctionne tout simplement pas. Y a-t-il quelque chose de facile qui nous manque pour passer du pi 2 au pi 3 pour faire fonctionner ce code?

  #include <bcm2835.h> # inclure <stdio.h> # définissent PIN RPI_BPLUS_GPIO_J8_32 # définissent PIN2 RPI_BPLUS_GPIO_J8_33 # définir CTL_PIN RPI_BPLUS_GPIO_J8_29 # définissent CTL_PIN2 RPI_BPLUS_GPIO_J8_31 # définir PWM_CHANNEL 0 # définissent PWM_CHANNEL2 1 # define GAMME 1024int main (int argc, char ** argv) {// bcm2835_delay (10000); if (! bcm2835_init ()) renvoie 1; // Réglez la broche de sortie sur Alt Fun 5, pour permettre au canal PWM 0 d'y être émis bcm2835_gpio_fsel (PIN, BCM2835_GPIO_FSEL_ALT0); bcm2835_gpio_fsel (PIN2, BCM2835_GPIO_FSEL_ALT0); bcm2835_gpio_fsel (CTL_PIN, BCM2835_GPIO_FSEL_OUTP); bcm2835_gpio_fsel (CTL_PIN2, BCM2835_GPIO_FSEL_OUTP); // Le diviseur d'horloge est réglé sur 16. // Avec un diviseur de 16 et une plage de 1024, en mode MARKSPACE, // la fréquence de répétition des impulsions sera // 1,2 MHz / 1024 = 1171,875 Hz, adapté à la conduite d'un moteur à courant continu avec PWM bcm2835_pwm_set_clock (BCM2835_PWM_CLOCK_DIVIDER_16); bcm2835_pwm_set_mode (PWM_CHANNEL, 1, 1); bcm2835_pwm_set_range (PWM_CHANNEL, RANGE); bcm2835_pwm_set_mode (PWM_CHANNEL2, 1, 1); bcm2835_pwm_set_range (PWM_CHANNEL2, RANGE); // Varie le rapport PWM m / s entre 1 / RANGE et (RANGE-1) / RANGE int direction = 1; données int = 1; int j; bcm2835_gpio_write (CTL_PIN, HIGH); bcm2835_gpio_write (CTL_PIN2, HIGH); pour (j = 0; j<4096; j ++) {if (j == 2048) {bcm2835_gpio_write (CTL_PIN, LOW); // bcm2835_gpio_write (CTL_PIN2, LOW); } si (données == 1) direction = 1; else if (data == RANGE-1) direction = -1; données + = direction;
bcm2835_pwm_set_data (PWM_CHANNEL, données); bcm2835_pwm_set_data (PWM_CHANNEL2, données); bcm2835_delay (10); } bcm2835_pwm_set_data (PWM_CHANNEL, 0); bcm2835_pwm_set_data (PWM_CHANNEL2, 0); bcm2835_close (); retourne 0;}  
Seriez-vous en mesure de préciser «ne fonctionne tout simplement pas»? Est-ce que ça marche? Ça marche mal? Lève-t-il des exceptions? Y a-t-il de mauvais incendies?
Il y a une [discussion sur la liste de diffusion libbcm2835] (https://groups.google.com/forum/#!searchin/bcm2835/Pi$203|sort:relevance/bcm2835/rencLf-Rl2o/VsDPjxXrBQAJ) concernant le Pi 3 où cela fonctionne apparemment à des fins de base (basculer un GPIO) mais ne fait pas référence à PWM. Dans ce fil, l'auteur mentionne «l'ajout de notes à la documentation» sur le Pi 3 dans «la prochaine version» mais AFAICT la version actuelle (1.50) est antérieure à cette discussion. Vous devriez probablement vous inscrire sur la liste de diffusion et poser des questions à ce sujet.
@goobering bien sûr, dans notre code de test, les moteurs tournent dans une direction accélérant vers le haut puis vers le bas, puis faites de même dans le sens inverse. Cela fonctionne sur le pi2. Lorsqu'il est exécuté sur le pi 3, il n'y a tout simplement aucun mouvement dans les moteurs. Il se compile correctement et maintenant des erreurs sont générées lors de l'exécution.
Ce problème semble être limité à la bibliothèque bcm2835.
Deux réponses:
Nishant Kelkar
2016-08-18 14:17:51 UTC
view on stackexchange narkive permalink

Voici le fil de discussion pertinent pour ce problème - https://groups.google.com/forum/#!searchin/bcm2835/pwm 20 $ pas $ 20working% 7Csort: pertinence / bcm2835 / mZjLtVmlKV8 / d1BheSSKAgAJ

Selon la discussion, vous auriez besoin des autorisations sudo / root lors de l'exécution de l'exécutable C pour que le PWM fonctionne.

omotto
2017-07-22 01:53:15 UTC
view on stackexchange narkive permalink

J'ai eu le même problème tout à l'heure! A la fin j'ai découvert que le GPIO18 fonctionne correctement alors que GPIO12 ne fonctionne pas (il n'y a pas de signal PWM).

Il suffit de changer:

  #define PIN RPI_GPIO_P1_12  

par

  #define PIN RPI_GPIO_P1_18  

C'est tout.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...