找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9784|回复: 2
打印 上一主题 下一主题
收起左侧

MLX90614 GY-906红外测距单片机与ARDUINO源码和资料下载

[复制链接]
跳转到指定楼层
楼主
内含ARDUINO与51单片机CODE.
GY-906红外测距电路原理图如下:


MLX90614系列红外测温模块的原理及应用
南京航空航天大学  曾德志
摘要:  MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。本文以MLX90614AAA为例介绍其原理和应用。

1 引言
一般来说,测温方式可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响;而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,近年来在家庭自动化、汽车电子、航空和军事上得到越来越广泛的应用。

2  测温原理概述
物体红外辐射能量的大小和波长的分布与其表面温度关系密切。因此,通过对物体自身红外辐射的测量,能准确地确定其表面温度,红外测温就是利用这一原理测量温度的。红外测温器由光学系统、光电探测器、信号放大器和信号处理及输出等部分组成。光学系统汇聚其视场内的目标红外辐射能量,视场的大小由测温仪的光学零件及其位置确定。红外能量聚焦在光电探测器上并转变为相应的电信号。该信号经过放大器和信号处理电路,并按照仪器内的算法和目标发射率校正后转变为被测目标的温度值。 PWM 的全称是 Pulse Width Modulation(脉冲宽度调制)即通过调节脉冲的周期、宽度,以达到变压、变频的目的,数字式脉宽调制方式中,数字是控制信号,通过改变高低电平数的比值达到改变占空比的目的,PWM 控制电路在开关稳压电源、不间断电源(UPS)以及直流电机调速,交流电机变频调速等控制电路中有着广泛应用。
   SMBus (System Management Bus,)是 1995 年由intel 公司提出的一种高效同步串行总线,SMBus 只有两根信号线:双向数据线和时钟信号线,容许 CPU 与各种外围接口器件以串行方式进行通信、交换信息,即可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus 接口的单片机上也可利用软件进行模拟。
Melexis 公司生产的 MLX90614 系列测温模块是应用非常方便的红外测温装置,其所有的模块都在出厂前进行了校验,并且可以直接输出线性或准线性信号,具有很好的互换性,免去了复杂的校正过程。
     该模块以 81101 热电元件作为红外感应部分。输出是被测物体温度(TO)与传感器自身温度(Ta)共同作用的结果,理想情况下热电元件的输出电压为:

其中温度单位均为 Kelvin,A为元件的灵敏度常数。
目标温度和环境温度由 81101 内置的热电偶测定测量,从 81101 中输出的两路温度信号分别经内部 MLX90302 器件上高性能、低噪声的斩波稳态放大器放大再经一个 17-bit 的模数转换器(ADC)和强大的数字信号处理(DSP)单元后输出。  
该系列模块的温度解析度可达 0.01°C,体积小巧,被测目标和环境温度能通过单通道(由 MLX90302 内的状态机控制)输出,有两种输出方式:PWM 输出、可编程 SMBus 输出,适于多种应用环境,下面以 MLX90614 为例,重点介绍其特性和使用方法。

通过 SMBus 编程可以更改模块 EEPROM 内的预设值并按照应用要求进行配置,并可以读出 EEPROM 内的配置信息;还可以读出模块 RAM 内温度等数据。  
MLX90614有适用于 3伏和 5 伏电源操作的两种类型。由于3 伏型其小于 2 毫安的电流消耗,它非常适用于手提装置和电池动力装置。为此,传感器也具有一个节能“休眠”模式,此时电流消耗可低于 2 毫安。对于 12 伏汽车电池直接供电的情况,5 伏型包含的电子部件可与几个外部元件一起在较高电压下运行。
3 MLX90614简介
3.1 MLX90614 管脚


单片机源程序如下:
  1. #include"at89x52.h"
  2. #include"intrins.h"
  3. //************************************
  4. #define  uint  unsigned int
  5. #define  uchar unsigned char
  6. #define  Nack_counter  10
  7. //************** 端口定义**************
  8. //LCD 控制线接口
  9. uchar flag1;
  10. sbit  RS=P0^7;
  11. sbit  RW=P0^6;
  12. sbit  LCDE=P0^5;
  13. //mlx90614 端口定义
  14. sbit  SCL=P1^6;// 时钟线
  15. sbit  SDA=P1^7;// 数据线
  16. //************ 数据定义****************
  17. bdata uchar flag;//可位寻址数据
  18. sbit bit_out=flag^7;
  19. sbit bit_in=flag^0;
  20. uchar DataH,DataL,Pecreg;
  21. //************ 函数声明*****************************************
  22. void   start_bit();                 //MLX90614 发起始位子程序
  23. void   stop_bit();                 //MLX90614发结束位子程序
  24. uchar  rx_byte(void);              //MLX90614 接收字节子程序
  25. void   send_bit(void);             //MLX90614发送位子程序
  26. void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序
  27. void   receive_bit(void);           //MLX90614接收位子程序
  28. void   delay(uint N);              //延时程序
  29. uint   memread(void);             // 读温度数据
  30. void   init1602(void);        //LCD 初始化子程序
  31. void   chk_busy_flg(void);         //LCD 判断忙子程序
  32. void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序
  33. void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序
  34. void   display(uint Tem);           // 显示子程序
  35. //*************主函数*******************************************
  36. void main()
  37. {
  38. uint Tem;
  39. //函数部分
  40. SCL=1;SDA=1;_nop_();
  41. _nop_();_nop_();_nop_();
  42. SCL=0;
  43. delay(1000);
  44. SCL=1;
  45. init1602();
  46. while(1)
  47. {
  48.    Tem=memread();
  49.    display(Tem);
  50.    delay(20);
  51. }
  52. }
  53. //*********输入转换并显示*********
  54. void display(uint Tem)
  55. {
  56. uint T,a,b;
  57. T=Tem*2;
  58.   dis_cmd_wrt(0x01);//清屏
  59. if(T>=27315)
  60. {
  61.    T=T-27315;
  62.    a=T/100;
  63.    b=T-a*100;
  64. //---------------------------
  65.    if(a>=100)
  66.    {
  67.     dis_dat_wrt(0x30+a/100);
  68.     a=a%100;
  69.     dis_dat_wrt(0x30+a/10);
  70.     a=a%10;
  71.     dis_dat_wrt(0x30+a);
  72.    }
  73.    else if(a>=10)
  74.    {
  75.     dis_dat_wrt(0x30+a/10);
  76.     a=a%10;
  77.     dis_dat_wrt(0x30+a);
  78.    }
  79.    else
  80.    {
  81.     dis_dat_wrt(0x30+a);
  82.    }
  83.    dis_dat_wrt(0x2e);// 显示点
  84.    //---------------------------
  85.   if(b>=10)
  86.   {
  87.     dis_dat_wrt(0x30+b/10);
  88. //    b=b%10;
  89. //    dis_dat_wrt(0x30+b);
  90.   }
  91.   else
  92.   {
  93.     dis_dat_wrt(0x30);
  94. //    dis_dat_wrt(0x30+b);
  95.   }
  96. }
  97. //==========
  98. else
  99. {
  100.   T=27315-T;
  101.   a=T/100;
  102.     b=T-a*100;
  103.   dis_dat_wrt(0x2d);
  104. //--------------------------
  105.   if(a>=10)
  106.   {
  107.     dis_dat_wrt(0x30+a/10);
  108.     a=a%10;
  109.     dis_dat_wrt(0x30+a);
  110.   }
  111.   else
  112.   {
  113.     dis_dat_wrt(0x30+a);
  114.   }
  115.   dis_dat_wrt(0x2e);//显示点
  116. //--------------------------
  117.   if(b>=10)
  118.   {
  119.     dis_dat_wrt(0x30+b/10);
  120.     b=b%10;
  121.     dis_dat_wrt(0x30+b);
  122.   }
  123.   else
  124.   {
  125.     dis_dat_wrt(0x30);
  126.     dis_dat_wrt(0x30+b);
  127.   }
  128. }
  129. }

  130. //************************************
  131. void   start_bit(void)
  132. {
  133.    SDA=1;
  134.    _nop_();_nop_();_nop_();_nop_();_nop_();
  135.    SCL=1;
  136.    _nop_();_nop_();_nop_();_nop_();_nop_();
  137.    SDA=0;
  138.    _nop_();_nop_();_nop_();_nop_();_nop_();
  139.    SCL=0;
  140.    _nop_();_nop_();_nop_();_nop_();_nop_();

  141. }
  142. //------------------------------
  143. void   stop_bit(void)
  144. {

  145.    SCL=0;
  146.    _nop_();_nop_();_nop_();_nop_();_nop_();
  147.    SDA=0;
  148.    _nop_();_nop_();_nop_();_nop_();_nop_();
  149.    SCL=1;
  150.    _nop_();_nop_();_nop_();_nop_();_nop_();
  151.    SDA=1;
  152. }
  153. //--------- 发送一个字节---------
  154. void  tx_byte(uchar dat_byte)
  155. {
  156.    char i,n,dat;
  157.    n=Nack_counter;
  158. TX_again:
  159.    dat=dat_byte;
  160.    for(i=0;i<8;i++)
  161.    {
  162.      if(dat&0x80)
  163.       bit_out=1;
  164.      else
  165.       bit_out=0;
  166.      send_bit();
  167.      dat=dat<<1;
  168.    }
  169.    
  170.       receive_bit();
  171.    if(bit_in==1)
  172.    {
  173.     stop_bit();
  174.     if(n!=0)
  175.     {n--;goto Repeat;}
  176.     else
  177.      goto exit;
  178.    }
  179.    else
  180.     goto exit;
  181. Repeat:
  182.     start_bit();
  183.     goto TX_again;
  184. exit: ;
  185. }
  186. //-----------发送一个位---------
  187. void  send_bit(void)
  188. {
  189.   if(bit_out==0)
  190.   
  191.        SDA=0;
  192.   else
  193.      SDA=1;
  194.   _nop_();
  195.   SCL=1;
  196.   _nop_();_nop_();_nop_();_nop_();
  197.   _nop_();_nop_();_nop_();_nop_();
  198.   SCL=0;
  199.   _nop_();_nop_();_nop_();_nop_();
  200.   _nop_();_nop_();_nop_();_nop_();
  201. }
  202. //---------- 接收一个字节--------
  203. uchar rx_byte(void)
  204. {
  205.   uchar i,dat;
  206.   dat=0;
  207.   for(i=0;i<8;i++)
  208.   {
  209.     dat=dat<<1;
  210.     receive_bit();
  211.     if(bit_in==1)
  212.      dat=dat+1;
  213.   }
  214.   send_bit();
  215.   return dat;
  216. }

  217. //---------- 接收一个位----------
  218. void receive_bit(void)
  219. {
  220.   SDA=1;bit_in=1;
  221.   SCL=1;
  222.   _nop_();_nop_();_nop_();_nop_();
  223.   _nop_();_nop_();_nop_();_nop_();
  224.   bit_in=SDA;
  225.   _nop_();
  226.   SCL=0;
  227.   _nop_();_nop_();_nop_();_nop_();
  228.   _nop_();_nop_();_nop_();_nop_();
  229. }
  230. //------------ 延时--------------
  231. void   delay(uint N)
  232. {
  233.   uint i;
  234.   for(i=0;i<N;i++)
  235.   
  236.      _nop_();
  237. }
  238. //------------------------------
  239. uint memread(void)
  240. {
  241.   start_bit();
  242.   tx_byte(0xB4);  //Send SlaveAddress ==============================
  243.   //tx_byte(0x00);
  244.   tx_byte(0x07);  //Send Command
  245.   //------------
  246.   start_bit();
  247.   tx_byte(0x01);
  248.   bit_out=0;
  249.   DataL=rx_byte();
  250.   bit_out=0;
  251.   DataH=rx_byte();
  252.   bit_out=1;
  253.   Pecreg=rx_byte();
  254.   stop_bit();
  255.   return(DataH*256+DataL);
  256. }
  257. //******************LCD 显示子函数***********************
  258. void init1602(void)        // 初始化LCD
  259. {
  260.    dis_cmd_wrt(0x01);
  261.    dis_cmd_wrt(0x0c);
  262.    dis_cmd_wrt(0x06);
  263.    dis_cmd_wrt(0x38);
  264.    
  265.    }

  266. void chk_busy_flg(void) //LCD 忙标志判断
  267. {
  268.    flag1=0x80;
  269.   while(flag1&0x80)
  270. {
  271.    P2=0xff;
  272.    RS=0;
  273.    RW=1;
  274.    LCDE=1;
  275. ……………………

  276. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:

GY-906资料.rar (2.26 MB, 下载次数: 105)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:343923 发表于 2018-6-3 21:19 | 只看该作者
你好!我想问一下这个GY906 和单个MLX90614的区别在哪里?使用还是要加上拉电阻还是怎样呢?新人求解!
回复

使用道具 举报

板凳
ID:212262 发表于 2018-11-25 22:00 | 只看该作者
同楼上,想问GY906和MLX90614区别
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表