查看: 2258|回复: 0
打印 上一主题 下一主题

电机转速控制

[复制链接]
跳转到指定楼层
沙发
发表于 2015-3-28 14:00:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是用1MS的定时中断程序来控制小车的前进。
当FLAG=0时,小车停止前进,
当FLAG=1时,小车前进。
假设如楼主所说遇到故障反而转的更快了,我认为应该是TMDAT2电平与楼主所认为相反的原因,由于没有具体的电路图所以没法更加详细的分析。现在仅仅把楼主程序的思路分析一下,楼主可以自己修改。
#include <reg52.h>
#define uint unsigned int
unsigned int i;
unsigned int j;
unsigned int k;
unsigned char flag;
sbit PWM1=P1^1;     //后轮驱动前进
sbit PWM2=P1^2;     //后轮驱动后退
sbit PWM3=P1^3;    //前轮右转
sbit PWM4=P1^4;    //前轮左转
sbit TMDAT1=P0^1;    //前左红外接口
sbit TMDAT2=P0^2;    //前中红外接口
sbit TMDAT3=P0^3;    //前右红外接口
sbit TMDAT4=P0^4;    //后轮记数红外接口

void delay(unsigned int cnt)

{
     while(--cnt);
}                              //无限循环

void timer0() interrupt 1                ///*  定时中断*/
{

   PWM1=flag;     //此中断的作用在于产生一个脉冲波,即周期1MS,为正时间为1500时钟周期的脉冲。此脉冲用于驱动小车前进,即当FLAG为1时,小车能产生为正的脉冲,小车前进,当FLAG为0时,产生脉冲恒为0,小车停止。楼主所想的改变周期可以改变定时时间,改变脉宽可以改变DELAY(1500)
   delay(1500);
   PWM1=0;
}

void IR_decode1()                       //红外解码程序==进入外部中断后的TMDAT电平应为0
{
  //    PWM1=0;
   PWM3=1; //左转            
//   delay1(5);
   PWM3=0;
}
void IR_decode3()                       //红外解码程序==进入外部中断后的TMDAT电平应为0
{

}
void IR_decode4()                       //后轮记数红外接口
{
   if(j==1) //从程序来看此段程序的作用是当后轮每计数I到5此时,小车运行方向改变,先往左,在5次后往右,然后再5次后往坐,如此往复。
{
     j=0;
     i++;//后轮转动圈速
     if(i==5)
      {
         if(k==1)//以右为先转,k==1时左转
        {
          PWM4=1;
          k=0;
        }
       else   //k==0时右转
        {
         PWM3=1;
         k=1;
        }
       PWM1=0;//停车
       flag=0;
      //  TR0=0;
       delay(10000);
     //   TR0=1;
       PWM4=0;
       PWM3=0;
       PWM1=1;//重起 开车
       flag=1;
       i=0;
      }
   }
}

main()
{
     TMOD=0x01;//定时器设置 1ms in 12M crystal
     TCON=0x10;
     TH0=(65536-1000)/128;
     TL0=(65536-1000)%128;//定时1mS
  PWM1=0;
  PWM2=0;
  PWM3=0;
  PWM4=0;
  flag=1;
     delay(1200);
     IE=0x82;  //打开中断
  while(1){
   //     while(!TMDAT1)IR_decode1();
    //    while(!TMDAT3)IR_decode3();
          while(TMDAT4)j=1;   //此处为等待TMDAT4变为低电平。
    while(!TMDAT4)IR_decode4();  //当变为低电平时运行IR_DECODE4();
          while(!TMDAT2)flag=0;//此处等待TMDAT2变为高电平。等待期间小车停止。
    while(flag==0)
    {
    while(TMDAT2)flag=1; //此处当TMDAT2为高电平时,小车运行。
    }
       }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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