
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%;
可见实现了遥控控制直流电机的功能。

红外遥控电机的程序部分模块如下:
关键是找出遥控器的键值,根据键值来控制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;
}
}
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |