在名单里发现自己在前100之列,先开贴,等板子到了,会按时发帖,和大家相互交流,学习
fengzh169的进程贴(红外遥控器控制直流电机,有视频,第2页上)

今天来做板子的测试+流水灯实验。
第一步,上电:
做法:用9V电源供电,上电后把SW1接向外部电源供电
现象:蜂鸣器长鸣,LED1发光。
结论:系统电源工作正常。
现象的解释:这要从电路图上解释,如下图
上图可以看出,我选择的是9V电源供电,因此我J8不需要加短路块(如果是5V供电的话,要加短路块),然后把SW1和上面触点相连(若用USB供电的话,SW1应与下面触点连接),即满足VCC=5V,这时LED1就一直亮。这样LED1亮的现象解决。
蜂鸣器一直长鸣原因:
单片机上电复位后,P1口是输出高电平,使Q1导通,所以蜂鸣器长鸣。
以上是本人的个人见解,请各路大侠检阅。。。
流水灯实验现象图:
源程序如下:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
main()
{
uint8 LED;
LED = 0xFE;
P1 = LED;
while(1)
{
uint16 i;
for(i = 0;i < 40000;i++); //延时程序
LED = _crol_(LED,1); //P0口一次右移一位,轮流点亮LED灯
P1 = LED;
}
}
我录了视频不知道如何上传呀。

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年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
汽车+汽车电子电阻解释与分析被打赏5分 | |
STM32F103的I2C驱动OLED动态显示被打赏30分 | |
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 |