3544|8

39

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

循迹小车,PWM [复制链接]

对于刚做的小车,它还不能很好的循迹,关键是它跑着跑着,速度就会变得很快,我明明又没有给它设置那么快的速度,这时候就得拔掉数据线,过一会再让它跑,刚开始的时候正常,可是循迹寻了一圈后就又变快了,感觉它的速度就不是我写的那样的。还有的时候给它一上电,它就自动的跑得很快,请问这是为啥啊?电机用的是四个直流电机,控制是买了个四驱模块是用定时器输出PWM波控制的,单片机用的430F5529

最新回复

看看你的电机驱动电路,用示波器看看,有时候MOS管输入会异常  详情 回复 发表于 2016-7-20 09:55
 
点赞 关注

回复
举报

305

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
看图分析
 
 

回复

1658

帖子

1

TA的资源

纯净的硅(高级)

板凳
 
"它一上电,它就自动的跑得很快" 感觉是跑出了全速,也就是100%的占空比

具体什么原因,有可能是软件有bug ;也可能是硬件连接不可靠,导致驱动模块全速运行
 
 
 

回复

151

帖子

3

TA的资源

一粒金砂(中级)

4
 
每次我遇到像你这样提问题的 简单而笼统 没有具体的程序或者截图  你是让大家猜问题吗

点评

不好意思啊,这是我写的程序,麻烦大神帮我看看 #include #define uint unsigned int void Initclock(); void InitIO(); void Speed(uint a,uint b,uint c,uint d,uint e,uint f); void Mydelay(uin  详情 回复 发表于 2016-7-19 09:33
 
 
 

回复

39

帖子

0

TA的资源

一粒金砂(中级)

5
 
wanyisq 发表于 2016-7-19 08:55
每次我遇到像你这样提问题的 简单而笼统 没有具体的程序或者截图  你是让大家猜问题吗

不好意思啊,这是我写的程序,麻烦大神帮我看看
#include
#define  uint   unsigned int   
void  Initclock();
void  InitIO();
void  Speed(uint a,uint b,uint c,uint d,uint e,uint f);
void  Mydelay(uint t);
void  Back(uint x,uint y,uint z);
void  main()
{
   WDTCTL = WDTPW + WDTHOLD;
   Initclock();//主时钟和子系统时钟频率为4M,辅助时钟为10khz
   InitIO();
   while(1)
   {
     switch(P3IN&0xf0)
     {
     case 0x00:            //四个全不在黑带上
     case 0xf0:
        Back(2300,2300,2500);//倒退
        P1SEL&=~(BIT4+BIT5);
        P1OUT&=~(BIT4+BIT5);
        Mydelay(20);
        break;
     case 0x10:      //最左边一个在黑带上
       Speed(2200,2200,2490,2490,2500,2500);//循迹左转    周期为0.5S
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case 0x20:     //最左边旁边一个在黑带上
        Speed(2300,2300,2400,2400,2500,2500);//循迹左转  周期为0.5S
        P1SEL&=~(BIT2+BIT3);
        P2SEL&=~(BIT4+BIT5);
        P1OUT&=~(BIT2+BIT3);
        P2OUT&=~(BIT4+BIT5);
        Mydelay(20);//反应时间
        break;
     case 0x30:    //最左边和它旁边的一个在黑带上
        Speed(2300,2300,2400,2400,2500,2500);//循迹左转
        P1SEL&=~(BIT2+BIT3);
        P2SEL&=~(BIT4+BIT5);
        P1OUT&=~(BIT2+BIT3);
        P2OUT&=~(BIT4+BIT5);
        Mydelay(20);//反应时间  
        break;
     case 0x60:            //中间两个在黑带上
       Speed(2200,2200,2200,2200,2500,2500);//循迹直
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case  0x40:      //最右边旁边一个在黑带上
       Speed(2490,2490,2300,2300,2500,2500);//循迹右转
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case 0x80:      //最右边一个在黑带上
       Speed(2490,2490,2200,2200,2500,2500);//循迹右转
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case 0xC0:         //最右边和它旁边的一个在黑带
       Speed(2490,2490,2300,2300,2500,2500);//循迹右转
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case 0x70:     //左边三个在黑带上
       Speed(1400,1400,2495,2495,2500,2500);//循迹左直转
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;
     case 0xe0:     //右边三个在黑带上
       Speed(2495,2495,1400,1400,2500,2500);//循迹右直转
       P1SEL&=~(BIT2+BIT3);
       P2SEL&=~(BIT4+BIT5);
       P1OUT&=~(BIT2+BIT3);
       P2OUT&=~(BIT4+BIT5);
       Mydelay(20);//反应时间
       break;   
     default:
        P1SEL&=~(BIT2+BIT3);
        P2SEL&=~(BIT4+BIT5);
        P1OUT&=~(BIT2+BIT3);
        P2OUT&=~(BIT4+BIT5);
        Mydelay(10);
       break;
     }
   }
}  



void  Initclock()
{
   int i;
   P5SEL |= BIT2+BIT3; //将IO配置为XT2功能
   UCSCTL6&=~XT2OFF;//选择XT2作为时钟源  4M

   UCSCTL3 |= SELREF_2;                  //FLL模块的参考时钟源选择REFO
   UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK  10khz

   do{
     UCSCTL7&=~(XT2OFFG+DCOFFG+XT1LFOFFG);
     SFRIFG1&=~OFIFG;//清除振荡器失效标志
    for(i=0xff;i>0;i--);//稳定时间
    }while((SFRIFG1&OFIFG)!=0);//如果振荡器失效则继续循环
  UCSCTL4|=SELM__XT2CLK + SELS__XT2CLK ;//主时钟的信号源为XT2,子系统时钟的信号源也为XT2,
  //UCSCTL5 =DIVS__4;//子系统时钟4分频  1M,主时钟4M
}


void  InitIO()
{
   P1SEL|=BIT2+BIT3; //声明有特殊功能,不做普通 I/O使用
   P2SEL|=BIT4+BIT5;
   P1DIR|=BIT2+BIT3;   //输出
   P2DIR|=BIT4+BIT5;
   //P1DS|=BIT2+BIT3;
   //P2DS|=BIT4+BIT5;
   
   P3DIR|=BIT0+BIT1;   //输出
   P3OUT&=~(BIT0+BIT1);//输出低电平
   
   P1DIR|=BIT4+BIT5;    //接两个后轮负端
   P1SEL|=BIT4+BIT5;      //声明有特殊功能,不做普通I/O口使用
   P1OUT&=~(BIT4+BIT5);//输出低电平
   
   P3DIR&=~(BIT4+BIT5+BIT6+BIT7);//红外对管读取高低电平
   P3REN|=BIT4+BIT5+BIT6+BIT7;
}
/*a为TAOCCR1的值,b为TAOCCR2的值 ,c为TA2CCR1的值 ,d为TA2CCR2的值,e为TA0CCR0的值,f为TA2CCR0的值
TA0CCR1控制D轮,TA0CCR2控制B轮,TA2CCR1控制C轮,TA2CCR2控制A轮*/
void  Speed(uint a,uint b,uint c,uint d,uint e,uint f)
{
   P1SEL|=(BIT2+BIT3);
   P2SEL|=(BIT4+BIT5);
  
   //TA0CCTL0=CCIE;   //定时器 A0的捕获比较器0开启 CCIFG位中断  
   TA0CCR0=e;    //置入计数终值,则 PWM周期为4s
   //TA0CCTL1=CCIE;   //捕获比较器1开启中断
   TA0CCR1=a;
   //TA0CCTL2=CCIE;   //捕获比较器2开启中断
   TA0CCR2=b;
   
   //TA2CCTL0=CCIE;   //定时器 A2的捕获比较器0开启 CCIFG位中断   
   TA2CCR0=f;       //周期为2S
   //TA2CCTL1=CCIE;   //捕获比较器1开启中断
   TA2CCR1=c;   
   //TA2CCTL2=CCIE;   //捕获比较器4开启中断
   TA2CCR2=d;   //d为47000时,6.4ms
   
   TA0CTL|=TACLR;   //将计时器 A0清零  
   TA2CTL|=TACLR;
   TA0CTL|=TASSEL_1+MC_3;  //定时器选择 ACLK作为时钟源,且为 连续计数模式
   TA2CTL|=TASSEL_1+MC_3;  //定时器选择 ACLK作为时钟源,且为 连续计数模式
   
   TA0CCTL1=OUTMOD_4;  //定时器 A1中的捕获比较器1,输出模式为4翻 转
   TA0CCTL2=OUTMOD_4;
   TA2CCTL1=OUTMOD_4;
   TA2CCTL2=OUTMOD_4;
   
   Mydelay(50);   
}
void  Back(uint x,uint y,uint z)
{
   //TA0CCTL0=CCIE;   //定时器 A0的捕获比较器0开启 CCIFG位中断  
   TA0CCR0=z;    //置入计数终值,则 PWM周期为4s
   //TA0CCTL3=CCIE;   //捕获比较器3开启中断
   TA0CCR3=x;
   //TA0CCTL4=CCIE;   //捕获比较器4开启中断
   TA0CCR4=y;
   P1SEL&=~(BIT2+BIT3);   //关闭第二功能
   P2SEL&=~(BIT4+BIT5);
   P1OUT&=~(BIT2+BIT3);  
   P2OUT&=~(BIT4+BIT5);
   P1SEL|=BIT4+BIT5;
   TA0CTL|=TACLR;   //将计时器 A0清零
   TA0CTL|=TASSEL_1+MC_3;
   TA0CCTL3=OUTMOD_4;
   TA0CCTL4=OUTMOD_4;
   Mydelay(50);
}
void  Mydelay(uint t)
{
   int i;
   while(t--)
   {
     for(i=0;i<=4000;i++);///延时1ms
   }
}
 
 
 

回复

247

帖子

1

TA的资源

一粒金砂(高级)

6
 
用示波器把PWM图拉出来看看,是不是占空比增加了,如果是的话,是不是程序里面PWM那块有自加或者没有清零
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

7
 
debu下单步调试或者设置断点,另外如果有条件的话,可以考虑看看波形啊。
 
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

8
 
测试一下不是和简单吗?一台普通示波器实测一下PWM的波形,就可以判断软件是否正常。再用信号源给驱动电路输入一个PWM信号,就可以判断硬件是否正常。
 
 
 

回复

527

帖子

1

TA的资源

一粒金砂(高级)

9
 
看看你的电机驱动电路,用示波器看看,有时候MOS管输入会异常
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表