我可以使用Raspberry Pi的GPIO 18上的PWM0通道驱动伺服,并使用以下c代码:
#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修改的位置吗?
答案 0 :(得分:0)
浏览可用的documentation,您必须将 GPIO45 设置为备用功能0 。
PWM外设寄存器在Broadcom peripheral documentation中描述(这是指RPi1的BCM2835,但与外设的RPM的BCM2836相同。请注意,PWM通道称为PWM1 / 2而不是寄存器表中的PWM0 / 1。