极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15790|回复: 8

有两句语言不太懂麻烦高手给解释一下,谢谢!

[复制链接]
发表于 2012-5-23 20:07:09 | 显示全部楼层 |阅读模式
本帖最后由 412823422 于 2012-5-23 20:44 编辑

sensorAdjusted[0] =sensorAdjusted[0]>0, 70,-70;          在第90行代码

wheel_ls[2] = Torque > 0, wheel_ls[0],-wheel_ls[0];        在第103行代码

这个该怎么理解啊,麻烦高手给指点指点,谢谢!
  1. //两轮自平衡小车

  2. //IDG330 Mannual, 2mv= 1度/s 的角速率,ad读数1024,3.3v,那么每读数对应 3.223mV,所以每读数对应3.223/2/180*PI= 0.028123弧度/秒
  3. static const double SEMICIRCLE_ARC = 57.29578; /*半圆对应的弧度值*/
  4. static const double GYRO_OPERATOR = 0.028123; /*AD读取的陀螺仪数值对应的弧度算子*/

  5. /*kalman*/
  6. static const double C_0 = 1;
  7. static const double Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.005;//注意:dt的取值为kalman滤波器采样时间
  8. double P[2][2] = {{ 1, 0 },
  9.                   { 0, 1 }};
  10. double Pdot[4] ={ 0,0,0,0};
  11. double q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
  12. double angle, angle_dot;

  13. /*sensor*/
  14. double sensorPort[6] = { 0, 1, 2, 3, 4, 5};/*传感器地址,电路决定.accZ,gyroX, AD1, AD2, AD3, AD4*/
  15. double sensorValue[6];/*传感器的返回值*/

  16. /*传感器零点 0:Z轴(平行轴) 1:陀螺仪中点*/
  17. double sensorZero[2] = {499,505};
  18. double sensorAdjusted[2];/*传感器的返回值重整*/
  19. //double provAngle;

  20. /*moto*/
  21. int E1 = 6;
  22. int E2 = 9;
  23. int M1 = 7;
  24. int M2 = 8;
  25. double deadAreaCompensation1 = 45,deadAreaCompensation2 = 35;

  26. /*balance*/
  27. double RATE[4] = { 0,0,0,0};/*公式中的4个变量*/
  28. double K[4] = { 60.45, 1.27, 125, 0.75};/*公式中的4个常量*/
  29. double K_AD[4] = { 1, 1, 1, 1};/*公式中的4个常量*/
  30. double wheel_ls[7];/*左轮:0:编码器 1:位移(position) 2:position_dot 3:position_dot_filter 4:speedNeed 5:turnNeed 6:speedOutPut */
  31. double wheel_rs[7];/*右轮:0:编码器 1:位移(position) 2:position_dot 3:position_dot_filter 4:speedNeed 5:turnNeed 6:speedOutPut */

  32. double Torque;/*扭矩*/
  33. unsigned int count,count2;
  34. boolean OK=false;//这个是误差达到一定程度后的系统关闭开关.
  35. int bf,X,Y;//从无线端发来的命令

  36. /*kalman*/
  37. /*angle_m:经过atan2(ax,ay)方法计算的偏角,弧度值
  38. gyro_m:经过初步减去零点的陀螺仪角速度值,弧度值
  39. */
  40. void Kalman_Filter(double angle_m,double gyro_m)
  41. {
  42.     angle+=(gyro_m-q_bias) * dt;
  43.     angle_err = angle_m - angle;
  44.     Pdot[0]=Q_angle - P[0][1] - P[1][0];
  45.     Pdot[1]=- P[1][1];
  46.     Pdot[2]=- P[1][1];
  47.     Pdot[3]=Q_gyro;
  48.     P[0][0] += Pdot[0] * dt;
  49.     P[0][1] += Pdot[1] * dt;
  50.     P[1][0] += Pdot[2] * dt;
  51.     P[1][1] += Pdot[3] * dt;
  52.     PCt_0 = C_0 * P[0][0];
  53.     PCt_1 = C_0 * P[1][0];
  54.     E = R_angle + C_0 * PCt_0;
  55.     K_0 = PCt_0 / E;
  56.     K_1 = PCt_1 / E;
  57.     t_0 = PCt_0;
  58.     t_1 = C_0 * P[0][1];
  59.     P[0][0] -= K_0 * t_0;
  60.     P[0][1] -= K_0 * t_1;
  61.     P[1][0] -= K_1 * t_0;
  62.     P[1][1] -= K_1 * t_1;
  63.     angle        += K_0 * angle_err;
  64.     q_bias += K_1 * angle_err;
  65.     angle_dot = gyro_m-q_bias;//也许应该用last_angle-angle
  66. }

  67. void do_balance() {
  68.       
  69.       sensorValue[0] = analogRead(sensorPort[0]);//Z轴加速度
  70.       sensorValue[1] = analogRead(sensorPort[1]);//X轴旋转(陀螺)
  71.       sensorValue[2] = analogRead(sensorPort[2]);//旋钮1
  72.       sensorValue[3] = analogRead(sensorPort[3]);//旋钮2
  73.       sensorValue[4] = analogRead(sensorPort[4]);//旋钮3
  74.       sensorValue[5] = analogRead(sensorPort[5]);//旋钮4
  75.       
  76.       //算出整理过的零点值
  77.       sensorAdjusted[0] = sensorValue[0] - sensorZero[0];
  78.       if(abs(sensorAdjusted[0]) > 70)//如果倾斜到一定程度,就停机
  79.       {
  80.           OK = false;
  81.           sensorAdjusted[0] =sensorAdjusted[0]>0, 70,-70;
  82.       }
  83.       sensorAdjusted[1] = sensorZero[1] - sensorValue[1];/*减去初始零点*/
  84.       
  85.       
  86.       /*根据可变电阻改变K的倍数*/
  87.       //deadAreaCompensation = (sensorValue[4]+1)/10.24;
  88.       //K_AD[0] = (sensorValue[2]+1)/256;//102.4;/*值在0.001~10之间变化.在AD=100的时候接近1 */
  89.       //K_AD[1] = (sensorValue[3]+1)/256;//102.4;
  90.       //K_AD[2] = (sensorValue[4]+1)/256;//102.4;
  91.       //K_AD[3] = (sensorValue[5]+1)/256;//102.4;
  92.       
  93.       /*根据上一周期Torqu的值统计轮子转动积分*/
  94.       wheel_ls[2] = Torque > 0, wheel_ls[0],-wheel_ls[0];
  95.       wheel_rs[2] = Torque > 0, wheel_rs[0],-wheel_rs[0];
  96.       wheel_ls[0] = wheel_rs[0] = 0;
  97.       /*************** balance *********************************************/
  98.       
  99.       /*小车初始状态*/
  100.         
  101.             if(!OK)
  102.             {
  103.               if(abs(sensorAdjusted[0]) <= 3)//小车被推倒平衡位置后才启动电机
  104.               {
  105.                 count=0;
  106.                 OK = true;
  107.               }
  108.               for(int i = 0; i <7;i++)
  109.               {
  110.                 wheel_ls[i] = 0;
  111.                 wheel_rs[i] = 0;
  112.               }
  113.             }
  114.         
  115.       
  116.       /*balance*/
  117.       
  118.           /*GYRO_OPERATOR = 0.028123 AD读取的陀螺仪数值对应的弧度算子*/
  119.           Kalman_Filter(atan2(sensorAdjusted[0], sqrt(10000-sensorAdjusted[0]*sensorAdjusted[0])), sensorAdjusted[1] * GYRO_OPERATOR);//10000:因为只有一轴加速度计,所以虚拟一个斜边   
  120.       
  121.           RATE[0] = angle * SEMICIRCLE_ARC;//SEMICIRCLE_ARC=57.29578; /*半圆对应的弧度值*/
  122.           RATE[1] = angle_dot * SEMICIRCLE_ARC;
  123.       
  124.       
  125.       /*计算速度 double wheel_ls[8]; 0:编码器累加 1:位移(position) 2:position_dot 3:速度(position_dot_filter) 4:speedNeed 5:turnNeed 6:speedOutPut
  126.       */
  127.       
  128.           wheel_ls[3] *= 0.95;              /*车轮速度滤波,wheel_ls[3] : position_dot_filter*/
  129.           wheel_ls[3] += wheel_ls[2]*0.05; /*wheel_ls[2] : position_dot*/
  130.           wheel_ls[1] += wheel_ls[3];       /*wheel_ls[1] : position*/
  131.           wheel_ls[1] += wheel_ls[4];       /*wheel_ls[4] : speedNeed*/
  132.           wheel_ls[1] = max(-50, wheel_ls[1]);
  133.           wheel_ls[1] = min(50, wheel_ls[1]);
  134.       
  135.           RATE[2] = wheel_ls[3];//速度--滤波过了
  136.           RATE[3] = wheel_ls[1];//位置
  137.       
  138.       
  139.       /*Torque 综合所有参数算出扭矩*/
  140.       
  141.           Torque = RATE[0] * K[0] * K_AD[0] + RATE[1] * K[1] * K_AD[1] + RATE[2] * K[2] * K_AD[2] + RATE[3] * K[3]* K_AD[3];
  142.       
  143.           //根据扭矩算轮子的命令值
  144.          wheel_ls[6] = abs(Torque)+ deadAreaCompensation1;//wheel_ls[6]:扭矩输出 deadAreaCompensation1:左轮的死区补偿
  145.       wheel_ls[6] = min(255, wheel_ls[6]);//限制最大扭矩255
  146.           wheel_ls[6] = OK, wheel_ls[6],0;
  147.       
  148.       wheel_rs[6] = abs(Torque)+ deadAreaCompensation2;
  149.           wheel_rs[6] = min(255, wheel_rs[6]);
  150.           wheel_rs[6] = OK, wheel_rs[6],0;
  151.       
  152.       
  153.       if(Torque > 0)
  154.       {
  155.           digitalWrite(M2, HIGH);
  156.           digitalWrite(M1, LOW);
  157.       }
  158.       else
  159.       {
  160.           digitalWrite(M2, LOW);
  161.           digitalWrite(M1, HIGH);
  162.       }
  163.       analogWrite(E1, wheel_ls[6]); //PWM调速a==0-255
  164.       analogWrite(E2, wheel_rs[6]);
  165. }
  166. //


  167. void do_msg(){
  168.     if(count%100==0)
  169.     {
  170.         Serial.print("$CLEAR\r\n");
  171.         Serial.print("$GO 1 1\r\n");
  172.         Serial.print("$PRINT ");
  173.      
  174.         Serial.print(wheel_ls[1]);
  175.         Serial.print(" ");
  176.         Serial.print(wheel_ls[3]);
  177.         //Serial.print(" ");
  178.         //Serial.print(RATE[2]);
  179.         //Serial.print(K[0]*K_AD[0]);
  180.         //Serial.print(" ");
  181.         //Serial.print(K[1]*K_AD[1]);
  182.         //Serial.print(" ");
  183.         Serial.print("\r\n");
  184.      
  185.         Serial.print("$GO 2 1\r\n");
  186.         Serial.print("$PRINT ");
  187.         //Serial.print(K[0]*K_AD[0]);
  188.         //Serial.print(" ");
  189.         //Serial.print(K[1]*K_AD[1]);
  190.         //Serial.print(" ");
  191.         //Serial.print(K[2]*K_AD[2]);
  192.         //Serial.print(" ");
  193.         //Serial.print(K[3]*K_AD[3]);
  194.         //Serial.print(count);
  195.         Serial.print(wheel_ls[5]);
  196.         Serial.print(" ");
  197.         Serial.print(wheel_rs[5]);
  198.         //Serial.print(count);
  199.         //Serial.print(Torque);
  200.         Serial.print("\r\n");
  201.     }
  202. }
  203. /***************** setup-loop *************************************************/
  204. void setup() {
  205.     count=0;
  206.     X=Y=8;
  207.     bf=-1;
  208.     //init motos
  209.     for (int i = 6; i <= 9; i++) {
  210.         pinMode(i, OUTPUT);
  211.     }
  212.     Serial.begin(9600);//115200);
  213.     analogReference(EXTERNAL); //设置模拟输入为外部参考3.3V
  214.      
  215.     attachInterrupt(0, blinkone, CHANGE); //设置为0号中断,中断函数blink,触发方式为RISING
  216.     attachInterrupt(1, blinktwo, CHANGE); //设置为0号中断,中断函数blink,触发方式为RISING
  217. }

  218. void blinkone()//中断函数
  219. {
  220.     wheel_ls[0] ++;
  221. }
  222. void blinktwo()//中断函数
  223. {
  224.     wheel_rs[0] ++;
  225. }

  226. void loop() {
  227.     do_balance();//计算平衡
  228.     do_msg();
  229.     delay(3);
  230.     count++;
  231.     if(count>=60000)
  232.         count=0;
  233. }
复制代码
回复

使用道具 举报

发表于 2012-5-23 20:15:04 | 显示全部楼层
麻烦把整个代码贴出来,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-23 20:40:06 | 显示全部楼层
本帖最后由 412823422 于 2012-5-23 20:42 编辑
  1. //两轮自平衡小车

  2. //IDG330 Mannual, 2mv= 1度/s 的角速率,ad读数1024,3.3v,那么每读数对应 3.223mV,所以每读数对应3.223/2/180*PI= 0.028123弧度/秒
  3. static const double SEMICIRCLE_ARC = 57.29578; /*半圆对应的弧度值*/
  4. static const double GYRO_OPERATOR = 0.028123; /*AD读取的陀螺仪数值对应的弧度算子*/

  5. /*kalman*/
  6. static const double C_0 = 1;
  7. static const double Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.005;//注意:dt的取值为kalman滤波器采样时间
  8. double P[2][2] = {{ 1, 0 },
  9.                   { 0, 1 }};
  10. double Pdot[4] ={ 0,0,0,0};
  11. double q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
  12. double angle, angle_dot;

  13. /*sensor*/
  14. double sensorPort[6] = { 0, 1, 2, 3, 4, 5};/*传感器地址,电路决定.accZ,gyroX, AD1, AD2, AD3, AD4*/
  15. double sensorValue[6];/*传感器的返回值*/

  16. /*传感器零点 0:Z轴(平行轴) 1:陀螺仪中点*/
  17. double sensorZero[2] = {499,505};
  18. double sensorAdjusted[2];/*传感器的返回值重整*/
  19. //double provAngle;

  20. /*moto*/
  21. int E1 = 6;
  22. int E2 = 9;
  23. int M1 = 7;
  24. int M2 = 8;
  25. double deadAreaCompensation1 = 45,deadAreaCompensation2 = 35;

  26. /*balance*/
  27. double RATE[4] = { 0,0,0,0};/*公式中的4个变量*/
  28. double K[4] = { 60.45, 1.27, 125, 0.75};/*公式中的4个常量*/
  29. double K_AD[4] = { 1, 1, 1, 1};/*公式中的4个常量*/
  30. double wheel_ls[7];/*左轮:0:编码器 1:位移(position) 2:position_dot 3:position_dot_filter 4:speedNeed 5:turnNeed 6:speedOutPut */
  31. double wheel_rs[7];/*右轮:0:编码器 1:位移(position) 2:position_dot 3:position_dot_filter 4:speedNeed 5:turnNeed 6:speedOutPut */

  32. double Torque;/*扭矩*/
  33. unsigned int count,count2;
  34. boolean OK=false;//这个是误差达到一定程度后的系统关闭开关.
  35. int bf,X,Y;//从无线端发来的命令

  36. /*kalman*/
  37. /*angle_m:经过atan2(ax,ay)方法计算的偏角,弧度值
  38. gyro_m:经过初步减去零点的陀螺仪角速度值,弧度值
  39. */
  40. void Kalman_Filter(double angle_m,double gyro_m)
  41. {
  42.     angle+=(gyro_m-q_bias) * dt;
  43.     angle_err = angle_m - angle;
  44.     Pdot[0]=Q_angle - P[0][1] - P[1][0];
  45.     Pdot[1]=- P[1][1];
  46.     Pdot[2]=- P[1][1];
  47.     Pdot[3]=Q_gyro;
  48.     P[0][0] += Pdot[0] * dt;
  49.     P[0][1] += Pdot[1] * dt;
  50.     P[1][0] += Pdot[2] * dt;
  51.     P[1][1] += Pdot[3] * dt;
  52.     PCt_0 = C_0 * P[0][0];
  53.     PCt_1 = C_0 * P[1][0];
  54.     E = R_angle + C_0 * PCt_0;
  55.     K_0 = PCt_0 / E;
  56.     K_1 = PCt_1 / E;
  57.     t_0 = PCt_0;
  58.     t_1 = C_0 * P[0][1];
  59.     P[0][0] -= K_0 * t_0;
  60.     P[0][1] -= K_0 * t_1;
  61.     P[1][0] -= K_1 * t_0;
  62.     P[1][1] -= K_1 * t_1;
  63.     angle        += K_0 * angle_err;
  64.     q_bias += K_1 * angle_err;
  65.     angle_dot = gyro_m-q_bias;//也许应该用last_angle-angle
  66. }

  67. void do_balance() {
  68.       
  69.       sensorValue[0] = analogRead(sensorPort[0]);//Z轴加速度
  70.       sensorValue[1] = analogRead(sensorPort[1]);//X轴旋转(陀螺)
  71.       sensorValue[2] = analogRead(sensorPort[2]);//旋钮1
  72.       sensorValue[3] = analogRead(sensorPort[3]);//旋钮2
  73.       sensorValue[4] = analogRead(sensorPort[4]);//旋钮3
  74.       sensorValue[5] = analogRead(sensorPort[5]);//旋钮4
  75.       
  76.       //算出整理过的零点值
  77.       sensorAdjusted[0] = sensorValue[0] - sensorZero[0];
  78.       if(abs(sensorAdjusted[0]) > 70)//如果倾斜到一定程度,就停机
  79.       {
  80.           OK = false;
  81.           sensorAdjusted[0] =sensorAdjusted[0]>0, 70,-70;
  82.       }
  83.       sensorAdjusted[1] = sensorZero[1] - sensorValue[1];/*减去初始零点*/
  84.       
  85.       
  86.       /*根据可变电阻改变K的倍数*/
  87.       //deadAreaCompensation = (sensorValue[4]+1)/10.24;
  88.       //K_AD[0] = (sensorValue[2]+1)/256;//102.4;/*值在0.001~10之间变化.在AD=100的时候接近1 */
  89.       //K_AD[1] = (sensorValue[3]+1)/256;//102.4;
  90.       //K_AD[2] = (sensorValue[4]+1)/256;//102.4;
  91.       //K_AD[3] = (sensorValue[5]+1)/256;//102.4;
  92.       
  93.       /*根据上一周期Torqu的值统计轮子转动积分*/
  94.       wheel_ls[2] = Torque > 0, wheel_ls[0],-wheel_ls[0];
  95.       wheel_rs[2] = Torque > 0, wheel_rs[0],-wheel_rs[0];
  96.       wheel_ls[0] = wheel_rs[0] = 0;
  97.       /*************** balance *********************************************/
  98.       
  99.       /*小车初始状态*/
  100.         
  101.             if(!OK)
  102.             {
  103.               if(abs(sensorAdjusted[0]) <= 3)//小车被推倒平衡位置后才启动电机
  104.               {
  105.                 count=0;
  106.                 OK = true;
  107.               }
  108.               for(int i = 0; i <7;i++)
  109.               {
  110.                 wheel_ls[i] = 0;
  111.                 wheel_rs[i] = 0;
  112.               }
  113.             }
  114.         
  115.       
  116.       /*balance*/
  117.       
  118.           /*GYRO_OPERATOR = 0.028123 AD读取的陀螺仪数值对应的弧度算子*/
  119.           Kalman_Filter(atan2(sensorAdjusted[0], sqrt(10000-sensorAdjusted[0]*sensorAdjusted[0])), sensorAdjusted[1] * GYRO_OPERATOR);//10000:因为只有一轴加速度计,所以虚拟一个斜边   
  120.       
  121.           RATE[0] = angle * SEMICIRCLE_ARC;//SEMICIRCLE_ARC=57.29578; /*半圆对应的弧度值*/
  122.           RATE[1] = angle_dot * SEMICIRCLE_ARC;
  123.       
  124.       
  125.       /*计算速度 double wheel_ls[8]; 0:编码器累加 1:位移(position) 2:position_dot 3:速度(position_dot_filter) 4:speedNeed 5:turnNeed 6:speedOutPut
  126.       */
  127.       
  128.           wheel_ls[3] *= 0.95;              /*车轮速度滤波,wheel_ls[3] : position_dot_filter*/
  129.           wheel_ls[3] += wheel_ls[2]*0.05; /*wheel_ls[2] : position_dot*/
  130.           wheel_ls[1] += wheel_ls[3];       /*wheel_ls[1] : position*/
  131.           wheel_ls[1] += wheel_ls[4];       /*wheel_ls[4] : speedNeed*/
  132.           wheel_ls[1] = max(-50, wheel_ls[1]);
  133.           wheel_ls[1] = min(50, wheel_ls[1]);
  134.       
  135.           RATE[2] = wheel_ls[3];//速度--滤波过了
  136.           RATE[3] = wheel_ls[1];//位置
  137.       
  138.       
  139.       /*Torque 综合所有参数算出扭矩*/
  140.       
  141.           Torque = RATE[0] * K[0] * K_AD[0] + RATE[1] * K[1] * K_AD[1] + RATE[2] * K[2] * K_AD[2] + RATE[3] * K[3]* K_AD[3];
  142.       
  143.           //根据扭矩算轮子的命令值
  144.          wheel_ls[6] = abs(Torque)+ deadAreaCompensation1;//wheel_ls[6]:扭矩输出 deadAreaCompensation1:左轮的死区补偿
  145.       wheel_ls[6] = min(255, wheel_ls[6]);//限制最大扭矩255
  146.           wheel_ls[6] = OK, wheel_ls[6],0;
  147.       
  148.       wheel_rs[6] = abs(Torque)+ deadAreaCompensation2;
  149.           wheel_rs[6] = min(255, wheel_rs[6]);
  150.           wheel_rs[6] = OK, wheel_rs[6],0;
  151.       
  152.       
  153.       if(Torque > 0)
  154.       {
  155.           digitalWrite(M2, HIGH);
  156.           digitalWrite(M1, LOW);
  157.       }
  158.       else
  159.       {
  160.           digitalWrite(M2, LOW);
  161.           digitalWrite(M1, HIGH);
  162.       }
  163.       analogWrite(E1, wheel_ls[6]); //PWM调速a==0-255
  164.       analogWrite(E2, wheel_rs[6]);
  165. }
  166. //


  167. void do_msg(){
  168.     if(count%100==0)
  169.     {
  170.         Serial.print("$CLEAR\r\n");
  171.         Serial.print("$GO 1 1\r\n");
  172.         Serial.print("$PRINT ");
  173.      
  174.         Serial.print(wheel_ls[1]);
  175.         Serial.print(" ");
  176.         Serial.print(wheel_ls[3]);
  177.         //Serial.print(" ");
  178.         //Serial.print(RATE[2]);
  179.         //Serial.print(K[0]*K_AD[0]);
  180.         //Serial.print(" ");
  181.         //Serial.print(K[1]*K_AD[1]);
  182.         //Serial.print(" ");
  183.         Serial.print("\r\n");
  184.      
  185.         Serial.print("$GO 2 1\r\n");
  186.         Serial.print("$PRINT ");
  187.         //Serial.print(K[0]*K_AD[0]);
  188.         //Serial.print(" ");
  189.         //Serial.print(K[1]*K_AD[1]);
  190.         //Serial.print(" ");
  191.         //Serial.print(K[2]*K_AD[2]);
  192.         //Serial.print(" ");
  193.         //Serial.print(K[3]*K_AD[3]);
  194.         //Serial.print(count);
  195.         Serial.print(wheel_ls[5]);
  196.         Serial.print(" ");
  197.         Serial.print(wheel_rs[5]);
  198.         //Serial.print(count);
  199.         //Serial.print(Torque);
  200.         Serial.print("\r\n");
  201.     }
  202. }
  203. /***************** setup-loop *************************************************/
  204. void setup() {
  205.     count=0;
  206.     X=Y=8;
  207.     bf=-1;
  208.     //init motos
  209.     for (int i = 6; i <= 9; i++) {
  210.         pinMode(i, OUTPUT);
  211.     }
  212.     Serial.begin(9600);//115200);
  213.     analogReference(EXTERNAL); //设置模拟输入为外部参考3.3V
  214.      
  215.     attachInterrupt(0, blinkone, CHANGE); //设置为0号中断,中断函数blink,触发方式为RISING
  216.     attachInterrupt(1, blinktwo, CHANGE); //设置为0号中断,中断函数blink,触发方式为RISING
  217. }

  218. void blinkone()//中断函数
  219. {
  220.     wheel_ls[0] ++;
  221. }
  222. void blinktwo()//中断函数
  223. {
  224.     wheel_rs[0] ++;
  225. }

  226. void loop() {
  227.     do_balance();//计算平衡
  228.     do_msg();
  229.     delay(3);
  230.     count++;
  231.     if(count>=60000)
  232.         count=0;
  233. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-5-23 21:41:32 | 显示全部楼层
sensorAdjusted[0] = sensorAdjusted[0]>0, 70,-70;

比如说 在执行这个语句之前sensorAdjusted[0]里面的值如果大于0,那么sensorAdjusted[0]就会被重新复制为1,反之返回0

> < 就是关系运算符,关系运算符的返回结果如无意外都是0或者1,对于C/C++来说,假就是0,非0就是真。关系运算符的结果其实就是一个逻辑结果。明白否?

当然我是按C/C++的来解释,如果解释错了,请高手指正。
回复 支持 反对

使用道具 举报

发表于 2012-5-23 21:43:45 | 显示全部楼层
你去看看arduino的手册,看看><= >= <= 是否就是关系运算符,如果没有其他解释,那么我上面说应该就是你想要的答案了。

哦,上面打错字了,不是复制,是赋值。
回复 支持 反对

使用道具 举报

发表于 2012-5-23 21:47:57 | 显示全部楼层
程序如果这样写,你可能会比较明白

sensorAdjusted[0] = 50;
if(sensorAdjusted[0] = sensorAdjusted[0]>0)
{
printf("sensorAdj>0"\N);
}
else
{
printf("sensorAdj<0"\N)
}

输出结果:sensorAdj>0
回复 支持 反对

使用道具 举报

发表于 2012-5-23 21:51:49 | 显示全部楼层
关系运算符要优先与赋值,所以程序执行到这里时,先判断大小,并将0或者1,假或者非假赋值给前者,然后在进行判断。
希望我的解释可以帮你解惑。
回复 支持 反对

使用道具 举报

发表于 2012-5-25 22:37:34 | 显示全部楼层
GeMarK 发表于 2012-5-23 21:47
程序如果这样写,你可能会比较明白

sensorAdjusted[0] = 50;

语法和书写问题,书写简单了,看的人看不懂了。所以要规范书写
回复 支持 反对

使用道具 举报

发表于 2012-5-26 10:59:05 | 显示全部楼层
记得条件表达式是这样的格式(条件表达式1 ? 条件表达式2 : 条件表达式3);arduino改了这个写法?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 02:51 , Processed in 0.043105 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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