arduino外部中断自定义控制270度PM15S舵机打想要的角度函数,函数参数传入为角度
时间: 2024-03-21 18:41:09 浏览: 117
arduino外部中断红外遥控
5星 · 资源好评率100%
以下是一个使用 Arduino 外部中断自定义控制 270 度 PM15S 舵机并打想要的角度函数的示例代码:
```c
#define INTERRUPT_PIN 2 // 外部中断引脚
#define SERVO_PIN 9 // 舵机控制引脚
volatile int pulseWidth = 1500; // 脉冲宽度变量,加上 volatile 关键字,表示该变量可能被中断修改
void setup() {
pinMode(INTERRUPT_PIN, INPUT_PULLUP); // 设置外部中断引脚为输入模式,并启用内部上拉电阻
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), isr, RISING); // 绑定中断函数
pinMode(SERVO_PIN, OUTPUT); // 设置舵机控制引脚为输出模式
}
void loop() {
digitalWrite(SERVO_PIN, HIGH); // 将舵机控制引脚置为高电平
delayMicroseconds(pulseWidth); // 延迟脉冲宽度时间
digitalWrite(SERVO_PIN, LOW); // 将舵机控制引脚置为低电平
delay(20); // 等待20毫秒
}
void isr() {
int angle = map(pulseWidth, 1000, 2000, 0, 270); // 根据脉冲宽度计算出对应的角度值
angle += 10; // 当外部中断触发时,将角度增加 10 度
if (angle > 270) {
angle = 0; // 如果角度超过 270 度,将角度重置为 0 度
}
pulseWidth = map(angle, 0, 270, 1000, 2000); // 根据角度值计算出对应的脉冲宽度
}
void setAngle(int targetAngle) {
if (targetAngle < 0 || targetAngle > 270) {
return; // 如果目标角度不在 0~270 度之间,直接返回
}
int targetPulseWidth = map(targetAngle, 0, 270, 1000, 2000); // 根据目标角度计算出对应的脉冲宽度
for (int i = 0; i < 10; i++) { // 循环执行 10 次,以确保舵机转到目标角度
pulseWidth = targetPulseWidth;
delay(20);
}
}
```
在上述代码中,我们新增了一个名为 `setAngle()` 的函数,用于设定舵机的目标角度。在该函数中,我们首先判断目标角度是否在 0~270 度之间,如果不在则直接返回。然后,我们根据目标角度计算出对应的脉冲宽度值,并使用一个简单的循环来确保舵机转到目标角度。在循环中,我们将脉冲宽度变量(`pulseWidth`)设置为目标脉冲宽度值,并延迟20毫秒,以确保舵机有足够的时间转动到目标角度。需要注意的是,由于舵机的转动速度较慢,因此在 `setAngle()` 函数中,我们使用了一个简单的循环来确保舵机转到目标角度。如果需要更精确的控制,可以使用 PID 控制等算法来实现。
阅读全文