小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
楼主: robotStudio

51版WIFI小车下位机程序(加入8路舵机功能) 兼容工作室控制平台

[复制链接]
发表于 2015-1-3 08:32:03 | 显示全部楼层
老大啊,我是51板子,用的2个L298N控制4个电机,用这个程序,舵机无问题,就是控制小车不行啊,有时候动了就不停必须得按停,有时候正常,有时候没反应,因为我用的是2个298,所以in1234分别接了P2的8个IO口,所以有时候就只有2个轮子动,我自己改了代码,0xAA,0x55,0x5A,0xA5,0x00,但是改了后居然一点反应都木有。求助啊{:soso_e150:}
回复 支持 反对

使用道具 举报

发表于 2015-1-6 23:42:14 | 显示全部楼层
楼主太给力了,,,但是我接上舵机手机发指令为什么没有反应呢,,PC端也是、、、
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 08:47:41 | 显示全部楼层
shenxiaoming 发表于 2015-1-3 08:32
老大啊,我是51板子,用的2个L298N控制4个电机,用这个程序,舵机无问题,就是控制小车不行啊,有时候动了 ...

我看你发的帖子已经搞定了吧,原来是供电的问题!!!
回复 支持 反对

使用道具 举报

发表于 2015-1-7 20:03:46 | 显示全部楼层
robotStudio 发表于 2015-1-7 08:47
我看你发的帖子已经搞定了吧,原来是供电的问题!!!

老大。我看你视频中接了4个舵机,一点抖动都没有。我自己买了个6自由度机械手,接2个舵机的时候还好,接第三个舵机的时候。舵机就开始抖动了。不稳定了。看你视频中好像有个模块,是什么模块啊。
回复 支持 反对

使用道具 举报

发表于 2015-1-7 21:05:11 | 显示全部楼层
robotStudio 发表于 2015-1-7 08:47
我看你发的帖子已经搞定了吧,原来是供电的问题!!!

关于抖动是单片机8个舵机信号io口有干扰还是舵机的电压不够还是什么。好难弄啊
回复 支持 反对

使用道具 举报

发表于 2015-1-8 01:10:31 | 显示全部楼层
robotStudio 发表于 2015-1-7 08:47
我看你发的帖子已经搞定了吧,原来是供电的问题!!!

关于抖动,测试到现在,一个一个测试。终于发现问题在P2.0-P2.3,是抖动的,P2.4-P2.7为正常- -!
回复 支持 反对

使用道具 举报

发表于 2015-9-16 17:33:55 | 显示全部楼层
请问一下  舵机不动  是什么原因
回复 支持 反对

使用道具 举报

发表于 2015-9-16 23:20:34 | 显示全部楼层
太感谢了,刚才下进单片机里OK,控制正常。我的单片机是STC12C5608AD ,晶振11.0592M,舵机输出口是P2并加了上拉,驱动刚刚的。
回复 支持 反对

使用道具 举报

发表于 2015-9-16 23:26:30 | 显示全部楼层
hawkwu 发表于 2013-6-5 20:09
舵机是这样接的么?舵机电源+到单片机VCC ,-到GND,信号线接P0.1,一接上就开始抖,一点一点逆时针转,很 ...

我的是总电源--7805到单片机。---7806到舵机vcc.要共地。信号接IO口,IO口最好加5k--10k的上拉。绝对OK.这个程序我下进单片机控制正常。
回复 支持 反对

使用道具 举报

发表于 2015-9-16 23:35:00 | 显示全部楼层
1904293411 发表于 2014-5-10 18:25
不能用啊楼主??没有个口连接指示灯,可以看看哪里出问题了,P0口接舵机?店里的驱动板不是在P1口吗?
  1. #include<REG52.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint buffer[3];
  5. uint rec_flag=0;
  6. sbit zhuangtaideng=P3^7;//状态灯
  7. sbit dadeng       =P3^4;  //大灯
  8. sbit zuozhuanxd   =P1^1; //转向灯
  9. sbit youzhuanxd   =P2^7;
  10. sbit in1=P1^2; //电机IO
  11. sbit in2=P1^3;
  12. sbit in3=P1^5;
  13. sbit in4=P1^6;
  14. sbit ena=P1^4;
  15. sbit enb=P1^7;
  16. sbit servo0=P2^0; //舵机IO
  17. sbit servo1=P2^1;
  18. sbit servo2=P2^2;
  19. sbit servo3=P2^3;
  20. sbit servo4=P0^4;
  21. sbit servo5=P0^5;
  22. sbit servo6=P0^6;
  23. sbit servo7=P0^7;

  24. uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
  25. uint pwm_flag=0;
  26. uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)
  27. uint code ms2_5Con=2304; //2.5ms计数
  28. /*-----------串口初始化----------------------------*/
  29. void UART_Init(void)
  30. {
  31.         TMOD = 0x21;
  32.         PCON = 0x00;
  33.         SCON = 0x50;
  34.         TH1 = 0xFd; //设置波特率 9600
  35.         TL1 = 0xFd;
  36.         TR1 = 1; //启动定时器1
  37.        
  38.         ES = 1; //开串口中断
  39.         EA = 1; //开总中断
  40.         IT0=0;
  41.         EX0=1;
  42. }
  43. void delay(uint z)
  44. {
  45.           uint x,y;
  46.         for(x=z;x>0;x--)
  47.         for(y=800;y>0;y--);
  48. }
  49. void qianjin()
  50. {
  51.            in1=1;
  52.         in2=0;
  53.         in3=1;
  54.         in4=0;
  55.         ena=1;
  56.         enb=1;
  57. }
  58.   void houtui()
  59. {
  60.            in1=0;
  61.         in2=1;
  62.         in3=0;
  63.         in4=1;
  64.         ena=1;
  65.         enb=1;
  66. }
  67.   void zuozhuan()
  68. {
  69.         youzhuanxd=1;
  70.            in1=1;
  71.         in2=0;
  72.         in3=0;
  73.         in4=1;
  74.         ena=1;
  75.         enb=1;
  76.         zuozhuanxd=0;
  77. }
  78.   void youzhuan()
  79. {
  80.         zuozhuanxd=1;
  81.            in1=0;
  82.         in2=1;
  83.         in3=1;
  84.         in4=0;
  85.         ena=1;
  86.         enb=1;
  87.         youzhuanxd=0;
  88. }
  89. void tingzhi()
  90. {
  91.         youzhuanxd=1;
  92.         zuozhuanxd=1;
  93.            in1=0;
  94.         in2=0;
  95.         in3=0;
  96.         in4=0;
  97.         ena=0;
  98.         enb=0;
  99. }
  100. void zhuangtaizhishi()
  101. {
  102.         uchar i;
  103.         for(i=0;i<70;i++)
  104.         {
  105.                  zhuangtaideng=0;
  106.                 delay(200);       
  107.                 zhuangtaideng=1;
  108.                 delay(200);
  109.         }
  110. }
  111. /*------------------------舵机定时器--------------------------*/
  112. void Timer0Init()
  113. {
  114.         //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  115.         //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
  116.         TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  117.         TH0=-ms2_5Con>>8; //给定初值,2.5ms中断
  118.         TL0=-ms2_5Con;
  119.         EA=1; //总中断打开
  120.         ET0=1; //定时器0中断打开
  121.         TR0=1; //定时器0开关打开
  122. }

  123. /*------------------------角度值转换--------------------------*/
  124. uint Transform(uchar val)
  125. {
  126.         //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  127.         //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
  128.         //return (uint)(((float)(2/180)*X+0.5)/1000*11059200/12);
  129.         uint a = (val+46)*10;
  130.         if(a<ms0_5Con)
  131.         a=ms0_5Con;
  132.         if(a>ms2_5Con)
  133.         a=ms2_5Con;
  134.         return a;
  135. }

  136. /*------------------主函数---------------------------*/
  137. void main(void)
  138. {
  139.         zhuangtaizhishi();
  140.         UART_Init(); //初始化串口
  141.         Timer0Init();//舵机定时初始化
  142.         while(1)
  143.         {
  144.         }
  145. }

  146. /*--------------------串口解析执行-------------------------*/
  147. void Communication_Decode(void)
  148. {
  149.         if(buffer[0]==0x00)
  150.         {
  151.                 switch(buffer[1])
  152.                 {
  153.                         case 0x01:qianjin(); return;
  154.                         case 0x02:houtui(); return;
  155.                         case 0x03:zuozhuan(); return;
  156.                         case 0x04:youzhuan(); return;
  157.                         case 0x00:tingzhi(); return;
  158.                         default: return;
  159.                 }
  160.         }
  161.         else if(buffer[0]==0x01)
  162.         {
  163.                 if(buffer[2]>180)
  164.                 return;
  165.                 switch(buffer[1])
  166.                 {
  167.                         case 0x01:pwm[0]=Transform(buffer[2]); return; //角度值与脉宽计数值转换
  168.                         case 0x02:pwm[1]=Transform(buffer[2]); return;
  169.                         case 0x03:pwm[2]=Transform(buffer[2]); return;
  170.                         case 0x04:pwm[3]=Transform(buffer[2]); return;
  171.                         case 0x05:pwm[4]=Transform(buffer[2]); return;
  172.                         case 0x06:pwm[5]=Transform(buffer[2]); return;
  173.                         case 0x07:pwm[6]=Transform(buffer[2]); return;
  174.                         case 0x08:pwm[7]=Transform(buffer[2]); return;
  175.                         default : return;
  176.                 }
  177.         }
  178.          else if(buffer[0]==0x04)
  179.         {
  180.                      switch(buffer[1])
  181.                 {
  182.                           case 0x00:dadeng=1;return;
  183.                           case 0x01:dadeng=0;return;
  184.                           default : return;
  185.                 }
  186.         }
  187.         else
  188.         {
  189.         return;
  190.         }
  191. }

  192. /*------------------------舵机中断函数--------------------------*/
  193. void SteeringGear() interrupt 1
  194. {
  195.         switch(pwm_flag)
  196.         {
  197.                 case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  198.                 case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  199.                 case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  200.                 case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  201.                 case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  202.                 case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  203.                 case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  204.                 case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  205.                 case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  206.                 case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  207.                 case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  208.                 case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  209.                 case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
  210.                 case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
  211.                 case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
  212.                 case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  213.                 default:TH0=0xff; TL0=0x80; pwm_flag=0;
  214.         }
  215.         pwm_flag++;
  216. }

  217. /*------------------------串口中断函数--------------------------*/
  218. void INT_UartRcv(void) interrupt 4
  219. {
  220.         static int i;
  221.         if(RI==1)
  222.         {
  223.                 RI = 0;
  224.                 if(rec_flag==0)
  225.                 {
  226.                         if(SBUF==0xff)
  227.                         {
  228.                                 rec_flag=1;
  229.                                 i=0;
  230.                         }
  231.                 }
  232.                 else
  233.                 {
  234.                         if(SBUF==0xff)
  235.                         {
  236.                                 rec_flag=0;
  237.                                 if(i==3)
  238.                                 {
  239.                                         Communication_Decode();
  240.                                 }
  241.                                         i=0;
  242.                         }
  243.                         else
  244.                         {
  245.                                 buffer[i]=SBUF;
  246.                                 i++;
  247.                         }
  248.                 }
  249.         }
  250.         else
  251.         {
  252.                 TI = 0;
  253.         }
  254. }
复制代码

这个是通过楼主的程序加了状态灯延时,和转向指示灯,只用了4路舵机P20-P23。我的单片机是STC12C5608A D   IO口不太够用,想添加超声波和循迹。记住晶振必须11.0592
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-23 00:10 , Processed in 1.163745 second(s), 16 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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