感觉好奇怪,能够红外控制LED灯却控制不了电机~~~~(>_<)~~~~
时间:10-02
整理:3721RD
点击:
控制电机三种工作状态:全速,减速,停(电机是单片机Moto引脚低电平的时候转动)
但是我开启单片机后 全速的控制是可以的,
但是接着按 减速和停的按钮就不管用了,
只能重新打开单片机,按减速按钮,电机能减速转动,但是很奇怪,电机低速转了一会又自动进入全速状态接着自动停止(我并没有控制它)
但是我控制2个LED却很正常。
原理图如下
PS:我用延时而不用红外控制时电机的全速和低速都能成功实现。
新发现:红外遥控启动电机后LED灯也无法控制了,没反应。
问题总结:
1.一旦红外遥控启动电机后,红外遥控就失效了;
2.红外遥控低速启动自动回到全速并且停止的问题
程序代码如下
- /*测试电机能否由红外线控制*/
- #include<reg52.h>
- sbit IRIN=P3^2;
- sbit Moto=P2^1;
- sbit LED1=P2^2; //
- sbit LED2=P2^3; //
- unsigned char IrValue[3];
- int Time;
- void DelayMs(unsigned int x);
- void Init_0();
- void Delay_100us();
- void LessSpeed();
- void Control();
- void main()
- {
- LED1=LED2=1;
- IrValue[2]=0x45;//默认停止
- Init_0();
-
- while(1)
- {
- Control();
- }
-
- }
- /****************************************************解码程序************************************************************/
- void ReadIr() interrupt 0
- {
- unsigned char j,k;
- unsigned int err;
- Time=0;
- DelayMs(70);
- if(IRIN==0) //确认是否真的接收到正确的信号
- {
-
- err=1000; //1000*10us=10ms,超过说明接收到错误的信号
- /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
- 侯,程序死在这里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
- {
- DelayMs(1);
- err--;
- }
- if(IRIN==1) //如果正确等到9ms低电平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
- {
- DelayMs(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4组数据
- {
- for(j=0;j<8;j++) //接收一组数据
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
- {
- DelayMs(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
- {
- DelayMs(1);//0.14ms
- Time++;
- err--;
- if(Time>30)
- {
- EX0=1;
- return;
- }
- }
- IrValue[k]>>=1; //k表示第几组数据
- if(Time>=8) //如果高电平出现大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完时间要重新赋值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- /***********************************************************************************************************/
- void DelayMs(unsigned int x) //0.14ms误差 0us
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++)
- {}
- }
- }
- void Init_0()
- {
- IT0=1;//外部中断0跳变沿触发方式(下降沿)
- EX0=1;//打开INT0的中断允许
- EA=1;//打开总中断
- }
- void Delay_100us()
- {
-
- unsigned char a,b,c;
- for(a=0;a<1;a++)
- for(b=0;b<1;b++)
- for(c=0;c<28;c++);
- }
- void LessSpeed()
- {
- while(IrValue[2]==0x15)
- {
- Moto=0;
- Delay_100us();
- Moto=1;
- Delay_100us();
- }
- }
- void Control()
- {
- if(IrValue[2]==0x44)
- Moto=0;
- else if(IrValue[2]==0x45)
- Moto=1;
- else if(IrValue[2]==0x15)
- LessSpeed();
- else if(IrValue[2]==0x0c)
- LED1=1,LED2=0;
- else if(IrValue[2]==0x5e)
- LED1=0,LED2=1;
- else if(IrValue[2]==0x18)
- LED1=LED2=0;
- }
为什么没人回复呢 反正我缺积分 帮你一把
你知道怎么解决吗?
是用红外线遥控的,就直接用遥控器控制嘛
求帮助呜呜~~~~~~~~~~~~~~~~~
是程序有问题还是硬件有问题。分开分析。
不是的,同样的距离能控制LED灯就是控制不了电机
你的减速的程序写在哪?指一下
- void LessSpeed()
- {
- while(IrValue[2]==0x15)
- {
- Moto=0;
- Delay_100us();
- Moto=1;
- Delay_100us();
- }
- }
觉得这样驱动有问题 你那驱动电机那个管容易挂换成其他的开关驱动管MOS管之类或者继电器 电机两端需要加一个104电容
请问管子容易挂是什么意思哦。我打算买个电机驱动再试试
你这是减速?
这不是转向吗?
电机是很容易产生电磁干扰的,建议你在电机两端并联一个104电容,而且最好用光耦隔离电机驱动,做好单片机的EMI防护。
是减速的。问题已经解决了,直接用买的驱动就能控制了。
谢谢指教。我直接换了个驱动就可以了
多谢指教。我直接用买的电机驱动就没问题了
最近我也在做红外遥控和电机的制作,不接电机红外接受特别灵敏,只要电机转动,红外就失控了
换了个买的电机驱动就可以控制了
谢谢指教。我直接换了个驱动就可以了
学习一下