swfzz 发表于 2014-4-23 09:57:40

请教定时器中断问题!

请问一下,下面的平衡车代码中,为何定时器中断是放在初始化函数中执行的,而不是放在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);
*/
    }

____消失灬 发表于 2014-4-23 11:35:05


FlexiTimer2::set(10, flash); // call every 500 1ms "ticks"
这是设置定时中断

FlexiTimer2::start();
这是定时中断开始

要是放到loop()里不就每次都设置一下,每次都开始一下了吗

____消失灬 发表于 2014-4-23 11:38:50

我是这么理解的

swfzz 发表于 2014-4-23 12:12:49

我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通!

林定祥 发表于 2014-4-23 13:16:35

swfzz 发表于 2014-4-23 12:12 static/image/common/back.gif
我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通!

定时器有各种用法,如多少时长发出中断,或受外面什么出发过多少时间产生中断,因此在启用中断前必须初始化,只要用法没有改变,不必每次都去设置,在loop中会按设置行事的.

swfzz 发表于 2014-4-23 13:39:18

本帖最后由 swfzz 于 2014-4-23 14:12 编辑

哦,忽然明白了,初始化后,他只管到时间就做该做的事,而不会管什么其它的,所以放在哪都无所谓,只要初始化就行了,谢谢!
下一步整明白,为啥我的GY-86用MWC 2.2飞控的程序,就可以读出来参数来,然后用PWW999的代码,为啥串口出来的全是0

Gugoo 发表于 2015-8-6 22:55:45

眼熟,自平衡哈哈 ,因为定时器配置只需要初始一次,除非需要再次修改就可以在其他地方再次声明设置
页: [1]
查看完整版本: 请教定时器中断问题!