我正在使用Arduino ServoTimer2库(因为我还需要在同一草图中使用VirtualWire库。我不知道常规{{3}中是否也存在此问题库,但我认为值得一提。
每当我调用servo.attach(pin)
时,伺服从其当前位置移动到其范围的正中间(1500微秒)。这是一个问题,因为我的Arduino需要定期安装和拆卸伺服系统,然后重新设置回中心会失去我项目的目的。
我读到在servo.write(xxxx)
之前立即调用servo.attach(pin)
会导致它默认为xxxx而不是1500,但这对我来说似乎不起作用(我甚至不理解它是如何工作的如果引脚没有连接......)。有什么想法吗?
*
修改 我的解决方案
感谢djUniversal的回答,我让它工作,以便伺服在连接时不会移动。如果其他人想要做同样的事情,我所做的只是进入ServoTimer2.cpp
并注释掉initISR
方法的前3行。它现在看起来像这样:
static void initISR()
{
// for(uint8_t i=1; i <= NBR_CHANNELS; i++) { // channels start from 1
// writeChan(i, DEFAULT_PULSE_WIDTH); // store default values
// }
servos[FRAME_SYNC_INDEX].counter = FRAME_SYNC_DELAY; // store the frame sync period
Channel = 0; // clear the channel index
ISRCount = 0; // clear the value of the ISR counter;
/* setup for timer 2 */
TIMSK2 = 0; // disable interrupts
TCCR2A = 0; // normal counting mode
TCCR2B = _BV(CS21); // set prescaler of 8
TCNT2 = 0; // clear the timer2 count
TIFR2 = _BV(TOV2); // clear pending interrupts;
TIMSK2 = _BV(TOIE2) ; // enable the overflow interrupt
isStarted = true; // flag to indicate this initialisation code has been executed
}
一旦我这样做并重新编译,伺服器在连接时立即停止移动,现在只有在写入时才会移动。
答案 0 :(得分:2)
ServoTimer2定义了一个起始脉冲:
#define DEFAULT_PULSE_WIDTH 1500
.h文件中的。每次伺服对象初始化时,它都被用作通道的起始点。常规的伺服库具有相同的机制。
如果你想做你想做的事,你需要修改库文件以满足你的需要,否则这是不可能的。
为什么你需要继续拆卸伺服系统?你有什么可以改变的吗?
答案 1 :(得分:0)
为完成此操作,对于标准伺服库,它可以使用先前值(来自EEPROM)初始化伺服器,并在其后附加引脚:
// set servo to remembered position!
servo_9.write(pos);
// attach pin after position setting, so restarting from previous position
servo_9.attach(9);