设计与开发

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

小编 2024-11-24 设计与开发 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的黑色热塑套管,并且与红外接收头稍微隔开一点距离安装,防止发射出的红外光直接进入红外接收头。当然也不能离开太远,以免降低接收灵敏度。

51单片机红外遥控信号解码

简介

红外遥控作为一种遥控手段应用是非常广泛的,并且红外线遥控装置具有体积小、 功耗低、 功能强、 成本低这些特点,在录音机、空调、音响等小型电器大多是采用红外遥控的方式进行控制。这篇文章我就来详细讲解一下红外遥控信号的解码方法,对于红外信号的收发原理在这里只做简单了解。红外遥控系统要有发射端和接收端,发射端将信号经芯片调制后由红外发光二极管将信号以红外光的形式发送出去。接收端通过红外监测二极管接收到红外信号后再经过放大、滤波、解调等操作输出高低电平,这样就完成了红外信号的收发。本次教程我选择下图这种红外遥控器进行红外信号的发射

选择一体化红外接收头作为红外信号的接收端,这是一种特殊的红外接收电路,它把红外接收管和放大电路集成到了一块,从外形上看只有一个三极管大小,如图

一体化红外接收头共有三个引脚,将有凸起的一面对准自己后从左到右依次是信号输出、GND、VCC,它的工作电压为5V,可以选择一体化红外接收模块,我们在使用的时候只需要给它接上5V电源,接地,然后将信号输出脚连接到单片机就可以使用了。本篇文章我使用51单片机进行试验,51单片机用来解码红外信号是足够的并且易于理解,文章主要是讲解解码原理。

硬件连接

第一步是硬件连接,用到的硬件非常简单,只有一体化红外接收头和单片机最小系统。首先,我们给单片机最小系统和红外接收头接上电源,注意共地,然后将红外接收头的信号输出脚接到单片机的外部中断引脚上,这样就完成了硬件的连接。之所以将信号输出脚接到单片机的外部中断引脚是因为前面说过红外接收头在接收到红外信号后会输出高低电平,接在外部中断引脚后单片机可以在有信号的时候快速做出反应,后面的程序也是靠中断程序实现的。

NEC协议

前面讲过红外接收头在接收到红外信号后会输出高低电平,然后就可以通过我们的程序分析电平的变化来识别接收到的信号的内容。要将接收端的信号解码我们就要知道发送端的数据是如何编码的,在本文中用到的红外遥控器所使用的是NEC编码协议,所以我们首先要讲解一下NEC协议的相关信息。NEC协议是用于红外通信中的一种协议,通过NEC协议发送信息的格式如下图:

信息的开始是9ms高电平加4.5ms低电平的引导码,作用就是告诉设备通讯开始,有信号发送过来了。之后接的是8位地址码和8位地址反码,地址码的作用就是区分不同的接收器件,实现单独控制某个器件。最后是8位数据码和8位数据反码,数据码就是功能码,我们可以给不同数据码设定不同的功能,反码的作用就是检验接收到的数据是否正确。在上面的这条信息里,‘0’是用560us高电平加560us低电平表示的,‘1’是用560us高电平加1680us低电平表示。要注意的是上面的波形图是发射端的波形,我们红外接收端收到的信号的高低电平是与上图相反的,还要注意发射端在发射数据是是从最低位开始发射,所以我们接收到的信号也是从最低位开始的,另外当我们持续按住同一个按键时,发射端并不会重复发送地址码和数据码而是在发送完一次后每隔一段时间发送一次引导码(重复),间隔时间大约是108ms。下图为接收端引导码、引导码(重复)、‘0’、‘1’的波形:

在了解了这些关于NEC协议的信息后我们就可以开始写程序控制单片机来解码红外信号了。首先我来讲解一下解码程序的思路,之前我们将红外接收头的信号输出脚接在了单片机的外部中断引脚上,我们将外部中断的触发方式设置为跳变沿触发,当接收头接收到信号后就会输出一个低电平,低电平触发外部中断,我们在中断程序中启动定时器,这样当下一次低电平触发中断前,在这期间定时器所定的时间我们可以进行比较从而确定脉冲的宽度,确定数据为‘0’还是‘1’。接下来我根据具体代码进行介绍,

#include"reg52.h"#define uint unsigned int #define uchar unsigned charuchar IRtime; //储存检测红外高低电平持续时间uchar IRcord[4]; //储存解码后的4个字节数据uchar IRdata[33]; //包含起始码在内的33位数据bit IRpro_ok; //解码后4个数据接收完成标志位bit IRok; //33位数据接收完成标志位

在上面这段函数中我们添加上相应的头文件和一些宏定义,之后我们定义一些变量和数组作为一些标志位以及一些数据的保存,在每个定义后面都有注释来解释相应的作用,在这里就不再赘述。

void init(){ TMOD |= 0x02; //设置定时器0工作模式2 TL0 = TH0 = 0; //初始化定时器0寄存器 EA = 1; ET0 = 1; TR0 = 1; IT0 = 1; EX0 = 1; TMOD |= 0x20; //设置定时器1工作模式2 TL1 = TH1 = 0xfd; //比特率9600 SM1 = 1; //设置串口工作模式1,10位异步收发 TR1 = 1; //启动定时器1 }

然后我们定义一个初始化函数用于定时器和中断的初始化设置,我们将定时器0用于计算红外信号高低电平的时间,将定时器1用于串口发送数据。

void T0_ISR(void) interrupt 1 //定时器0中断一次277.76us{ IRtime++;}

上面这段是定时器0的程序,在里面只是用来计算时间,定时器0中断一次是277.76us,我们通过IRtime就可以计算出红外信号的持续时间。

void int0(void) interrupt 0{ static uchar i; //静态变量用于存入33次数据计数 static bit startflag; //开始存储脉宽标志位 if(startflag) { if((IRtime < 53) && (IRtime >= 32)) //判断是否为引导码 若为引导码则从起始码开始存 {i = 0;} IRdata[i] = IRtime; //以T0溢出的次数来计算脉宽把这个时间存放在数组中 IRtime = 0; //计数清零 i++; //计数脉宽存入次数自加 if(i == 30) { IRok = 1; //脉宽检查完成 i = 0; //把脉宽计数清零准备下次存入 } } else { IRtime = 0; //定时器0计数清零 startflag = 1; //开始处理标志位置1 }}

上面这段程序是外部中断的处理程序,当红外接收头接收到红外信号后会输出相应的高低电平变化,引导码和“1”、“0”的波形在前面的接收端波形图已经画出,这样当接收端为高电平的时候,就会触发外部中断,这是会查看IRtime的值,根据这个值来判断是否是9ms的引导码,如果是引导码则先将IRtime清零,然后将以后的脉冲时间都保存下来,如果不是则把IRtime清零,这样红外接收头接收到的33次脉冲的宽度就会保存到IRdata[]数组里。

void IRcordpro(){ uchar i; //用于计数处理4个字节 uchar j; //用于计数处理1个字节的8位数据 uchar k; //用于计数处理33次脉宽 k = 1; //从第一位开始处理 丢掉起始码 for(i = 0;i < 4;i++) { for(j = 0;j <8;j++) { if(IRdata[k] > 5) //如果脉宽大于数据0标准的1125us就判定为数据1 { IRcord[i] |= 0x80; //置于最高位 } if(j < 7) //从最高位移位置低位 { IRcord[i] >>= 1; } k++; //处理下一次脉宽 } } IRpro_ok = 1; //解码完成}

上面这个函数是用来处理我们之前保存的33次脉冲宽度,并且转化为4字节的数据保存在IRcord[]数组里,具体的操作就是根据脉冲的时间来判断是“1”还是“0”,大家可以根据程序后面的注释来理解函数的内容。

void main(){ uchar i; //计数串口发送字节数 init(); //初始化 while(1) { if(IRok) //判断33次脉宽是否提取完成 { IRcordpro(); //根据脉宽解码出4字节数据 IRok = 0; //清零脉宽检查完成标志位等待下一次脉宽检查 if(IRpro_ok) //判断解码是否完成 { for(i = 0;i < 4;i++) { SBUF = IRcord[i]; while(!TI); TI = 0; } IRpro_ok = 0; //清零解码标志位 } } }}

最后我们在主函数部分调用之前的函数,并且在等待解码完成后将解码出来的4字节数据通过串口发送到电脑。最后我们看一下实际的效果,首先打开串口助手,波特率设置为9600,接收设置为HEX模式,这样当按下红外遥控器的按键时,就会返回遥控器的键值了,

好了,本期教程到此就结束了,感谢各位的观看。

更多干货内容只需要你关注电子芯吧客微信公众号

相关问答

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

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

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

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

基于51 单片机 红外 接收 模块 的c编程?

这个是自己搭电路然后用红外接收管,利用外部中断计数器的管脚,才捕捉到的脉冲,在进行软件内部的解码解调,照这个思路就可以努力想,才能学会51单片机,而且5...

51 单片机 怎么样接 红外 传感器 模块 ?

51单片机可以通过接口电路来连接红外传感器模块。一般来说,红外传感器模块有三个引脚:VCC、GND和OUT。其中,VCC和GND分别连接到单片机的电源正负极,OUT则连接...

51 单片机红外 遥控最简单编程法?

红外遥控最简单的编程法是使用51单片机的定时器功能和外部中断功能来实现红外接收和解码。首先需要配置定时器和外部中断的相关寄存器,然后编写中断服务程序来...

单片机 红外 传感器怎么连接?

单片机与红外传感器的连接:连接单片机和红外传感器时,通常需要使用一个电阻器。将传感器的输出引脚连接到单片机的一个输入/输出引脚,并在该引脚和单片机的电...

单片机 如何能解码 红外 遥控器上的按键码?

单片机红外遥控器编码一般由引导码+地址码(16位)+命令码(16位)组成,在普通的遥控器上所有的按键只是命令码不同,地址码是不变的单片机红外遥控器编码一般由引...

如何把串口信号生成一个按键? 单片机 不知道该怎么把 红外 信号...

单片机不知道该怎么把红外信号转化成电脑按键。请大神细细道来,送分多谢笔记本电脑大神讨论回答(3)将我做的一个项目的相关程序段摘录出来,提供给你一个...

红外 线感应器控制LED灯,实现人在灯全功率,人走灯半功率?

红外感应模块作为传感器,需要其他控制的话可以用单片机,51最小系统就够了,很简单的。最好再加个光敏电阻,这样白天的话就可以控制灯不亮了。红外感应模块作为...

vs18388 红外 接收头和 单片机 之间采用什么协议进行通信?

红外接收头和单片机之间采用了红外传输协议进行通信,这样就也可以利用红外特性进行快速通讯红外接收头和单片机之间采用了红外传输协议进行通信,这样就也可以...

猜你喜欢