2016-01-05 3 views
2

Je pourrais conduire un servo en utilisant le canal PWM0 sur GPIO 18 Raspberry Pi avec code suivant c:Dans Raspberry Pi 2, comment configurer le canal PWM1?

#define BCM2708_PERI_BASE  0x3F000000 
#define PWM_BASE    (BCM2708_PERI_BASE + 0x20C000) 
#define CLOCK_BASE    (BCM2708_PERI_BASE + 0x101000) 
#define GPIO_BASE    (BCM2708_PERI_BASE + 0x200000) 

#define PWM_CTL 0 
#define PWM0_RNG 4 
#define PWM0_DAT 5 

#define PWM0_MS_MODE 0x0080 // Run in MS mode 
#define PWM0_USEFIFO 0x0020 // Data from FIFO 
#define PWM0_REVPOLAR 0x0010 // Reverse polarity 
#define PWM0_OFFSTATE 0x0008 // Ouput Off state 
#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty 
#define PWM0_SERIAL  0x0002 // Run in serial mode 
#define PWM0_ENABLE  0x0001 // Channel Enable 

#define PWMCLK_CNTL 40 
#define PWMCLK_DIV 41 

// stop clock and waiting for busy flag doesn't work, so kill clock 
*(clk + PWMCLK_CNTL) = 0x5A000000 | (1 << 5); usleep(10); 

// wait until busy flag is set 
while ((*(clk + PWMCLK_CNTL)) & 0x00000080){} 

*(clk + PWMCLK_DIV) = 0x5A000000 | (Divisor << 12); 
*(clk + PWMCLK_CNTL) = 0x5A000011; 
*(pwm + PWM_CTL) = 0; usleep(10); 

*(pwm + PWM0_RNG) = Counts; usleep(10); 
*(pwm + PWM0_DAT) = (int) (DutyCycle * Counts/100); usleep(10); 
*(pwm + PWM_CTL) |= ((1 << 7) | (1 << 0)); 

Cependant, quand j'ai essayé de conduire une autre servo sur un autre GPIO sur le canal PWM1, il n'a pas travailler du tout. Le canal PWM1 a les valeurs suivantes:

#define PWM1_RNG 8 
#define PWM1_DAT 9 

#define PWM1_MS_MODE 0x8000 // Run in MS mode 
#define PWM1_USEFIFO 0x2000 // Data from FIFO 
#define PWM1_REVPOLAR 0x1000 // Reverse polarity 
#define PWM1_OFFSTATE 0x0800 // Ouput Off state 
#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty 
#define PWM1_SERIAL  0x0200 // Run in serial mode 
#define PWM1_ENABLE  0x0100 // Channel Enable 

Quelqu'un peut-il me dire où les registres sont modifiés de PWM0 et PWM1?

+1

Vous nous avez montré un code que vous dites fonctionne, puis nous a dit que vous avez un autre code qui ne fonctionne pas, mais vous ne l'avez pas montré. Le bon fonctionnement du code semble dépendre des valeurs appropriées de 'pwm' et' clk', que vous n'avez pas montrées dans tous les cas Vous pourriez peut-être vous épargner quelques problèmes en utilisant la [bibliothèque pigpio] (http://abyz.co.uk/rpi/pigpio/cif.html) qui permet PWM sur n'importe quel GPIO broche avec une utilisation intelligente des périphériques DMA, PWM et PCM pour un minimum de frais généraux et une bonne précision. – Clifford

+0

... ou [ServoBlaster] (https://github.com/richardghirst/PiBits/tree/master/ServoBlaster) à partir duquel la méthode de contrôle pigpio PWM a été dérivée. – Clifford

+0

@Clifford: Je ne veux pas utiliser le logiciel PWM sur un GPIO. ce que je dois faire est juste d'utiliser le matériel PWM sur une broche particulière qui est GPIO 19 qui fournit le matériel PWM. Cependant, je ne pouvais pas savoir quelles valeurs changer car le code original n'est pas le mien. Ma seule préoccupation est de manipuler les registres de RPI. – mohasalah

Répondre

0

Éclaircir disponibles documentation, vous devez définir GPIO45 à sa Fonction 0 Autre. Les registres de périphériques PWM sont décrits dans le Broadcom peripheral documentation (il s'agit du BCM2835 du RPi1, mais il est généralement identique au BCM2836 du RPi par rapport au jeu de périphériques.) Notez que les canaux PWM sont plutôt appelés PWM1/2 PWM0/1 dans les tables de registre

+0

Merci M. Clifford pour votre réponse, pouvez-vous me dire s'il vous plaît où trouver les registres nécessaires dans [Périphériques Boardcom BCM2835] (https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM- Périphériques.pdf)? Je veux dire comment différencier les deux PWM dans cette documentation? J'ai essayé de les localiser mais j'ai échoué. – mohasalah

+0

@mohasalah: Il y a un contrôleur PWM avec deux canaux. Le tableau en 9.6 résume la carte du registre. Il existe des registres RNG et DAT distincts pour chaque PWM. Le registre FIFO peut servir les deux canaux alternativement ou l'un ou l'autre. Le registre CTL est partagé par les deux canaux avec des sous-champs séparés pour chaque canal, le cas échéant. Je ne fais que lire la documentation disponible. La documentation de Broadcom est plutôt laconique et ne correspond pas à la qualité que vous pouvez attendre d'un périphérique généralement disponible. Si vous éprouvez des difficultés, utilisez la bibliothèque comme suggéré. – Clifford