0

我正在尝试使用由 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 和镜子之间确实有一个电流增益电路,但我已经用函数发生器测试了那个电路和镜子。关闭函数发生器,它们工作正常。

4

0 回答 0