【发布时间】:2015-10-04 10:14:16
【问题描述】:
我基本上是在按下特定按钮时尝试在多个伺服电机上执行 链 动作。以下代码工作正常,但只能在多个伺服器上执行单个动作,即当按下按钮 伺服1 移动到 900,伺服2 移动到 1500,否则它们会回到标准位置。
我想要实现的是一组动作,例如当按下按钮时,我希望两个舵机都摆动(0 到 180 到 0(3 个不同的动作))。我尝试使用延迟功能并更改伺服的值,但它不起作用,我假设这是因为延迟变得大于我的快速 PWM 时间段。
void main()
{
DDRB = 0xFF;
DDRC = 0x00;
PORTC = 0XFF;
TCCR1A |= 1<<WGM11;
TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;
TIMSK |= 1<<OCIE1A;
ICR1=19999;
sei();
uint16_t Servo1 = 2000, Servo2 = 900;
while(1)
{
if(bit_is_clear(PINC,0))
{
Servo1 = 900, Servo2 = 1500;
}
else{
Servo1 = 1500, Servo2=2200;
}
if(TCNT1>=800 && TCNT1<=2400)
{
if (TCNT1 >= Servo1 && bit_is_set(PORTB,PINB0)) PORTB &= ~(1<<PINB0);
if (TCNT1 >= Servo2 && bit_is_set(PORTB,PINB1)) PORTB &= ~(1<<PINB1);
}
}
}
ISR(TIMER1_COMPA_vect)
{
PORTB = 0xFF;
}
我该怎么做呢? 任何帮助表示赞赏。
【问题讨论】:
-
如果可能的话,我会选择带硬件 PWM 的 MCU。也许您的计时器硬件甚至支持它。至少你应该有一个输出比较功能,它允许在定时器结束时切换一个引脚。在这种情况下,唯一涉及的软件将是重置计时器,而您的 CPU 在此期间可以做其他事情。