极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11979|回复: 2

遇到一个诡异的问题,谁帮我分析一下代码

[复制链接]
发表于 2017-1-20 09:49:12 | 显示全部楼层 |阅读模式
这是个红外遥控监控云台的代码,可以设置云台转动速度3个档位

诡异的问题就出现在函数FunSetSpeed(float SpeedValue,int LedV)中:
……
void FunSetSpeed(float SpeedValue,int LedV)
{
        FunStop();
        SpeedTo=SpeedValue;//这句如果注释掉就没问题,顺利执行
       
        digitalWrite(SPeedLed1,LOW);
        digitalWrite(SPeedLed2,LOW);
……
SpeedTo=SpeedValue;这句代码是要将速度值赋用于运算,执行到这并没有问题,但是会导致接收到的遥控器发射码异常,基于发射码的判断就失效了,而且这个错误总是发生在FunMac(3)函数调用之后。

完整的详细代码如下

  1. #include <IRremote.h>  // 使用IRRemote函数库

  2. //======================================
  3. const int ReceiverPin = 13;  // 红外接收器的 OUTPUT 引脚接
  4. const int ReLed=12;//信号接收指示灯引脚

  5. const int MPinOutA0=5;//machineA+
  6. const int MPinOutA1=6;//machineA-

  7. const int MPinOutB0=10;//machineB+
  8. const int MPinOutB1=11;//machineB-

  9. const int SPeedLed1=7;//转速档位指示灯引脚
  10. const int SPeedLed2=8;//转速档位指示灯引脚
  11. const int SPeedLed3=9;//转速档位指示灯引脚

  12. const int TakePic=2;//拍照信号指示灯引脚
  13. //======================================
  14. const long KEY_UP = 0xFFC23D;//1
  15. const long KEY_DOWN = 0xFF22DD;//2
  16. const long KEY_LEFT = 0xFFA25D;//3
  17. const long KEY_RIGHT = 0xFFE21D;//4

  18. const long KEY_SPEED1 = 0xFF30CF;//5
  19. const long KEY_SPEED2 = 0xFF18E7;//5
  20. const long KEY_SPEED3 = 0xFF7A85;//5

  21. const long KEY_TAKEPIC = 0xFF02FD;//7

  22. const long KEY_STOP = 0xFF629D;//7

  23. const long KEY_NULL = 0xFFFFFFFF;//bak
  24. //======================================
  25. float Speed1=1.53;//1X
  26. float Speed2=3.06;//2X
  27. float Speed3=50;//FULL
  28. //======================================
  29. float SpeedTo=0;
  30. //int LastKey=0;

  31. IRrecv irrecv(ReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
  32. decode_results KeyResults;    // 定义KeyResults变量为红外结果存放位置

  33. void setup() {
  34.   
  35.   pinMode(ReLed, OUTPUT);
  36.   
  37.   pinMode(MPinOutA0, OUTPUT);  
  38.   pinMode(MPinOutA1, OUTPUT);
  39.   
  40.   pinMode(MPinOutB0, OUTPUT);  
  41.   pinMode(MPinOutB1, OUTPUT);
  42.   
  43.   pinMode(SPeedLed1, OUTPUT);
  44.   pinMode(SPeedLed2, OUTPUT);
  45.   pinMode(SPeedLed3, OUTPUT);
  46.   
  47.   pinMode(TakePic, OUTPUT);
  48. //======================================
  49.   digitalWrite(ReLed,LOW);
  50.   
  51.   digitalWrite(MPinOutA0,LOW);
  52.   digitalWrite(MPinOutA1,LOW);
  53.   
  54.   digitalWrite(MPinOutB0,LOW);
  55.   digitalWrite(MPinOutB1,LOW);
  56.   
  57.   digitalWrite(SPeedLed1,LOW);
  58.   digitalWrite(SPeedLed2,LOW);
  59.   digitalWrite(SPeedLed3,LOW);
  60.   
  61.   digitalWrite(TakePic,LOW);
  62. //======================================
  63.   
  64.   Serial.begin(9600);//debug
  65.         irrecv.enableIRIn();   // 启动红外解码
  66.   

  67. }
  68. //===============================================

  69. void loop()
  70. {
  71.         if(irrecv.decode(&KeyResults))
  72.         {
  73.                 ReFlash();//Led3
  74.                 IRCodeGet(KeyResults.value);
  75.                 irrecv.resume();
  76.         }
  77.         else
  78.         {
  79.                 delay(500);
  80.         }
  81. }

  82. void IRCodeGet(long lkey)
  83. {
  84.         Serial.print("LKey:"); //debug
  85.         Serial.print(lkey,HEX); //debug
  86.         Serial.println("|"); //debug
  87.         switch(lkey)
  88.         {
  89.                 case KEY_TAKEPIC:
  90.                 FunTakePic(200);
  91.                 break;
  92.                 case KEY_STOP:
  93.                 FunStop();
  94.                 break;
  95. //===================================
  96.                 case KEY_UP:
  97.                 FunMac(1);
  98.                 break;
  99.                 case KEY_DOWN:
  100.                 FunMac(2);
  101.                 break;
  102.                 case KEY_LEFT:
  103.                 FunMac(3);
  104.                 break;
  105.                 case KEY_RIGHT:
  106.                 FunMac(4);
  107.                 break;
  108. //===================================
  109.                 case KEY_SPEED1:
  110.                         FunSetSpeed(Speed1,1);
  111.                 break;
  112.                 case KEY_SPEED2:
  113.                         FunSetSpeed(Speed2,2);
  114.                 break;
  115.                 case KEY_SPEED3:
  116.                         FunSetSpeed(Speed3,3);
  117.                 break;
  118. //===================================
  119.                 case KEY_NULL:
  120.                         ;
  121.                 break;
  122.                 //FunMac(LastKey);
  123.         }
  124.        
  125. }

  126. void ReFlash()
  127. {
  128.         for(int i=1;i<2;i++)
  129.         {
  130.                 digitalWrite(ReLed,HIGH);
  131.                 delay(50);//
  132.                 digitalWrite(ReLed,LOW);
  133.                 delay(50);//
  134.         }
  135.        
  136. }
  137. void FunTakePic(int delValue)
  138. {
  139.         digitalWrite(TakePic,HIGH);
  140.         delay(delValue);//
  141.         digitalWrite(TakePic,LOW);
  142.         //LastKey=0;
  143. }

  144. void FunStop()
  145. {
  146.     analogWrite(MPinOutA0,LOW);
  147.     analogWrite(MPinOutA1,LOW);
  148.     analogWrite(MPinOutB0,LOW);
  149.     analogWrite(MPinOutB1,LOW);
  150.         //LastKey=0;
  151. }
  152. void FunMac(int inDirect)
  153. {
  154.   Serial.print("Direction:"); //debug
  155.   Serial.print(intDirect,HEX); //debug
  156.   Serial.print("|"); //debug
  157.         FunStop();
  158.         if(inDirect==1)
  159.         {
  160.                 //LastKey=1;
  161.                 analogWrite(MPinOutA0,LOW);
  162.                 analogWrite(MPinOutA1,SpeedTo*50);
  163.         }
  164.         else if(inDirect==2)
  165.         {
  166.                 //LastKey=2;
  167.                 analogWrite(MPinOutA0,SpeedTo*50);
  168.                 analogWrite(MPinOutA1,LOW);
  169.         }
  170.         else if(inDirect==3)
  171.         {
  172.                 //LastKey=3;
  173.                 analogWrite(MPinOutB0,LOW);
  174.                 analogWrite(MPinOutB1,SpeedTo*50);
  175.         }
  176.         else if(inDirect==4)
  177.         {
  178.                 //LastKey=4;
  179.                 analogWrite(MPinOutB0,SpeedTo*50);
  180.                 analogWrite(MPinOutB1,LOW);
  181.         }
  182.         else
  183.         {
  184.                 ;
  185.         }
  186. }
  187. void FunSetSpeed(float SpeedValue,int LedV)
  188. {
  189.         FunStop();
  190.         SpeedTo=SpeedValue;
  191.        
  192.         digitalWrite(SPeedLed1,LOW);
  193.         digitalWrite(SPeedLed2,LOW);
  194.         digitalWrite(SPeedLed3,LOW);
  195.        
  196.         if(LedV==1)
  197.         {
  198.                 digitalWrite(SPeedLed1,HIGH);
  199.         }
  200.         else if(LedV==2)
  201.         {
  202.                 digitalWrite(SPeedLed2,HIGH);
  203.         }
  204.         else if(LedV==3)
  205.         {
  206.                 digitalWrite(SPeedLed3,HIGH);
  207.         }
  208.         else
  209.         {
  210.                 ;
  211.         }
  212.         //LastKey=0;
  213. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-1-20 15:20:38 | 显示全部楼层
经过不断试验,我发现11脚有问题,不支持PWM输出,有点蒙了。书上写的,11脚是支持PWM的。
回复 支持 反对

使用道具 举报

发表于 2017-1-20 22:35:26 | 显示全部楼层
你要不换一块板子试试
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 20:45 , Processed in 0.055492 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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