这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » fengzh169的进程贴(红外遥控器控制直流电机,有视频,第2页上)

共18条 2/2 1 2 跳转至
院士
2011-12-06 11:02:10     打赏
11楼
视频在哪?

菜鸟
2011-12-06 12:16:36     打赏
12楼
用红外遥控器控制直流电机:
1、通过读取红外遥控器的键值,来控制PWM的占空比,P1.2引脚输出的波形如下图


电路连接图:



2、把P1.2上的PWM信号通过ULN2003A来驱动直流电机


通过示波器测得板子上DC-的输出波形如下图

可见直接用示波器测得从2003输出的波形幅值只有0.7V,原因是


上图是ULN2003的内部逻辑图,可见,在输出没有外接负载时,电压被嵌位在0.7V。
3、连接直流电机图:


连接好上图后,按照理论上,通过控制PWM的占空比,就可以控制电机的转速,但是事与愿违,在占空比小时,电机有“嗡嗡”声,但是没有转动,一旦电机转动起来的话,就不受遥控器的控制了,检查发现,单片机不工作,用示波器测得DC-的输出波形也完全失真,不是PWM。去掉直流电机,单片机又恢复工作,DC-输出波形正常。

原因分析:
根据电路原理图


当电机工作时,由于我使用的电机的功率较大,一旦电机被驱动,就需要很大电流来维持电机转动,就会使电源VCC全部为电机所使用,以致于无法满足单片机的工作电流,单片机无法工作。

4、修改方法:使用外部5V电源给直流电机供电,外部电源和板子公地。这样问题解决。


用示波器测得DC-的波形图如下:

上图是占空比为20% 时波形(ULN2003是反向输出的);

上图是50%;

上图是60%;

上图是70%;
可见实现了遥控控制直流电机的功能。

菜鸟
2011-12-06 12:17:50     打赏
13楼

马上上传哈,呵呵,先把帖子整理好的


菜鸟
2011-12-06 13:30:09     打赏
14楼

电机下图播放视频(刚才上传到优酷网上总是审核失败,转到土豆网上了),
用手机拍摄的有点不清晰,下次改进


菜鸟
2011-12-06 15:24:21     打赏
15楼

红外遥控电机的程序部分模块如下:
关键是找出遥控器的键值,根据键值来控制PWM的占空比。
用逻辑分析仪采集到的红外接收块的脉冲图如下:


1、红外接收中断函数:  
void IR_IN() interrupt 0 using 0
{
       unsigned char j,k,N=0;
       EX0 = 0;  
      delay(15);
     if (IRIN == 1)
     {
             EX0 = 1;
             return;
    }
                                        //确认IR信号出现
    while (!IRIN)                //等IR变为高电平,跳过9ms的前导低电平信号。
   {
           delay(1);
   }
  for (j=0;j<4;j++)           //收集四组数据
  {
  for (k = 0;k<8;k++)      //每组数据有8位
  {
   while (IRIN)               //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
   {
    delay(1);
   }
   while (!IRIN)             //等 IR 变为高电平
   {
    delay(1);
   }
   while (IRIN)              //计算IR高电平时长
   {
    delay(1);
    N++;          
    if (N>=30)
    {
      EX0 = 1;
      return;
     }                               //0.14ms计数过长自动离开。
    }                                //高电平计数完毕               
   IRCOM[j]=IRCOM[j] >> 1;                              //数据最高位补“0”
   if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}      //数据最高位补“1”
   N=0;
  }        
 }              
 if (IRCOM[2]!=~IRCOM[3])
 {
  EX0=1;
  return;
 }
 beep();
 flag = 1;
 EX0 = 1;


2、 中断函数:
void timer0() interrupt 5 using 3
{
 TF2=0;
  ++timer_num;
  if(timer_num == 10)
  {
  timer_num = 0;
  PWM0 = 1;
  }
  else if(timer_num == num)
  {
  PWM0 = 0;
 } 
}

3、红外接收延时函数0.14ms:

void delay(unsigned char x)    //x*0.14MS
{
 uchar i;
 while(x--)
 {
  for (i = 0; i<13; i++){}
 }
}

4、红外数据接收延时函数 :
void delay1(int ms)
{
 uchar y;
 while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

5、PWM产生
void pwmstate(void)
{
 switch(IRCOM[2])
 {
  case 0x45: onoff = ~onoff; break;
  case 0x16: num = 0;  break;
  case 0x0C: num = 1;  break;
  case 0x18: num = 2;  break;
  case 0x5E: num = 3;  break;
  case 0x08: num = 4;  break;
  case 0x1C: num = 5;  break;
  case 0x5A: num = 6;  break;
  case 0x42: num = 7;  break;
  case 0x52: num = 8;  break;
  case 0x4A: num = 9;  break;   
  default:break;
 }
}


高工
2011-12-06 20:10:36     打赏
16楼
都动用了逻辑分析仪了,顶个

助工
2012-01-04 20:57:34     打赏
17楼
这不是小冯同学吗?这要顶一个

菜鸟
2012-01-28 15:23:22     打赏
18楼

共18条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]