找回密码
 马上注册

QQ登录

只需一步,快速开始

搜索
查看: 13800|回复: 51

DIY的瓦力机器人玩具,从遥控器接收机捕获信号到STC12芯片失败,大家帮看看问题...

  [复制链接]
发表于 2014-1-5 09:54:18 | 显示全部楼层 |阅读模式

DIY的瓦力机器人玩具,参考日本宅男制作的坦克,从航模遥控器获取信号到单片机,再由单片机输出PWM信号到L298N驱动板,驱动2个履带前进后退,实现加减速、直行、拐弯、原地转等功能。现电路部分连接完成,但在调试时拨动遥控器的摇杆,俩轮子没有任何反应,大家帮助看看问题出在哪?这是DIY的瓦力机器人,从一堆铝型材和铝板割、锉、钻才做成今天的样子,不容易啊。
IMG_0002.JPG IMG_0010.JPG
在此必须先向本论坛的azurexfak 兄致敬,是他的帖子帮我理解了航模混控的原理,对于单片机菜鸟的我,更是直接借用了他的程序(sorry本人对电路不通,所以只能照扒,本人做玩具只是用来自己玩,不会用于商业目的)。
此链接为azurexfak兄的帖子:http://www.geekfans.com/thread-62034-1-1.html



硬件部分连接如下:
未命名1.JPG

未命名2.JPG
开发板原配的芯片是STC89C52RC,结果搞不定程序,看到 azurexfak 兄的程序后才把芯片更换为STC12C5A60S2
未命名3.JPG

未命名4.JPG


IMG_0004.JPG

从航模遥控器接收机到单片机的连接(捕获PWM信号的线),我只是把接收机的1、2通道的连接舵机的线(本来是红、黑、白三根)中的白色线对应的接头,用杜邦线连到单片机,不知对不对?
IMG_0006.JPG

IMG_0007.JPG IMG_0009.JPG IMG_0012.JPG IMG_0013.JPG IMG_0016.JPG IMG_0017.JPG


程序部分(直接借用azurexfak兄的程序,只不过他用的是STC12C2052AD,我使用的是STC12C5A60S2,把引脚更改了一下而已):

#include"STC12C5A60S2.H"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit input1=P3^0;        //P3.0 纵向信号输入                           
sbit input2=P3^1;        //P3.1 横向信号输入                           
sbit output11=P2^0;                                       
sbit output12=P2^1;                                       
sbit output21=P2^2;
sbit output22=P2^3;
bit no1=1,no2=1,leftup=0,leftdown=0;
bit rightup=0,rightdown=0;
uint no5=0,no6=0;
uchar i;
char no7=0,no8=0,no9=0,no10=0;
char no11=0,no12=0;
void timer();
void zx();
void hx();
void hh();
void sc();
void main()
{                                                      
     P1M0=0x00;   //由于要在P1.3和P1.4输出PWM,故把P3.7和P3.5设为推挽输出。
     P1M1=0x18;   //同上。
     AUXR=0x80;   //计数器工作在1T模式(计数速度与晶振频率相同)
     TMOD=0x02;   //计数器0工作在方式2(自动装入计数值模式)
     TH0=254;     //PWM模块输出频率约为23KHz
     TL0=254;
     EA=1;
     ET0=1;
     CMOD=0x05;                                             
     CCON=0x40;                                             
     CCAPM0=0x42;                                            
     CCAPM1=0x42;                                            
     CCAP0H=0xff;                                            
     CCAP0L=0xff;                                            
     CCAP1H=0xff;                                            
     CCAP1L=0xff;                                            
     TR0=1;
     while(1)
     {
          if((input1&no1)==1)                                //纵向通道扫描
          {
               while(input1==1)
               {
                    no5++;
                    timer();
               }
               no1=0;
          }
          if((input2&no2)==1)                                //横向通道扫描
          {
               while(input2==1)
               {
                    no6++;
                    timer();
               }
               no2=0;
          }
          if((no1|no2)==0)                                   //单次扫描完成判断
          {
               no1=1;
               no2=1;
               zx();
               hx();
               hh();
               sc();
               output11=leftup;                              //每次对扫描得到的数据处理完成之后对电机方向控制端口进行置位
               output12=leftdown;                            //同上
               output21=rightup;                             //同上
               output22=rightdown;                           //同上
               no5=0;
               no6=0;
          }
     }
}
void timer()                                                
{
     for(i=18;i>0;i--);
         _nop_();
         _nop_();                                                         
         _nop_();                                                         
}
void zx()      //纵向摇杆信号处理子程序
{
     if(no5<115)
     {
          no7=-7;
          no8=-7;
     }
     else if(no5>=115&&no5<120)
     {
          no7=-6;
          no8=-6;
     }
     else if(no5>=120&&no5<125)
     {
          no7=-5;
          no8=-5;
     }
     else if(no5>=125&&no5<130)
     {
          no7=-4;
          no8=-4;
     }
     else if(no5>=130&&no5<135)
     {
          no7=-3;
          no8=-3;
     }
     else if(no5>=135&&no5<140)
     {
          no7=-2;
          no8=-2;
     }
     else if(no5>=140&&no5<145)
     {
          no7=-1;
          no8=-1;
     }
     else if(no5>=145&&no5<=155)
     {
          no7=0;
          no8=0;
     }
     else if(no5>155&&no5<=160)
     {
          no7=1;
          no8=1;
     }
     else if(no5>160&&no5<=165)
     {
          no7=2;
          no8=2;
     }
     else if(no5>165&&no5<=170)
     {
          no7=3;
          no8=3;
     }else if(no5>=170&&no5<175)
     {
          no7=4;
          no8=4;
     }
     else if(no5>=175&&no5<180)
     {
          no7=5;
          no8=5;
     }
     else if(no5>=180&&no5<185)
     {
          no7=6;
          no8=6;
     }
     else
     {
          no7=7;
          no8=7;
     }
         }
void hx()        //横向摇杆信号处理子程序
{
     if(no6<115)
     {
          no9=7;
          no10=-7;
     }
     else if(no6>=115&&no6<120)
     {
          no9=6;
          no10=-6;
     }
     else if(no6>=120&&no6<125)
     {
          no9=5;
          no10=-5;
     }
     else if(no6>=125&&no6<130)
     {
          no9=4;
          no10=-4;
     }
     else if(no6>=130&&no6<135)
     {
          no9=3;
          no10=-3;
     }
     else if(no6>=135&&no6<140)
     {
          no9=2;
          no10=-2;
     }
     else if(no6>=140&&no6<145)
     {
          no9=1;
          no10=-1;
     }
     else if(no6>=145&&no6<=155)
     {
          no9=0;
          no10=-0;
     }
     else if(no6>155&&no6<=160)
     {
          no9=-1;
          no10=1;
     }
     else if(no6>160&&no6<=165)
     {
          no9=-2;
          no10=2;
     }
     else if(no6>165&&no6<=170)
     {
          no9=-3;
          no10=3;
     }
     else if(no6>=170&&no6<175)
     {
          no9=-4;
          no10=4;
     }
     else if(no6>175&&no6<=180)
     {
          no9=-5;
          no10=5;
     }
     else if(no6>180&&no6<=185)
     {
          no9=-6;
          no10=6;
     }
     else
     {
          no9=-7;
          no10=7;
     }
}
void hh()                                                    //混合两通道信号子程序
{
     no11=no7+no9;
     no12=no8+no10;
     if(no11>7)
     {
          no11=7;
     }
     if(no11<-7)
     {
          no11=-4;
     }
     if(no12>7)
     {
          no12=7;
     }
     if(no12<-7)
     {
          no12=-7;
     }
}
void sc()                                                    //输出占空比选择和电机旋转方向选择子程序
{
     switch(no11)
     {
          case 7:                          
                 CCAP0H=0x0a;
                 leftup=1;
                 leftdown=0;                 
                 break;
          case 6:                          
                 CCAP0H=0x27;
                 leftup=1;
                 leftdown=0;                 
                 break;
          case 5:                          
                 CCAP0H=0x4b;
                 leftup=1;
                 leftdown=0;                 
                 break;
          case 4:                          
                 CCAP0H=0x6f;
                 leftup=1;
                 leftdown=0;                                 
                 break;
          case 3:                          
                 CCAP0H=0x93;
                 leftup=1;
                 leftdown=0;                                 
                 break;
          case 2:                          
                 CCAP0H=0xb7;
                 leftup=1;
                 leftdown=0;                                 
                 break;
          case 1:                          
                 CCAP0H=0xdb;
                 leftup=1;
                 leftdown=0;                                 
                 break;
          case 0:                          
                 CCAP0H=0xff;
                 leftup=0;
                 leftdown=0;                 
                 break;
         case -1:                          
                 CCAP0H=0xdb;
                 leftup=0;
                 leftdown=1;                                 
                 break;
         case -2:                          
                 CCAP0H=0xb7;
                 leftup=0;
                 leftdown=1;                                 
                 break;
         case -3:                          
                 CCAP0H=0x93;
                 leftup=0;
                 leftdown=1;                                 
                 break;
         case -4:                          
                 CCAP0H=0x6f;
                 leftup=0;
                 leftdown=1;
                 break;
         case -5:                          
                 CCAP0H=0x4b;
                 leftup=0;
                 leftdown=1;                 
                 break;                 
         case -6:                          
                 CCAP0H=0x27;
                 leftup=0;
                 leftdown=1;                 
                 break;
         case -7:                          
                 CCAP0H=0x0a;
                 leftup=0;
                 leftdown=1;                 
                 break;
     }
     switch(no12)
     {
          case 7:                          
                 CCAP1H=0x0a;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 6:                          
                 CCAP1H=0x27;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 5:                          
                 CCAP1H=0x4b;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 4:                          
                 CCAP1H=0x6f;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 3:                          
                 CCAP1H=0x93;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 2:                          
                 CCAP1H=0xb7;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 1:                          
                 CCAP1H=0xdb;
                 rightup=1;
                 rightdown=0;                 
                 break;
          case 0:                          
                 CCAP1H=0xff;
                 rightup=0;
                 rightdown=0;                 
                 break;
         case -1:                          
                 CCAP1H=0xdb;
                 rightup=0;
                 rightdown=1;
                 break;
         case -2:                          
                 CCAP1H=0xb7;
                 rightup=0;
                 rightdown=1;                 
                 break;                 
         case -3:                          
                 CCAP1H=0x93;
                 rightup=0;
                 rightdown=1;                 
                 break;
         case -4:                          
                 CCAP1H=0x6f;
                 rightup=0;
                 rightdown=1;                 
                 break;
         case -5:                          
                 CCAP1H=0x4b;
                 rightup=0;
                 rightdown=1;                 
                 break;
         case -6:                          
                 CCAP1H=0x27;
                 rightup=0;
                 rightdown=1;                 
                 break;
         case -7:                          
                 CCAP1H=0x0a;
                 rightup=0;
                 rightdown=1;                 
                 break;
     }
}




IMG_0014.JPG
 楼主| 发表于 2014-1-5 10:01:26 | 显示全部楼层
硬件都ok了,就差这个程序了,急人啊
IMG_9957.JPG IMG_9958.JPG
IMG_9928.JPG

IMG_9997.jpg

回复 支持 反对

使用道具 举报

发表于 2014-1-5 11:02:24 | 显示全部楼层
好厉害         
回复 支持 反对

使用道具 举报

发表于 2014-1-5 11:37:31 | 显示全部楼层
高端科技····仰望高端玩家···
回复 支持 反对

使用道具 举报

发表于 2014-1-5 12:36:00 | 显示全部楼层
好厉害。。不懂这个的说。。
回复 支持 反对

使用道具 举报

发表于 2014-1-5 13:59:21 | 显示全部楼层
膜拜睾端玩家
回复 支持 反对

使用道具 举报

发表于 2014-1-5 16:53:22 | 显示全部楼层
不懂程序,但我觉得没必要把整个开发板装进去,这太奢侈了。。。
回复 支持 反对

使用道具 举报

发表于 2014-1-5 18:18:09 | 显示全部楼层
骨架做的真是漂亮啊。。。

摇控原理非常简单,不过程序写的真是不敢。。。。。

为什么不采用中断的方式呢?
程序应该非常简单。

接收机输出的应该是很明确的方波,采用中断要简单多了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-5 19:10:57 | 显示全部楼层
vague 发表于 2014-1-5 18:18
骨架做的真是漂亮啊。。。

摇控原理非常简单,不过程序写的真是不敢。。。。。

多谢vague兄关注。
本人对敲敲打打的金属还凑合,但是对于软件编程绝对是菜菜鸟刚学习,所以才直接借用论坛前辈的程序(几乎是原版扒下来的),你说的中断啥的对我来说也是新东西,vague兄有啥好的成熟的程序发俺作为母本参考。
回复 支持 反对

使用道具 举报

发表于 2014-1-5 19:15:54 | 显示全部楼层
去贴吧看看吧     比如单片机 技术宅什么的吧
回复 支持 反对

使用道具 举报

发表于 2014-1-5 20:46:42 | 显示全部楼层
我不是玩51的,
我是写AVR单片机的
不过思路都是一样的

一共只有两路,可以利用两个外部中断。
计时,解码PPM就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-5 23:13:55 | 显示全部楼层
vague 发表于 2014-1-5 20:46
我不是玩51的,
我是写AVR单片机的
不过思路都是一样的

好的,多谢指点。
我再琢磨琢磨。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-5 23:14:06 | 显示全部楼层
TheWalkingDead 发表于 2014-1-5 19:15
去贴吧看看吧     比如单片机 技术宅什么的吧

好的,多谢提醒。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-5 23:14:22 | 显示全部楼层

俺也是新手,呵呵
回复 支持 反对

使用道具 举报

发表于 2014-1-6 07:57:23 | 显示全部楼层
虽然什么都不懂但是   好厉害的说
回复 支持 反对

使用道具 举报

发表于 2014-1-7 14:37:53 | 显示全部楼层
本帖最后由 azurexfak 于 2014-1-7 14:41 编辑

感谢brart兄对我的帖子的支持。你使用的12C5A60S2这款单片机,我平常用的不多,但可以肯定的是它的管脚定义和12C2052AD有所区别。我看你吧PWM输出的管脚改好了,但其他输出没有改。我的输出控制信号输出应该不能与你的L298驱动板协调,因为毕竟我当初设计时这是为了适应我自己的驱动板考虑的,没有考虑兼容性问题。不知你开发板的晶振是多少,时钟不对的话,也无法正常运行(不过看你说轮子根本不动,恐怕还是和输出信号定义不兼容有很大关系)。我再仔细了解一下L298的管脚定义,尽量帮到你。
同时也感谢vague兄的建议。我也是新手,大家的建议也是我前进的动力。
回复 支持 反对

使用道具 举报

发表于 2014-1-7 15:18:00 | 显示全部楼层
本帖最后由 azurexfak 于 2014-1-7 15:41 编辑

发现了个严重问题。你的l298模块电源没和单片机电源共地,接收器电源和单片机电源也没共地。不形成回路电平信号无法正常传输。但要注意电平相互之间的兼容。比如接收机使用6V电源,单片机使用5V电源,在接收机把信号输入单片机时要注意分压。
但要小心干扰哦,在l298电源上加个电解和独石电容,或者干脆使用光耦作信号隔离。我刚才简单看了一下l298的管脚定义,你的连法应该没问题。
我表达能力不强,可能说的不清楚,还请见谅。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-7 19:50:15 | 显示全部楼层
azurexfak 发表于 2014-1-7 15:18
发现了个严重问题。你的l298模块电源没和单片机电源共地,接收器电源和单片机电源也没共地。不形成回路电平 ...

azurexfak兄,终于等到你啦
感谢你的回复,你的回复对我帮助很大。
因为我是菜鸟,所以一些问题可能比较初级,别介意啊:
1,单片机使用4节1.5V干电池供电,L298N使用14.8V的航模4S电池供电(给2个电机供电,同时也供驱动板),航模遥控接收机使用11.1V航模3S电池,通过UBEC连接接收机第三通道供电,三者确实没有共地,但问题也来了,怎么共地啊(菜鸟啊)?是用杜邦线把单片机、驱动板L298N和航模接收机的地端接起来吗?还是用L298N给单片机供电(l298N好像有5V电源输出接口),请再具体指导一下啊。
2,你说在“在l298电源上加个电解和独石电容,或者干脆使用光耦作信号隔离"对我来说比较深奥啊。你又提到”我刚才简单看了一下l298的管脚定义,你的连法应该没问题。“,是指我不用管什么电解和独石电容吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-7 20:27:27 | 显示全部楼层
azurexfak 发表于 2014-1-7 15:18
发现了个严重问题。你的l298模块电源没和单片机电源共地,接收器电源和单片机电源也没共地。不形成回路电平 ...

azurexfak兄,还有个关于从遥控接收机到单片机(捕获PWM信号)的问题:
遥控器接收机一共有6个通道,每个通道有三个接头(连接舵机的线分红黑白三条线,白色应该是PWM信号线),我使用的是第1、2通道混控,所以我目前的接法是把第1、2通道的信号线接头(即白色信号线对应的那个接口)用各一根杜邦线分别连接到单片机的2个输入I/O口,这样子接法对吗?
再结合你说的共地的问题,是不是应该再用一根杜邦线,一端插在单片机的”地“上,一端插在航模遥控接收机的某个通道(哪个通道?)的黑色舵机线对应的那个接线头,就算是共地了吗?还是接到接收机电池的负极上?
我12年前从工科大学毕业,跟你学的是一个专业机械制造及自动化(但现在不从事技术了),但是专业知识与你相比惭愧啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-7 21:34:47 | 显示全部楼层
azurexfak 发表于 2014-1-7 15:18
发现了个严重问题。你的l298模块电源没和单片机电源共地,接收器电源和单片机电源也没共地。不形成回路电平 ...

azurexfak兄,我刚才寻找度娘帮助了一下,说共地就是把各个电源的负极相通,大家用一个基准。
所以说共地是不是我把单片机、航模遥控器接收机、l298N三者的供电电池的负极连接到一起就可以了?
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|极客迷网 ( ICP09011854

44030602000010

© 2009-2016 All Rights Reserved

GMT+8, 2022-6-30 18:25 , Processed in 0.232141 second(s), 66 queries , Gzip On, Memcache On.