请教定时器中断问题!
请问一下,下面的平衡车代码中,为何定时器中断是放在初始化函数中执行的,而不是放在LOOP主程序中,新手有点理解不了程序执行的顺序了! 谢谢!void setup()
{
//---------------
// Wire.begin();
Serial.begin(9600);
accelgyro.initialize();
delay(100);
pinMode(TN1,OUTPUT);
pinMode(TN2,OUTPUT);
pinMode(TN3,OUTPUT);
pinMode(TN4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
//Serial.println("ki ka kb kc");
delay(100);
// -----------
pinMode(PinA,INPUT); //D2脚为输入
pinMode(PinB,INPUT); //D3脚为输入
attachInterrupt(0, blinkA,FALLING);//注册中断0调用函数blinkA
attachInterrupt(1, blinkB, FALLING);//注册中断1调用函数blinkB
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
digitalWrite(encoderPinA, HIGH);
digitalWrite(encoderPinB, HIGH);
// time = millis(); //时间初值
delay(100);
FlexiTimer2::set(10, flash); // call every 500 1ms "ticks"
FlexiTimer2::start();
}
void loop()
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取6050的值
SDEER();//调用中断函数,蓝牙控制WSAD
kp=analogRead(0)*0.005;
ki=analogRead(1)*0.005;
kd=analogRead(2)*0.005;
kpp=analogRead(3)*0.005;
PWMB(); //电机中断函数,两个电机,前后左右转动
// Serial.print(position_dot);
// Serial.print(',');
/*
Serial.print(countA);
Serial.print(',');
Serial.print(countB);
Serial.print(',');
Serial.print(angleA);
Serial.print(',');
Serial.print(omega);
Serial.print(',');
Serial.println(Output);
*/
}
FlexiTimer2::set(10, flash); // call every 500 1ms "ticks"
这是设置定时中断
FlexiTimer2::start();
这是定时中断开始
要是放到loop()里不就每次都设置一下,每次都开始一下了吗 我是这么理解的 我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通! swfzz 发表于 2014-4-23 12:12 static/image/common/back.gif
我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通!
定时器有各种用法,如多少时长发出中断,或受外面什么出发过多少时间产生中断,因此在启用中断前必须初始化,只要用法没有改变,不必每次都去设置,在loop中会按设置行事的. 本帖最后由 swfzz 于 2014-4-23 14:12 编辑
哦,忽然明白了,初始化后,他只管到时间就做该做的事,而不会管什么其它的,所以放在哪都无所谓,只要初始化就行了,谢谢!
下一步整明白,为啥我的GY-86用MWC 2.2飞控的程序,就可以读出来参数来,然后用PWW999的代码,为啥串口出来的全是0 眼熟,自平衡哈哈 ,因为定时器配置只需要初始一次,除非需要再次修改就可以在其他地方再次声明设置
页:
[1]