我可以通过在树莓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/