arduino外部中断自定义控制270度PM15S舵机代码
时间: 2023-07-31 13:08:09 浏览: 148
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); // 根据角度值计算出对应的脉冲宽度
}
```
在上述代码中,我们使用了一个外部中断引脚(`INTERRUPT_PIN`)来触发中断函数(`isr()`),每当外部中断引脚从低电平变为高电平时,就会触发中断函数。在中断函数中,我们首先根据当前脉冲宽度值计算出对应的角度值,然后将角度增加 10 度,如果角度超过 270 度,就将角度重置为 0 度。最后,我们再根据角度值计算出对应的脉冲宽度值,并将其赋值给脉冲宽度变量(`pulseWidth`)。在 `loop()` 函数中,我们通过 `digitalWrite(SERVO_PIN, HIGH)` 将舵机控制引脚置为高电平,然后通过 `delayMicroseconds(pulseWidth)` 延迟脉冲宽度时间,再通过 `digitalWrite(SERVO_PIN, LOW)` 将舵机控制引脚置为低电平。最后,我们再通过 `delay(20)` 等待20毫秒,使舵机有足够的时间转动到指定角度。需要注意的是,由于 PM15S 舵机的转动角度范围是 0~270 度,因此我们需要根据具体的角度值来计算出对应的脉冲宽度值。在这个示例代码中,我们使用了 `map()` 函数来进行角度值和脉冲宽度值之间的转换。
阅读全文