我尝试驱动一个伺服与树莓派使用的PWM上的GPIO引脚18我有线的设置,如你可以看到下面。

当我驱动伺服时,我可以做到这一点没有任何问题,我使用的命令,你可以看到下面。
gpio -g mode 18 pwm
gpio pwm-ms
gpio pwmc 192
gpio pwmr 2000
gpio -g pwm 18 150
gpio -g pwm 18 200这样做很好,没有任何问题,但是当我尝试使用wiringpi对C程序执行相同的操作时,您可以看到下面的内容。
#include <wiringPi.h>
#include <stdio.h>
int main (void)
{
printf ("Raspberry Pi wiringPi test program\n");
wiringPiSetupGpio();
pinMode (18, PWM_OUTPUT) ;
pwmSetMode (PWM_MODE_MS);
pwmSetRange (2000);
pwmSetClock (192);
pwmWrite(18,150);
delay(1000);
pwmWrite(18,200);
return 0;
}程序和raspberry pi chrash,所以我必须重新启动它们,有谁知道我做错了什么,以及我如何解决这个问题,这是非常令人沮丧的?
发布于 2019-07-15 16:04:37
我花了几个星期的时间用WiringPi和C编程控制两个伺服(SG90),我推荐三件事。
1.使用BCM GPIO而不是WiringPi Pin,因为控制多个伺服,您可能需要多个引脚,如1(WiringPi Pin)/18(BCM GPIO)用于另一个伺服,对于RPi3 B+版本,它提供两个通道用于硬件脉宽调制。gpios 12/18上的通道0和gpios 13/19上的通道1,如果您使用BCM GPIO,则无需担心引脚映射问题。
2.最好确保只有一个程序访问PWM。一次引脚。根据我的经验,如果你发现使用像"gpio -g pwm 18 25“这样的命令是可行的,但是使用像"pwmWrite(18, 25)”这样的代码不会得到任何伺服响应,也许可以尝试使用"ps -A“来确定是否有其他程序正在竞争你的伺服访问。
3.最后也是对我来说最难的一个,当我在PWM. pin 18上执行pwmWrite(18, 25)时,会在PWM. pin 12上触发相同的指令,这意味着pwmWrite(18, 25)会触发pwmWrite(12, 25)。为了解决这种情况,将伺服系统的其他引脚的模式改为输入模式,并将它们都设置为下拉模式。
有关详细信息,请参阅使用PWM控制两个伺服系统的代码。gpios上的通道0 12/18。
基本功能:
void servo_init() {
servo_open(0);
delay(DELAY_SERVO);
servo_open(1);}和
void servo_open(int servo) {
switch (servo) {
case 0:
pullUpDnControl(SERVO_0, PUD_OFF);
pinMode(SERVO_0, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS);
pwmSetClock(PWM_CHANNEL_0_CLOCK);
pwmSetRange(PWM_CHANNEL_0_RANGE);
break;
case 1:
pullUpDnControl(SERVO_1, PUD_OFF);
pinMode(SERVO_1, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS);
pwmSetClock(PWM_CHANNEL_0_CLOCK);
pwmSetRange(PWM_CHANNEL_0_RANGE);
break;
default:
break;
}}和
void servo_close(int servo) {
switch (servo) {
case 0:
pinMode(SERVO_0, INPUT);
pullUpDnControl(SERVO_0, PUD_DOWN);
break;
case 1:
pinMode(SERVO_1, INPUT);
pullUpDnControl(SERVO_1, PUD_DOWN);
break;
default:
break;
}}和
void servo(int servo, int angle) {
switch (servo) {
case 0:
servo = SERVO_0;
break;
case 1:
servo = SERVO_1;
break;
default:
servo = -1;
break;
}
switch (angle) {
case 90:
value = 25;
break;
case -90:
value = 10;
break;
case 0:
value = 14;
break;
default:
break;
}
if (servo == -1) return;
pwmWrite(servo, value);}旋转一个连接到18 (BCM GPIO)的伺服
在要旋转一个之前,请先关闭其他对象
servo_close(1);
delay(DELAY_SERVO);旋转
servo(0, 90);
delay(3*DELAY_MAGIC);
servo(0, 0);将所有伺服复位到它们的初始角,以修复伺服偶尔的抖动
delay(DELAY_SERVO);
servo_init();在Raspberry上查看更多关于伺服和传感器的源代码和信息:MY GitHub
发布于 2021-07-07 07:18:24
尝试"sudo ./server.“希望它能工作。
https://stackoverflow.com/questions/43870751
复制相似问题