极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13631|回复: 6

请教定时器中断问题!

[复制链接]
发表于 2014-4-23 09:57:40 | 显示全部楼层 |阅读模式
请问一下,下面的平衡车代码中,为何定时器中断是放在初始化函数中执行的,而不是放在LOOP主程序中,新手有点理解不了程序执行的顺序了! 谢谢!
  1. void setup()
  2. {
  3.    //---------------
  4. // Wire.begin();
  5.     Serial.begin(9600);
  6.      accelgyro.initialize();
  7.      delay(100);
  8.     pinMode(TN1,OUTPUT);         
  9.     pinMode(TN2,OUTPUT);
  10.     pinMode(TN3,OUTPUT);
  11.     pinMode(TN4,OUTPUT);
  12.     pinMode(ENA,OUTPUT);
  13.     pinMode(ENB,OUTPUT);   
  14.     //Serial.println("ki ka kb kc");
  15.      delay(100);
  16.    // -----------
  17.     pinMode(PinA,INPUT); //D2脚为输入
  18.     pinMode(PinB,INPUT); //D3脚为输入

  19.     attachInterrupt(0, blinkA,FALLING);  //注册中断0调用函数blinkA
  20.     attachInterrupt(1, blinkB, FALLING);  //注册中断1调用函数blinkB
  21.     pinMode(encoderPinA, INPUT);
  22.     pinMode(encoderPinB, INPUT);
  23.     digitalWrite(encoderPinA, HIGH);
  24.     digitalWrite(encoderPinB, HIGH);
  25. // time = millis(); //时间初值
  26.     delay(100);

  27. FlexiTimer2::set(10, flash); // call every 500 1ms "ticks"
  28. FlexiTimer2::start();
  29. }

  30. void loop()
  31. {
  32. accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);  //读取6050的值
  33. SDEER();  //调用中断函数,蓝牙控制WSAD
  34.         kp=analogRead(0)*0.005;
  35.         ki=analogRead(1)*0.005;
  36.         kd=analogRead(2)*0.005;
  37.         kpp=analogRead(3)*0.005;
  38.       PWMB();   //电机中断函数,两个电机,前后左右转动
  39.    
  40.     // Serial.print(position_dot);
  41.   //   Serial.print(',');
  42.   /*   
  43. Serial.print(countA);
  44. Serial.print(',');
  45. Serial.print(countB);
  46. Serial.print(',');
  47. Serial.print(angleA);
  48. Serial.print(',');
  49. Serial.print(omega);
  50. Serial.print(',');
  51. Serial.println(Output);
  52. */
  53.     }
复制代码
回复

使用道具 举报

发表于 2014-4-23 11:35:05 | 显示全部楼层

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

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

要是放到loop()里不就每次都设置一下,每次都开始一下了吗
回复 支持 反对

使用道具 举报

发表于 2014-4-23 11:38:50 | 显示全部楼层
我是这么理解的  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-23 12:12:49 | 显示全部楼层
我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通!
回复 支持 反对

使用道具 举报

发表于 2014-4-23 13:16:35 | 显示全部楼层
swfzz 发表于 2014-4-23 12:12
我是这么想的,初始化,不是一次执行的么?而这个定时器中断,应该是10毫秒就返回一次值的?所以我想不通!

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

使用道具 举报

 楼主| 发表于 2014-4-23 13:39:18 | 显示全部楼层
本帖最后由 swfzz 于 2014-4-23 14:12 编辑

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

使用道具 举报

发表于 2015-8-6 22:55:45 | 显示全部楼层
眼熟,自平衡哈哈 ,因为定时器配置只需要初始一次,除非需要再次修改就可以在其他地方再次声明设置
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-19 02:25 , Processed in 0.036329 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表