我可以通过在树莓pi的gpio 18上使用pwm0通道来驱动伺服,代码如下:

#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) );

然而,当我试图在pwm1通道上的另一个gpio上驱动另一个伺服时,它根本不起作用。PWM1通道具有以下值:
#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

有人能告诉我从pwm0和pwm1修改寄存器的位置吗?

最佳答案

涉水通过可用documentation,您必须将gpio45设置为其备用功能0。
Broadcom peripheral documentation中描述了pwm外围寄存器(这指的是rpi1的bcm2835,但与rpi的bcm2836在外围集方面基本相同)。注意,在寄存器表中,脉冲宽度调制通道被称为PWM1/2,而不是PWM0/1。

关于linux - 在Raspberry Pi 2中,如何配置PWM1 channel ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34614655/

10-14 06:06