完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
EEPROM数据读取和解析
上一篇我们简单介绍了热成像传感器德国海曼的HTPA 32x32d,本文主要进一步介绍内部EEPROM数据读取和解析。 存储结构一览 首先,很简单的IIC总线协议写好,调试好,就像读普通EEPROM一样,能够访问器件就行了,下面是传感器规划的EEPROM内部存储结构,也就是说表示了传感器用到的各种变量和校准值怎么在EEPROM内部存储的,哪些地址表示哪些数据,只有搞清楚了这点,后面的数据解析以及数据计算和校准才能进行,所以这一步是整个传感器驱动的重中之重。 从以上数据可以看到数据主要有发射率、运行寄存器的参考值,表号,全局偏移量,各个像素点的偏移量,以及坏点的标记等各种数据。 值得一提的是坏点和不良像素点的记录,手册里提到传感器在出厂时允许有3个以下的坏点存在,所以如果运气不好的话可能拿到的传感器是有坏点的,那么怎么看有没有坏点呢,就是NrOfDefPix这个变量,如果为0x00,那么恭喜您,您拿到的传感器没有坏点,紧跟在后面的区域就是存储坏点的地址以及他们的掩码,后面我们会介绍怎么进行坏点的处理。 数据样例 0x0000–> : E7 3C 13 4C 2A 09 78 4C 16 08 09 71 00 64 FF BF 0x0010–> : 2C 05 15 03 88 2C 05 15 03 88 2C 05 15 03 88 FF 0x0020–> : FD EF 0A FF FF FF 12 A1 B4 A0 11 8F 93 0B 6B 0C 0x0030–> : 41 49 03 03 EC 15 1B 3D 13 E5 E0 44 14 78 69 8E 0x0040–> : 00 00 FF FF FF FF 7A 0D 7A 0D E4 0C FF FF 0F 16 0x0050–> : 00 00 00 00 00 27 2F 41 03 49 03 FF FF FF 09 09 0x0060–> : 2C 05 15 03 88 8D 18 FF FF 8D 0B 63 0C AD 8E FF 0x0070–> : 17 7F 6B 02 5B 2D 12 00 09 74 77 88 8D E4 0C 00 因为篇幅原因,只贴出前面一部分的存储数据,以上数据对照着结构表,就可以大致看出个端倪了,举个例子:表号的数据是 0x71 0x00 , 那么交换字节序以后就是0x00 0x71 ,我们用工具试着转换一下 我们看到结果是113,就是对应厂家提供的table校准表中的113型表。 数据解析结果 我们直接来看看最终所有数据的解析结果 pixcmin:38597532.00000 pixcmax:65021096.00000 gradscale:22 tablenumber: 113 epsilon: 94 mbit_calib: 0x2C bias_calib: 0x05 clk_calib: 0x15 bpa_calib: 0x03 pu_calib: 0x88 arraytype: 10 vddth1: 41234 vddth2: 41140 ptatgr_float: 0.03786 ptatoff_float: 1799.15857 ptatth1: 30740 ptatth2: 36457 vddscgrad : 15 vddscoff:22 globaloff: 0 globalgain: 12071 mbit_user: 0x2C bias_user: 0x05 clk_user: 0x15 bpa_user: 0x03 pu_user: 0x88 bw: 62.00000 id: 1191259 nrofdefpix: 0 特别注意的是在定义变量类型要和EEPROM里的定义一致,尤其是有符号型还是无符号型的变量。 以下是数据转换的部分代码 I2C_EE_Read(EEPROM_ADDRESS, E_MBIT_CALIB , b , 5 ); /***************************************0x0010行/ mbit_calib = b[0]; bias_calib = b[1]; clk_calib = b[2]; bpa_calib = b[3]; pu_calib = b[4]; I2C_EE_Read(EEPROM_ADDRESS, E_ARRAYTYPE , b , 8 ); /***************************************0x0020行/ arraytype = b[0]; vddth1 = (uint16_t )((b[5] << 8)| (b[4]) ); //注意字节数和字节序 vddth2 = (uint16_t )((b[7] << 8)| (b[6]) ); //注意字节数和字节序 产生用于计算的二维数组和有用变量 EEPROM里面的数据读取出来以后有的用于设置传感器的运行参数,他们决定着传感器工作频率,ADC转换位数,IIC上拉电阻大小等等。有的参数用于进一步生成我们后续要使用的二维数组或者表。 比如计算每个像素的灵敏度系数:这个系数主要和pixcmin,pixmax,epsilon,globalgain变量有关。 他们之间的关系如下: for (int m = 0; m < 32; m++) { for (int n = 0; n < 32; n++) { pixcij_int32[m][n] = (int32_t)pixcmax - (int32_t)pixcmin; pixcij_int32[m][n] = pixcij_int32[m][n] / 65535; pixcij_int32[m][n] = pixcij_int32[m][n] * pij[m][n]; //pij[m][n]表示EEPROM内的原始数据 pixcij_int32[m][n] = pixcij_int32[m][n] + pixcmin; pixcij_int32[m][n] = pixcij_int32[m][n] * 1.0 * epsilon / 100; pixcij_int32[m][n] = pixcij_int32[m][n] * 1.0 * globalgain / 10000; } } 这些表产生以后就不会变了,所以只需要在开机后加载了EEPROM参数后计算一遍就行了,后面没必要在计算了,以节约我们采样的计算的时间。 结束 EEPROM内部的数据读取和解析就讲到这里,OK!老是用开发板也不方便,后面接着的文章我们继续讲怎么设计一个用于调试的PCB板。敬请期待! |
|
|
|
只有小组成员才能发言,加入小组>>
3308 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9049 浏览 16 评论
4083 浏览 18 评论
1167浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 09:58 , Processed in 1.135623 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号