产品选型

单片机红外线 单片机实例分享,反射式红外测速仪DIY

小编 2024-10-25 产品选型 23 0

单片机实例分享,反射式红外测速仪DIY

常用的测速方法

常用的测速传感器可输出脉冲信号,只要通过频率电压或电流转换就能与电压、电流输入型的指针表和数字表匹配。频率电流转换的方法有阻容积分法、电荷泵法和专用集成电路法,前两种方法在磁电转速仪中也有运用。专用集成电路大多数是阻容积分法、电荷泵法的综合。目前,常用的专用集成电路有LM331、AD654和VF32等,转换精度在0.1%以上;但在低频时,这种转换就无能为力。采用单片机或FPGA做F/D和D/A转换,转换精度在0.5%~0.05%,量程从0~2Hz到0~20kHz,频率低于10Hz时反映时间也会变长。

在显示精度、可靠性、成本和使用灵活性上有一定要求时,就可直接采用脉冲频率运算型测速仪。频率运算方法有定时计数法(测频法)、定数计时法(测周法)和同步计数计时法。测频法在测量上有±1的误差,低速时误差较大。测周法也有±1个时间单位的误差,在高速时,误差也很大。同步计数计时法综合了上述两种方法的优点,在整个测量范围都达到了很高的精度,万分之五以上精度的测量转速仪表基本都采用同步计数计时法。

反射式红外测速仪的设计

这里我们介绍一款实用的反射式红外测速仪的设计与制作。

反射式红外测速仪在测量物体运转速度时,首先向被测物体发射出红外线脉冲,利用被测物体表面的反射能力(可在被测物体表面粘贴白色的反射纸等),使红外接收器收到光脉冲信号,然后通过光电转换电路将光脉冲信号转变为电脉冲信号,电脉冲信号通过放大和处理后,输入到单片机的计数控制门,与内部的标准表秒脉冲信号相比较,经运算后,通过显示器将被测物体运动的旋转速度显示出来。

红外探头的测量距离根据实际需要,可设计成近距离和远距离两类。近距离的探头可采用小功率发光管和光敏受光管。如果是远距离的测量,探头就可采用中、大功率的发光二极管或者是合适的激光二极管。

1.系统设计方案

图26.1为反射式红外测速仪的系统构成方框图,由单片机控制器、38kHz载频振荡器、红外线发射/接收电路、8×2点阵字符型液晶屏及工作电源等组成。

图26.1 反射式红外测速仪的系统构成方框图

2.转速测试原理

转速测试原理见图26.2。进入测试状态后,38kHz的载频振荡器起振工作,驱动红外发射管向外发射红外载频信号。单片机首先检测信号的边沿,当一个脉冲的下降沿到来时(图中A点),计数器开始对脉冲计数,同时,单片机还启动定时器进行测试计时。当定时器计时到1000ms时(图中B点),单片机发出一个准备结束本次测试的信号,这时程序又开始检测信号的下降沿,当下降沿到来时(图中C点),单片机对脉冲的计数cnt及对测试时间的计时time完成。此时根据公式:转速=(cnt/time)×60000即可算出此时的转速。当计时到1300ms时(图中D点),单片机输出显示,将测得的转速显示到液晶屏上。此次测试、显示完成后,又进入下一次的测试、显示,周而复始。

图26.2 转速测试原理

测速仪常用于电机、电扇、纸张、塑料、化纤、洗衣机、汽车、飞机、轮船等制造业中。依据对转速检测原理的不同,测速仪可分为以下几种类型。

离心式测速仪:利用离心力与拉力的平衡来检测转速,是最传统的机械式测速工具,测量精度一般在1~2级。

磁性测速仪:利用旋转磁场,在金属罩帽上产生旋转力,通过旋转力与游丝力的平衡来检测转速。

电动式测速仪:电动式测速仪由小型交流发电机、电缆、电动机和磁性表头组成。磁性表头与小型交流电动机同轴连接在一起,小型交流发电机产生交流电,交流电通过电缆输送,并驱动小型交流电动机,小型交流电动机的转速与被测轴的转速一致,磁性表头指示的转速自然就是被测轴的转速。

闪光式测速仪:闪光式测速仪可发出频率可调的脉冲闪光,利用人眼视觉暂留的原理对转动物体进行测速。除了检测转速(往复速度)外,还可以观测循环往复运动物体的静像。

电子式测速仪:电子式测速仪是以现代电子技术及计算机技术为基础而设计的,一般有传感器和显示器,有的还有信号输出和控制。

3.电路设计

反射式红外测速仪的电路如图26.3所示。单片机选择Atmel公司的ATmega48,负责整个测试系统的运行。IC2及阻容元件组成了38kHz的载频振荡器,其载频经VT1放大后驱动红外发射管IR向外发射红外线。IC4为38kHz的一体化红外接收头,它负责红外线的接收、放大及解调,它将解调出的脉冲信号送入单片机进行计数处理。IC5为液晶显示模块,使用了8×2的点阵字符型液晶屏(带背光),形体较小,用于显示测试得到的转速。

图26.3 反射式红外测速仪电路图

整机供电使用9V积层单池,经稳压器IC5稳定为5V后,供单片机工作。笔者实际制作的发射、接收组件如图26.4所示,使用热熔胶固定。制作完成的样机上的液晶屏、电源开关及按键如图26.5所示,按键SB目前没有使用,作为备用,整机照片如图26.6所示。

图26.4 发射、接收组件

图26.5 液晶屏及控制按键

图26.6 反射式红外测速仪整机照片

主函数

void main(void)//主函数

{

uchar temp;//定义单字节无符号局部变量

float count,time,x;//定义浮点型局部变量

Delay_nms(400);//延时400ms,等待电源稳定

init_devices();//初始化单片机

InitLcd();//初始化液晶模块

display1();//液晶屏显示欢迎界面

Delay_nms(2000);//等待2s

display2();//液晶屏显示工作界面

DisFlag=1;//测速显示标志置1

while(1)//无限循环

{

WDR();//看门狗喂狗指令

if(DisFlag==1)//如果测速显示标志为1

{

time=(float)tx;//整数转成浮点数

count=(float)cx;

x=count/time;x=x*30000;//数学计算

DisVal=(uint)x;

/******将测得的4位转速值存放于显示缓冲区*******/

disx[3]=(DisVal/1000)%10;

disx[2]=(DisVal/100)%10;

disx[1]=(DisVal%100)/10;

disx[0]=DisVal%10;

/**********在液晶屏上显示转速值*********/

DisplayOneChar(4,1,disx[3]+0x30);

DisplayOneChar(5,1,disx[2]+0x30);

DisplayOneChar(6,1,disx[1]+0x30);

DisplayOneChar(7,1,disx[0]+0x30);

/**此次显示完成后,相关变量初始化,准备进入下一次的测试**/

DisFlag=0;WorkTime=0;

DisTime=0;

EndFlag=0;Start=0;cnt=0;

}

else//否则如果测速显示标志为0则进行脉冲取样

{

do{

temp=PIND&0x04;WDR();JS=1;//等待下降沿后下一次测试

if(Counter>1500)

{Counter=0;JS=0;DisFlag=1;cx=0;goto END;}

}while(temp==0x04);

BeginFlag=1;Start=1;GICR=0x40;

//重开INT0中断

END:;

}

}

}

4.软件设计

程序主要分为主控程序、液晶屏驱动程序和头文件三大部分,这样设计速度快、结构完善,并且也便于整个程序的装配。程序使用ICC7.14C集成开发环境编译。限于篇幅,这里仅介绍一下主函数,完整程序可以到QQ群下载。

调试与应用

本机唯一需要调整的是红外发射电路的38kHz载频,它关系到红外测速仪的使用灵敏度及可靠性。整机检查无误后通电,用一个10kΩ的多圈可调电位器代替R6,用示波器或频率计测R7电阻的任一端,细调电位器,使频率为38.000kHz,越准确越好。调好后,取下电位器,测出其阻值,用一个同阻值的固定电阻代替电位器,焊在R6位置。整机其他部分全是数字信号处理,因此只要器件良好,就无需调整了。

红外发射管需要套一个直径5mm的黑色热塑套管,并且与红外接收头稍微隔开一点距离安装,防止发射出的红外光直接进入红外接收头。当然也不能离开太远,以免降低接收灵敏度。

单片机实现遥控器-红外数据传输——红外编解码原理

一、红外通信原理

红外遥控有发送和接收两个组成部分。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038, 它接收红外信号频率为38kHz,周期约26μs) 接收红外信号,它同时对信号进行放大、检波、整形得到TTL 电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。如图1 所示:

红外发送部分由51单片机、键盘、红外发光二极管和7段数码管组成。键盘用于输入指令, 51单片机检测键盘上按键的状态,并对红外信号进行调制,发光二极管产生红外线,数码管用来显示发送的键值。图2红外发射电路

红外接收部分由51单片机、一体化红外接收头HS0038和7段数码管组成。51单片机检测HS0038,并对HS0038接收到的数据解码,通过数码管显示接收到的键值。图 3红外接收电路

二、编码、解码

(1) 二进制信号的调制

二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz 的间断脉冲串,相当于用二进制信号的编码乘以频率为38kHz 的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号如图4 二进制码的调制所示

(2) 红外接收需先进行解调,解调的过程是通过红外接收管进行接收的。其基本工作过程为:当接收到调制信号时,输出高电平,否则输出为低电平,是调制的逆过程(图5 解调)。HS0038是一体化集成的红外接收器件,直接就可以输出解调后的高低电平信号;红外接收器HS0038的应用电路(图6)。

(3)红外遥控发射芯片采用 PPM 编码方式,当发射器按键按下后 ,将发射一组 108ms 的编码脉冲。遥控编码脉冲由前导码、16位地址码(8 位地址码、 8 位地址码的反码)和16位操作码(8 位操作码、 8 位操作码的反码)组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个 9ms 的高电平 ( 起始码 ) 和一个 4. 5ms 的低电平 ( 结果码 ) 组成,作为接受数据的准备脉冲。以脉宽为 0. 56ms 、周期为 1. 12ms 的组合表示二进制的 “0” ;以脉宽为 1. 68ms 、周期为 2. 24ms 的组合表示二进制的 “1” 。

(4)单片机采用外部中断 INT0 管脚和红外接收头的信号线相连,中断方式为边沿触发方式。计算中断的间隔时间,来区分前导码、二进制的 “1” 、 “0” 码。并将 8 位操作码提取出来在数码管上显示。

红外接收头输出的原始遥控数据信号,正好和发射端倒向.也就是以前发射端原始信号是高电平,那接收头输出的就是低电平,反之.

软件原理:

开始时发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉

宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。

解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的高电平开始,不同的是低电平的宽度不同,“0”为0.56ms,“1”为1.685ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms 左右即可。根据红外编码的格式,程序应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

HS0038红外接收器,接收红外遥控器发射的信号,输出DATA口和单片机的外部中断0P3.2口相连。当有红外信号时,触发中断查询中断时间,并和红外起始码,“0”、“1”、终止码的时间进行比较。从而检测红外的操作码。

51可参考的程序

(1)发送程序

#include

static bit OP; //红外发射管的亮灭

static unsigned int count; //延时计数器

static unsigned int endcount; //终止延时计数

static unsigned int temp; //按键

static unsigned char flag; //红外发送标志

static unsigned char num;

sbit ir_in=P3^4;

char iraddr1; //十六位地址的第一个字节

char iraddr2; //十六位地址的第二个字节

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f

void SendIRdata(char p_irdata);

void delay(unsigned int);

void keyscan();

void main(void)

{

num=0;

P2=0x3f;

count = 0;

flag = 0;

OP = 0;

ir_in= 0;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许

TH0 = 0xFF;

TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次

TR0 = 1;//开始计数

iraddr1=3;//00000011

iraddr2=252;//11111100

do{keyscan();

}while(1);

}

void timeint(void) interrupt 1

{

TH0=0xFF;

TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次

count++;

if (flag==1)

{

OP=~OP;

}

else

{

OP = 0;

}

ir_in= OP;

}

void SendIRdata(char p_irdata)

{

int i;

char irdata=p_irdata;

//发送9ms的起始码

endcount=223;

flag=1;

count=0;

do{}while(count

endcount=117;

flag=0;

count=0;

do{}while(count

irdata=iraddr1;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0

{

endcount=41; //1为宽的高电平

}

else

{

endcount=15; //0为窄的高电平

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=iraddr2;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=p_irdata;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

irdata=~p_irdata;

for(i=0;i<8;i++)

{

endcount=10;

flag=1;

count=0;

do{}while(count

if(irdata-(irdata/2)*2)

{

endcount=41;

}

else

{

endcount=15;

}

flag=0;

count=0;

do{}while(count

irdata=irdata>>1;

}

endcount=10;

flag=1;

count=0;

do{}while(count

flag=0;

}

void delay(unsigned int z)

{

unsigned char x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

(2)接收程序

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar dis_num,num,num1,num2,num3;

sbit led=P1^0;

unsigned char code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f

sbit prem =P3^2; //定义遥控头的接收脚

uchar ram[4]={0,0,0,0};//存放接受到的4个数据 地址码16位+按键码8位+按键码取反的8位

void delaytime(uint time) //延迟90uS

{

uchar a,b;

for(a=time;a>0;a--)

{

for(b=40;b>0;b--);

}

}

void rem()interrupt 0 //中断函数

{

uchar ramc=0; //定义接收了4个字节的变量

uchar count=0; //定义现在接收第几位变量

uint i=0; //此处变量用来在下面配合连续监测9MS 内是否有高电平

prem=1;

for(i=0;i<1100;i++) //以下FOR语句执行时间为8MS左右

{

if(prem) //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平

return; //引导码错误则退出

}

while(prem!=1); //等待引导码的后半部 4.5 MS 高电平开始的到来。

delaytime(50); //延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中

//第一位数据的0.56MS开始脉冲

for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节

{ for(count=0;count<8;count++) //循环8次接收8位(一个字节)

{

while(prem!=1); //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时,

//保已经进入数据的0.56MS 低电平阶段

//等待本次接受数据的高电平的到来。

delaytime(9);//高电平到来后,数据0 高电平最多延续0.56MS,而数据1,高电平可

//延续1.66MS大于0.8MS 后我们可以再判断遥控接收脚的电平,

if(prem) //如果这时高电平仍然在继续那么接收到的数据是1的编码

{

ram[ramc]=(ram[ramc]<<1)+1;//将目前接收到的数据位1放到对应的字节中

delaytime(11); //如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入//下个位编码的低电平中(即是开始的0.56MS中)

}

else //否则目前接收到的是数据0的编码

ram[ramc]=ram[ramc]<<1; //将目前接收到的数据位0放到对应的字节中

} //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收

}

if(ram[2]!=(~(ram[3]&0x7f))) //本次接收码的判断

{

for(i=0;i<4;i++) //没有此对应关系则表明接收失败,清除接受到的数据

ram[i]=0;

return ;

}

dis_num=ram[2]; //将接收到的按键数据赋给显示变量

}

相关问答

热释电红外传感器 单片机 ?

你应该没搞清楚热释电红外传感器的原理吧!它的工作原理是通过将红外线的能量变化转化为电压信号的,这个的难点在你处理信号的电路上,你要采集热释电红外传感器...

51 单片机 和红外遥控是怎么连接的?

红外传感器和单片机之间的连接方法:1、红外传感器绝大部分都是通过测引脚电压换算成距离。所以一般红外都有三根引脚,VCC和GND肯定会接噻,然后信号线接到你开...

51 单片机 红外接收模块如何接收?

51单片机红外接收模块通过以下方法接收的。即红外遥控有发送和接收两个组成部分。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红...

单片机 ,硬件,红外遥控编码问题。38KHz是干嘛用的?

学习型遥控常用的载波频率为38kHz,这是由发射端编码芯片所使用的455kHz晶振来决定的。在信号传输的过程中,并不是将信号直接进行传输,而是将信号负载到一个固...

51 单片机 红外接收器叫什么?

51单片机红外接收器也bl晶振。因为通常红外遥控为了提高抗干扰性能和降低电源消耗,常使用载波的方式传送二进制编码常用的载波频率:38hz(这是由发射端使用的4...

英语翻译 单片机 技术作为自动控制技术的核心之一,被广泛应用...

[最佳回答]Asasingle-chipmicrocomputerautomaticcontroltechnologyinoneofthecore,arewidelyusedini...

VS1838B红外接收头 单片机 编码原理是什么?具...- 汇财吧专业问答

[回答]用普通IO口或外部中断口连接接收头的数据口,接收头接5v供电,单片机就可以根据通讯协议了做解码程序了,看你定籂翅饺俨祭愁熄传陇发送的是什么码,然...

红外遥控开关设计制作方法是什么?-设计本有问必答

线串联技术的遥控开关,可能不能控制15W以下LED灯和荧光灯,和灯具并联连接的电容参数,请用工厂配发的标准电容。连接电容时,请专业电工操作...1.红...

红外接收管为什么收不到我用 单片机 和发射管发出的红外?

有很多实际中遇到的问题,如果把问题提清楚,通常就离解决不远了。关于“红外接收管为什么收不到我用单片机和发射管发出的红外”:1.单片机和发射管确实发出...

DYP-ME003热释电红外传感器模块怎样接到51 单片机 的接口上,这个传感器在检测到有人时会输出3.3V的电平?

通过一个反相器(用个NPN型三极管就可以了)接到51单片机某个IO口就可以了,写程序时临近这个IO口的电平,当读到低电平表示有人。通过一个反相器(用个NPN型三极...

猜你喜欢