在名单里发现自己在前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;
}
}
回复
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【LP-MSPM0L1306】适配 RT-Thread Nano被打赏23分 |