【发布时间】:2016-01-05 14:57:16
【问题描述】:
我可以使用 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的寄存器在哪里修改?
【问题讨论】:
-
您向我们展示了一些您认为有效的代码,然后告诉我们您有一些其他代码不起作用,但您没有展示。那么您希望我们告诉您您未显示的代码有什么问题!代码的正确操作似乎依赖于
pwm和clk的适当值,您在任何情况下都没有显示。使用pigpio library 可能会为您省去一些麻烦,它允许在任何 GPIO 引脚上进行 PWM,并巧妙地使用 DMA、PWM 和 PCM 外设,以实现最小的软件开销和良好的精度。 -
... 或 ServoBlaster,pigpio PWM 控制方法由此派生。
-
@Clifford:我不想在任何 GPIO 上使用软件 PWM。我需要做的只是在提供硬件 PWM 的 GPIO 19 特定引脚上使用硬件 PWM。但是,我不知道要更改哪些值,因为原始代码不是我的。我真正关心的只是操纵 RPI 的寄存器
-
阅读指向 pigpio 的 PWM 实现所基于的 ServoBlaster 库的链接 - 它不是“软件 PWM”,适用于驱动伺服。然而,我的观点仍然存在;您没有发布适当的代码。您告诉我们您已经定义了宏
PWM1_MS_MODE等,但没有向我们展示这些宏的使用位置。简单地定义它们当然是不够的。 “它根本不起作用”也不是很有帮助;在这一点上,我将在调试器中单步执行代码以查看 实际 发生了什么。
标签: linux embedded raspberry-pi2 gpio pwm