我正在尝试使用由 mega 2560 控制的镜像振镜来引导激光。作为第一个测试,我希望激光通过等间隔跳跃沿一个轴移动,但我遇到了麻烦。我想知道我的代码中是否有任何明显的问题(我怀疑可能是这种情况,因为我是计时器和中断的新手)?
void setup()
{
TCCR3B = _BV(CS30); //high freq ~50khz
pinMode(5, OUTPUT);
}
void loop() {
int output1= 5;
while(output1<255){
analogWrite(5,output1);
output1+=40;
delay(500);
}
output1=5;
}
当我运行这段代码时,镜子确实实现了它应该的完整 5 度运动范围。问题是,镜子不是移动相等的间隔,而是在我认为是 while 循环的前两次迭代的情况下旋转了 0.8 度,然后镜子跳跃了大约 3.5 度的旋转。然后,在 while 循环的最后几次迭代中,镜子再次以小增量旋转 0.75 度。
我最初尝试对所有定时器和 PWM 设置使用我自己的设置,但这也不起作用:
void setup()
{
TCCR3A = TCCR3B = 0;
TCCR3A = _BV(COM3A1) | _BV(WGM31); //non-inverting
TCCR3B = _BV(CS30) | _BV(WGM32) | _BV(WGM33); //prescalar=1, fast pwm
ICR3= 500;
OCR3A= 6;
pinMode(5, OUTPUT);
}
void loop() {
while(OCR3A<500){
OCR3A+=80;
delay(500);
}
OCR3A=6;
}
使用第二个代码,镜子会旋转 1 度并保持原位。
编辑:我在 arduino 和镜子之间确实有一个电流增益电路,但我已经用函数发生器测试了那个电路和镜子。关闭函数发生器,它们工作正常。