赞
踩
MLX90614 是一款红外非接触温度计。TO-39 金属封装里同 时集成了红外感应热电堆探测器芯片和信号处理专用集成芯 片。 由于集成了低噪声放大器、17 位模数转换器和强大的数字信 号处理单元,使得高精度和高分辨度的温度计得以实现。 温度计具备出厂校准化,有数字 PWM 和 SMBus(系统管理 总线)输出模式。 作为标准,配置为 10 位的 PWM 输出格式用于连续传送温 度范围为-20…120 ˚C 的物体温度,其分辨率为 0.14 ˚C。 POR 默认模式是 SMBus 输出格式。
单片机与mlx90614红外测温模块之间通信的方式是“类IIC”通信,意思就是通信方式跟IIC通信方式很像但又不是IIC,它有另外一个名字叫做SMBus。SMBus (System Management Bus)是 1995 年由 intel 公司提出的一种高效同步串行总线,SMBus 只有两根信号线:双向数据线和时钟信号线,容许 CPU 与各种外围接口器件以串行方式进行通信、交换信息,即可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus 接口的单片机上也可利用软件进行模拟。
MLX90614有MLX81101红外热电堆传感器和包括含有稳压电路、低噪声放大器、A/D转换器、DSP单元、脉宽调制电路及逻辑控制电路的MLX90302信号处理芯片构成。
其工作原理为:红外热电堆传感器输出的温度信号经过内部低噪声、低失调的运算放大器(OPA)放大后经过A/D转换器(ADC)转换为17位数字信号通过可编程FIR及IIR低通数字滤波器(即DSP)处理后输出,输出结果存储在其内部RAM存储单元中。
MLX90614中有两个存储器,分别为EEPROM和RAM。
MLX90614中共有32个字长为16位的EEPROM存储单元,其地址为000H—01FH。
EEPROM中所有的寄存器都是可以通过SMBus进行读取,但只有部分寄存器是可以进行改写的(地址为0x00, 0x01, 0x02, 0x03, 0x04, 0x05*,0x0E, 0x0F, 0x09)。可改写部分如左表所示。
Tomax和Tomin是设定的测量物体温度上、下限,Ta范围即环境温度范围。
其测量温度上限计算方法为:Tomax=100×(To MAX+273.15),通过计算将结果写入000H;温度下限计算方法与上限计算方法一样,将计算结果写入001H。
MLX90614中总共有32个17位的RAM存储单元,用户不能通过RAM来写入数据,只能读取RAM中的部分存储单元读取16位存储数据。其采集的环境温度数据保存在地址006H存储单元中,采集的被测物体温度数据存储在007H存储单元中。因此运用存储在RAM地址中的数据,通过公式的计算,可以得到环境温度Ta及被测物体温度数据To。
IIC主从机之间通讯步骤如下:
a:主机发送一个起始位通知从机就位。
b:主机发送从机地址和读写标志位(写标志位为0,读标志位为1)。标志位在最低位
c: 从机给主机回复响应(ACK)。
d: 如果是写模式,主机发送一字节数据等待从机响应,主机收到响应之后如果还有数据要发就继续发送第二段数据等待响应……直到发送完成
e:如果是读模式,此时主机STM32读取从机发来的数据,并给从机响应,如果从机还有数据要发送(接着汇报第二段),主机接着读取然后发送响应给从机…
f:主机给从机一个停止信号
上面这张图是方便下面读写的阅读和理解
首先发送一个起始位,然后主机发送从机地址0x00和写标志位0,一共是8位。发送完成后等待从机响应应答信号,然后发送读取地址的命令(0x07),继续等待应答信号,接收到后重复起始位,然后主机发送从机地址0x01和读标志位1,继续等待应答信号,接收到后获取接受低位和接收高位(这里是主机向从机发送应答信号),在接受出错数据包(PEC),主机发送应答信号,最后主机再发送一个停止信号即可。
首先发送一个起始位,然后主机发送从机地址0x00和写标志位0,一共是8位。发送完成后等待从机响应应答信号,然后发送读取地址的命令(0x07),继续等待应答信号,收到后获取接受低位和接收高位(这里是从机向主机发送应答信号),在接受出错数据包(PEC),最后主机再发送一个停止信号即可。
a:起始信号--在SCL为高电平期间SDA发生下降沿跳变产生起始信号
b:应答信号--在SCL为高电平期间SDA保持低电平为应答信号
c:非应答信--在SCL为高电平期间SDA保持高电平为非应答信号
d:结束信号--在SCL为高电平期间SDA发生上升沿跳变产生停止信号
e:数据信--在数据传输期间,SCL 为高电平期间,如果 SDA 为高电平则代表二进制1,同理,SCL 为高电平期间,如果SDA 为低电平则代表二进制 0
- void SMBstart()//SMB发送开始标志
- {
- //开始由高到低的跳变
- SDA_H;
- delay_us(10);
- SCL_H;
- delay_us(10);
- SDA_L;
- delay_us(10);
- SCL_L;
- delay_us(10);
- }
- void SMBstop()//SMB发送停止标志
- {
- //由低到高的跳变
- SCL_L;
- delay_us(10);
- SDA_L;
- delay_us(10);
- SCL_H;
- delay_us(10);
- SDA_H;
- delay_us(10);
- }
- void SMBsend(u8 buf)//SMB发送一个字节
- {
- u8 i=0;
- for(i=0;i<8;i++)
- {
- SCL_L;
-
- if((buf&0x80)==1) //buf&1000 0000
- {SDA_H;}
- else
- {SDA_L;};
-
- buf<<=1;
- delay_us(10);
-
- SCL_H;
- delay_us(10);
- SCL_L;
- delay_us(10);
- }
- }
发送一个字节也就是8个bit位,我们循环8次,每次将最高位发送出去,之后再通过buf<<=1;左移一位把最高位移出去等待下一个最高位,循环8次,每次都发最高位,就可把一个字节发出去了。
4、接收一个字节
- u8 SMBread()//SMB接收一个字节
- {
- u8 buf = 0;
- u8 i;
- for(i=0;i<8;i++)
- {
- SCL_L;
- delay_us(10);
- SDA_H;
- delay_us(10);
- SCL_H;
- delay_us(10);
- buf<<=1;
- Iic90614_Mode(GPIO_Mode_IPU); //设置为上拉
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1){buf|=0x01;};
- Iic90614_Mode(GPIO_Mode_Out_OD); //设置为推挽
- delay_us(10);
- }
- delay_us(10);
- SCL_L;
- delay_us(10);
- SDA_L; //拉低接收数据
- delay_us(10);
- SCL_H;
- delay_us(10);
- SCL_L;
- return buf;
- }
从SMBus上接收一个字节也就是8位,我们也是用一个for循环将8各一次接受过来,if是为了判断我引脚是否是高电平(接收到了应答信号),是的话我们就将buf进行或位移(buf|=0x01),确保为1。
- short Temp_Get_Address(uint8_t address)//读取温度函数
- {
- u8 SMBdataL=0;
- u8 SMBdataH=0;
- short SMBdata=0;
-
- //摄氏温度计算公式(T*0.02)-273.15
- SMBstart();//开始起始标志(写)
- SMBsend(0x00);//从机地址
- SMBsend(address);//发送读取地址命令
-
- SMBstart();//重复起始标志(读)
- SMBsend(0x01);
- SMBdataL = SMBread();//接收高位
- SMBdataH = SMBread();//接收低位
- SMBread();
- SMBstop();
- delay_us(10);
- SMBdata=(SMBdataH*256)+SMBdataL;
- SMBdata=SMBdata*2;
- SMBdata=SMBdata-27315; //得到真实的温度值
- SMBdata/=10;
- return SMBdata;
- }
完全根据读器件来写,后面是温度的计算,获取摄氏度,然后其他程序调用这个接口。
- int main()
- {
- float temp;//温度获取存储变量
-
- temp = Temp_Get_Address(0x07);//0x07是被测物体温度获取地址
- printf("%float\n",temp/10);//获取温度信息并且打印出来(串口调试助手打印)
-
- }
以上就是我的理解,本人刚入行,有错误的地方欢迎大佬指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。