智能车制作

标题: STC12C5A60S2从航模遥控器接收机模捕获PPM信号失败,请各位帮助看看问题在哪? [打印本页]

作者: 瓦力他爸    时间: 2014-1-7 00:42
标题: STC12C5A60S2从航模遥控器接收机模捕获PPM信号失败,请各位帮助看看问题在哪?
DIY个瓦力机器人,硬件已完工,可是软件调试失败!

从航模遥控器获取信号到STC12C5A60S2,再由单片机输出PWM信号到L298N驱动板,驱动2个履带前进后退,实现加减速、直行、拐弯、原地转等功能。
现电路部分连接完成,但在调试时拨动遥控器的摇杆,俩轮子没有任何反应,大家帮助看看问题出在哪?

万事具备,只欠程序的瓦力机器人。
[attach]54741[/attach][attach]54746[/attach][attach]54752[/attach][attach]54753[/attach][attach]54754[/attach][attach]54755[/attach]


[attach]54742[/attach][attach]54743[/attach][attach]54744[/attach][attach]54745[/attach][attach]54747[/attach][attach]54748[/attach][attach]54749[/attach][attach]54750[/attach][attach]54751[/attach]


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




程序是直接借用极客迷论坛上azurexfak兄的程序,只不过他用的是STC12C2052AD,我使用的是STC12C5A60S2,把引脚更改了一下(在此向azurexfak兄致敬)。


#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;
     }



作者: 瓦力他爸    时间: 2014-1-7 00:49
帖子在编辑过程中退出好几次,结果发现很多图片都重复发了,也编辑不了,大家只能将就看了
作者: k40368    时间: 2014-1-7 01:53
示波器慢慢测应该能找到信号短在哪里。机械赞一个,怎么不用STM32的芯片印个板,这样走线漂亮还能扩展很多功能
作者: 简单丹    时间: 2014-1-7 08:54
机器人挺不错的
作者: Jyoun    时间: 2014-1-7 09:26
定时10us中断,每次中断检查高低电平,若高,cnt++,若低,且cnt!=0,把cnt赋给另一个变量x,把cnt清零。x的值就是捕获的高电平时间,x*10us。屡试不爽。
作者: Jyoun    时间: 2014-1-7 09:33
如果只是开关控制电机,定时100us就够了,不过注意准确设置前进后退阈值。如果pwm调速控制电机,最好定时50us以下时间,模拟输出pwm时也可以用借鉴上边捕获pwm的方法。
作者: 以梦为马    时间: 2014-1-7 11:58
土豪,我们做朋友吧,上门指导。
作者: 瓦力他爸    时间: 2014-1-7 19:20
k40368 发表于 2014-1-7 01:53
示波器慢慢测应该能找到信号短在哪里。机械赞一个,怎么不用STM32的芯片印个板,这样走线漂亮还能扩展很多功 ...

恩,回头用示波器测测。多谢指点。
我单片机菜鸟,对51单片机还相对熟一些,STM32不太了解。

作者: 瓦力他爸    时间: 2014-1-7 19:21
以梦为马 发表于 2014-1-7 11:58
土豪,我们做朋友吧,上门指导。

上门当然欢迎了,住宿吃饭我来安排,就怕付钱都没有人帮助改程序啊。



作者: 瓦力他爸    时间: 2014-1-7 19:21
以梦为马 发表于 2014-1-7 11:58
土豪,我们做朋友吧,上门指导。

上门当然欢迎了,住宿吃饭我来安排,就怕付钱都没有人来帮忙啊


作者: 瓦力他爸    时间: 2014-1-7 20:46
Jyoun 发表于 2014-1-7 09:26
定时10us中断,每次中断检查高低电平,若高,cnt++,若低,且cnt!=0,把cnt赋给另一个变量x,把cnt清零。x ...

Jyoun兄,明白了,多谢指点!


作者: 寞落    时间: 2014-1-11 00:21
楼主我能说我毕业设计打算做这个么~~魂淡~
作者: 瓦力他爸    时间: 2014-1-11 07:08
更新一下1月9日和1月10日进展:

1月9日晚上进展:
今晚重新调整了一下,具体调整得内容是:
1、对照程序把航模遥控接收机的通道1接到P3.1即纵向扫描通道,通道2接P3.0横向扫描通道(航模遥控器在固定翼飞机时,1通道控制副翼即飞机左右倾斜,2通道控制俯冲和拉起),昨天我可能接反了。
2、把电机的正负极与l298n控制板IN1、IN2、IN3、IN4的接线重新调整了一下,保证与程序对应起来。
这么做了以后又测试了一下,又根据表现调整航模遥控器的混控,最后最接近实际效果的一种方式是把航模遥控器的1、2通道的混控关闭,在这种情况下还有问题。
a、(遥控接收机一直在供电状态),如果再先开遥控器电源,再打开电机、单片机电源后,在不动遥控器摇杆(居中)的情况下,两个电机都是后退状态,即一开机就后退。然后控制摇杆向上就前进,向左就拐弯,向右也拐弯,但是好像体现感觉不到档位,即速度感觉不可控,只有一种速度。拐弯时也是一个轮子从正转马上切到倒转,另一个轮子正转即原地拐弯,没有那种行进中的差速拐弯。另外车子停不下来,要不就是推摇杆往前开,要不就是放手后摇杆居中,车子仍然往后退。
b、(遥控接收机一直在供电状态)不开遥控器,直接开电机和单片机电源,车子的右轮子在自己转动。再开遥控器,就可以控制了。
估计问题出在哪?

1月10日晚上进展:
因为白电上班,所以只能晚上回家把孩子哄睡后捣鼓一会,昨晚用示波器测了从单片机输出给l298n驱动板EnA和EnB的信号,初步得出的结论是:输出的不是PWM信号,是固定的一个电平,不是方波,用示波器的测是一条直线,电压好像还不是5V(示波器用得不太熟练,数据不太确定),从前天晚上小车的不可调速表现来看也是如此。也就是说只要小车一通电,单片机就输出给Ena和Enb一个高电平,不是方波。奇怪的是如果先开航模遥控器电源,再开单片机、驱动板电源(航模遥控接收机一直是处于通电状态),那么2个轮子都是同时往后倒车,但是如果航模遥控器电源关闭,直接开单片机、驱动板电源(航模遥控接收机处于通电状态),只有右侧的一个轮子在倒车,左侧轮子不动。


[attach]54802[/attach][attach]54805[/attach][attach]54804[/attach][attach]54808[/attach][attach]54809[/attach][attach]54806[/attach][attach]54803[/attach]

搞得我家飘窗乱七八糟的,要疯了

作者: 诗画生    时间: 2015-5-6 13:35
你好,我做的车跟你做的瓦力一样的想法,可以交流下吗?!……




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2