近期公司项目需要利用安路的FPGA读取NTC的阻值,转换成温度值,上传至上位机。NTC选用的K值为3950的10K NTC电阻。NTC电阻值与温度的关系有两种方式可以获得:一种是找到ntc的规格书,规格书上一般提供阻值温度对照表格;另一种方式是利用K值计算公式,计数出相对关系。两种方式各有优劣,基于FPGA的应用,我选择了查表的方式,先把阻值温度对照表存入FPGA的rom模块中,再通过读取adc值进行查表。
安路的rom模块需要读取mif文件,才能将数据存储在rom模块中,所以具体实现思路是先将规格书上的对照表截图,利用ai自动识别表格,生成可以编辑的文本,再将文本拷贝到excel中,根据实际电路参数,利用excel的函数功能,将不同阻值对应的adc值计算出来,然后将计算出的adc数据,导入matlab,编写matlab代码,生成mif文件即可。
下面记录整个流程,方便大家参考。
1 ai识别图片
现在ai功能强大,可以快速的识别图片上的文字,比起原来的ocr软件好用不少。刚开始我找到的对照表图片,分成了四张截图,全部丢给豆包识别,豆包很快就识别出来了。但是识别过程进行到一半,就停止了,不知到什么原因。
于是又找到了一份可以复制的阻值温度对照表。直接复制到了excel中。
2 excel数据转换
如下图,Temp和Rnor这两列是从网站上拷贝的数据。
image.png
欧姆列由Rnor列作为数据源,乘以1000,将千欧姆转换为欧姆单位。
adc列,则根据实际设计的电路,计算出NTC不同温度下,对应ADC应该读到的数值。
image.png
比如我的电路中NTC上拉到5V,下面串了一个1k欧姆电阻进行分压,将它们的中点电压送到adc芯片采样。则计算公式为=4096*1000/(C2+1000)。
最后一列则用公式=ROUND(D2,0)对数值进行取整。
3 matlab读取excel数据
在matlab的命令行,输入下面的指令,即可将excel中的数据存入num变量。
[num]=xlsread('c:\桌面\ntc.xlsx',3,'g2:g266')
其中‘3’指的是excel文件中的第三个页面,‘g2:g266'指从G列的第2行,选取到第266行。
4 编写matlab程序将数据按照mif格式保存
这部分代码参考了其他网页的内容,详情见链接:https://blog.csdn.net/xxqlover/article/details/139553157
我对他的代码进行了删减,最终代码如下:
function [result]=gen_mif(data_in,width,depth,path)
type = extractAfter(path,'.');
q = quantizer([width,0]);
hexStr = num2hex(q,data_in);
x = strings(depth,1);
for addr1 = 1:depth
x(addr1) = hexStr(addr1,:);
end
fid=fopen(path,'wt'); %打开或者新建文件,存放位置和文件名任意
fprintf(fid,'DEPTH=%d;\n',depth);
fprintf(fid,'WIDTH=%d;\n',width);
fprintf(fid,'ADDRESS_RADIX = HEX;\n');
fprintf(fid,'DATA_RADIX = HEX;\n');
fprintf(fid,'CONTENT BEGIN');
for addr2 = 1:depth-1
fprintf(fid,'\n %x:%s;',addr2-1,x(addr2));%开始写数据了
end
fprintf(fid,'\n %x:%s;',depth-1,x(depth));
fprintf(fid,'\n END;');
fclose(fid);
result = 1;
在matlab命令行,输入下面指令,即可生成mif文件:
gen_mif(num,16,265,'c:\桌面\igbt.mif')
num为excel导入的数据,’16‘为位宽,’265‘为深度。











网友评论