
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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏50分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 | |
【分享评测,赢取加热台】教你五分钟本地部署蒸馏版本的DeepSeekR1-7B被打赏12分 | |
【换取手持示波器】蓝牙音箱更换电池被打赏8分 | |
【换取手持示波器】鼠标更换微动开关被打赏10分 | |
【我要开发板】4.传感器移植被打赏50分 | |
【换取手持数字示波器】RISC-VGCC使用-fno-omit-frame-pointer编译选项实现栈回溯被打赏29分 | |
【分享评测,赢取加热台】+开关电源简述被打赏7分 |