NV2+GW1N+STM32红外热成像数据显示
本帖最后由 littleshrimp 于 2022-1-10 12:20 编辑<p>为了让热成像的数据能在STM32上显示,上次计划使用GW1N将DS90C124的并行数据转成SPI串行数据<a href="https://bbs.eeworld.com.cn/thread-1190850-1-1.html" target="_blank">热成像数据采集的GW1N DS90C124到SPI的并串转换</a>,因为是使用飞线连接50MHz的时钟频率STM32那边没法正确读取,这个问题需要将FPGA芯片直接和STM32画在一个板子上才以解决。当然上次的程序在FIFO处理上也有些问题,没有对FIFO为空时的数据做处理,使得收到的数据会有大量重复,不过这不是功能不能实现的主因。</p>
<p>目前情况SPI的方式不行还有DCMI的方式可用,DCMI是STM32的摄像头接口,使用8bit并行数据。使用GW1N可以非常方便的将DS90C124的并行数据转换成对应的8bit摄像头数据。这里为了简化STM32部分的编程我直用GW1N把14bit的热像数据做了处理,使它直接输出8bit/pixel的数据,STM32可以直接显示灰度数据。为了能显示颜色我又在STM32上做了CLUT(颜色查找表)这样就可以为黑白数据增加相应色彩的调色板功能。</p>
<p></p>
<p> </p>
<p>FPGA部分的代码也比较简单,只需要对vsync和hsync做相应处理,然后再把14bit的数据做相应的剪裁即可,不过这里的offset是固定的,如果GW1N板子上有轻触按键就可以使用板子上的按键控制动态调节“亮度”。</p>
<pre>
<code class="language-cpp">module ds90c124(
input rst_n,
input rclk,
input wirerout,
output reg vsync,
output wire hsync,
output wire data
);
reg hsync_reg,hsync_reg1;
assign hsync = ~hsync_reg;
reg data_reg;
assign data = data_reg;
reg vsync_reg,vsync_reg1;
reg offset = 14'd3000;
reg temp = 14'd0;
regcnt = 9'd0;
//rout = 1时行起始
//rout = rout = 1时,1时为帧起始
//rout= rout = 1时,1时为数据无效/0时数据有效
reg data_valid,data_valid1,data_valid2;
regvsync_cnt;
always@(posedge rclk) begin
if(~rst_n) begin
vsync_cnt <= 1'b0;
end else begin
if(rout & rout)begin
vsync_cnt <= 1'b0;
end else if(vsync_cnt < 5)begin
vsync_cnt <= vsync_cnt + 1'b1;
end
end
end
always@(posedge rclk) begin
if(~rst_n) begin
vsync <= 1'b0;
end else begin
if(rout & rout)begin
vsync <= 1'b1;
end else if(vsync_cnt == 3)begin
vsync <= 1'b0;
end
end
end
always@(posedge rclk) begin
if(~rst_n) begin
data_valid <= 1'b0;
data_valid1 <= 1'b0;
end else begin
if(rout == 1'b1 && rout == 1'b0 && rout == 1'b0) begin
data_valid1 <= 1'b1;
end else if(rout == 1'b1 && (rout == 1'b1 || rout == 1'b1))begin
data_valid <= 1'b0;
data_valid1 <= 1'b0;
data_valid2 <= 1'b0;
end else begin
data_valid2 <= data_valid1;
data_valid <= data_valid2;
end
end
end
always@(posedge rclk) begin
if(~rst_n) begin
vsync_reg <= 1'b0;
vsync_reg1 <= 1'b0;
end else begin
if(rout == 1'b1 && rout == 1'b1) begin
vsync_reg1 <= 1'b1;
end else if (data_valid1 == 1'b1)begin
vsync_reg1 <= 1'b0;
vsync_reg <= 1'b0;
end
vsync_reg <= vsync_reg1;
end
end
always@(posedge rclk) begin
if(~rst_n) begin
data_reg <= 8'b0;
end else begin
if(rout > offset)begin
if(rout - offset > 8'd255)
data_reg <= 8'd255;
else
data_reg <= rout - offset;
end else begin
data_reg <= 8'b0;
end
end
end
always@(posedge rclk) begin
if(~rst_n) begin
cnt <= 9'b0;
end else begin
if(cnt == 324 || rout == 1'b1)begin
cnt <= 9'b0;
end else begin
cnt <= cnt + 1'b1;
end
end
end
always@(posedge rclk) begin
if(~rst_n) begin
hsync_reg <= 1'b0;
hsync_reg1 <= 1'b0;
end else begin
if(rout == 1'b1 && rout == 1'b0 && rout == 1'b0) begin
hsync_reg1 <= 1'b1;
end else if(cnt == 324)begin
hsync_reg <= 1'b0;
hsync_reg1 <= 1'b0;
end else begin
hsync_reg <= hsync_reg1;
end
end
end
endmodule</code></pre>
<p>TOP模块主要在前期调试时生成一些测试代码,调好后把测试代码删除基本就没什么内容了。</p>
<pre>
<code class="language-cpp">module top(
input rst_n,
input rclk,
input rout,
output pixck,
output vsync,
output hsync,
output data
);
ds90c124 ds90c124_ins(
.rst_n(rst_n),
.rclk(rclk),
.rout(rout),
.vsync(vsync),
.hsync(hsync),
.data(data)
);
assign pixck = rclk;
endmodule</code></pre>
<p>因为这个STM32H7的显示屏分辨率比较高(800x472),热成像是324*256没做放大处理看起来有点小。</p>
<p> </p>
<p>板子上还是使用了大量的飞线,因为速率比较低(5MHz)显示324*256 30fps数据没受影响。</p>
<p></p>
<p>STM32的DCMI使用的是30*0.5的FPC接口,我在网上买了一个FPC到2.54的转接板这样就可以将GW1N和STM32连接。</p>
<p></p>
<p>我这几天在外地没带示波器这类的工具过来,实际测试时遇到一个问花了很长时间才找到问题,原因是商家赠送了一个小锡珠正好夹在2条数据线中间,造成短路。</p>
<p></p>
<p> </p>
<p> 现在不确定GW1N的芯片在哪能买到,如果能买到芯片画个板玩起来就更方便了。</p>
<p></p>
<p> </p>
<p> </p>
<p>前面不久记得虾哥还在琢磨FPGA入门,现在虾哥FPGA已经开始搞事情了?哈哈,厉害厉害!</p>
freebsder 发表于 2022-1-10 14:55
前面不久记得虾哥还在琢磨FPGA入门,现在虾哥FPGA已经开始搞事情了?哈哈,厉害厉害!
<p>想玩点花样FPGA是躲不过去的坎,只可惜入门时不知道高云FPGA,要不可以省下很多时间。</p> littleshrimp 发表于 2022-1-10 15:18
想玩点花样FPGA是躲不过去的坎,只可惜入门时不知道高云FPGA,要不可以省下很多时间。
<p>复杂系统入门确实不如简化系统直接。这个就像一来就折腾Linux内核,往往不容易摸到门。</p>
<p>版主,你的热成像相机哪里买到的,我刚去闲鱼上搜索了一下宝马夜视摄像头,几十到几千的都有,淘宝上基本都是几千上万,这里面有什么玄机?</p>
bobde163 发表于 2022-5-25 13:49
版主,你的热成像相机哪里买到的,我刚去闲鱼上搜索了一下宝马夜视摄像头,几十到几千的都有,淘宝上基本都 ...
<p>正常情况下,某鱼的价格都要2千左右,也有1千多一些的。有时会碰到几百块那种损坏严重的。</p>
<p>我是一个完全小白,之前完全不懂这类电子设备,但花了些时间,虽然我大概明白了一些原理,但具体实操还是一头雾水,比如解密过程中stm32是如何发出命令给can,eevblog我是看不太懂他们说的。这个帖子里面的开发板实在是太大了,我想做成便携手持,我对您在b站发布的那块板子很感兴趣,可否能出售给我?即使是pcb空板都好。谢谢</p>
litego 发表于 2024-1-19 15:11
我是一个完全小白,之前完全不懂这类电子设备,但花了些时间,虽然我大概明白了一些原理,但具体实操还是一 ...
<p>在那个帖子的回帖里有说明 基本上就是获取随机数 用密钥生成加密签名后返回给相机</p>
littleshrimp 发表于 2024-1-20 12:47
在那个帖子的回帖里有说明 基本上就是获取随机数 用密钥生成加密签名后返回给相机
<p> 好的,谢谢回答,另外我目前有一些疑问:</p>
<p>1.我不敢确定我的nv2是不是正常的,目前没有解密的情况下接入12v,电流表显示111毫安,can之间没有看到什么波形,或许是我的示波器不好,lvds有一个0.4v左右的电平在做周期,万用表测出位1.2v左右,请问这是否是正常的?</p>
<p>2.esp32可以控制can来解密是吧?还是stm32或者树莓pico更容易实现?</p>
<p>3.下面是我根据你的照片预估要准备的配件</p>
<p>部件包括</p>
<p> 1.ttl转can</p>
<p> 2.usb转ttl调试器</p>
<p> 3..ds90c124自制解串板</p>
<p> 4.tang primer 20k(帖子里高云的开发板太大了)</p>
<p>以上部件应该可以将nv2输出图像吧?</p>
<p>不好意思打扰您,还是希望有偿能得到你b站展示的自制板,无元件空板都可以,一张板子搞定。</p>
<p>亲爱的版主,跪求手持nv3输出原理图,pm我啊</p>
litego 发表于 2024-7-16 13:43
亲爱的版主,跪求手持nv3输出原理图,pm我啊
<p>NV3需要用解码芯片读数据</p><br/> littleshrimp 发表于 2024-7-16 22:08
NV3需要用解码芯片读数据
<p>我了解的应该是通过max9260解串然后用fpga采集再输出,是这样子吧?但我不是这个行业的,我无法理解和设计这些电路和周边电路的设计,麻烦您指导下哈,能有原理图就最好啦。</p>
litego 发表于 2024-7-17 09:06
我了解的应该是通过max9260解串然后用fpga采集再输出,是这样子吧?但我不是这个行业的,我无法理解和设 ...
<p>电路方面不复杂 原理你可以读max9260的数据手册了解 然后是如何通过FPGA读取、解析和显示数据,这部分没有一定经验很难上手。</p><br/> littleshrimp 发表于 2024-7-17 16:55
电路方面不复杂 原理你可以读max9260的数据手册了解 然后是如何通过FPGA读取、解析和显示数据 ...
<p>是的,很难上手,我不是做这个行业的,仅仅是喜欢捣鼓热成像,所以要求助您,麻烦私信一下,拜托了</p>
页:
[1]