我正在尝试使用由巨型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度移动范围。问题是镜子旋转相等的间隔而不是移动等于.8度相当于我认为是while循环的前两次迭代,然后镜子跳转大约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和镜子之间有一个电流增益电路,但我用功能发生器测试了电路和镜子。关闭函数发生器,它们工作正常。