littleshrimp 发表于 2022-1-10 12:20

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>&nbsp;</p>

<p>FPGA部分的代码也比较简单,只需要对vsync和hsync做相应处理,然后再把14bit的数据做相应的剪裁即可,不过这里的offset是固定的,如果GW1N板子上有轻触按键就可以使用板子上的按键控制动态调节&ldquo;亮度&rdquo;。</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 &lt;= 1'b0;
      end else begin
            if(rout &amp; rout)begin
                vsync_cnt &lt;= 1'b0;
            end else if(vsync_cnt &lt; 5)begin
                vsync_cnt &lt;= vsync_cnt + 1'b1;
            end
      end
    end
    always@(posedge rclk) begin
      if(~rst_n) begin
            vsync &lt;= 1'b0;
      end else begin
            if(rout &amp; rout)begin
                vsync &lt;= 1'b1;
            end else if(vsync_cnt == 3)begin
                vsync &lt;= 1'b0;
            end
      end
    end

    always@(posedge rclk) begin
      if(~rst_n) begin
            data_valid &lt;= 1'b0;
            data_valid1 &lt;= 1'b0;
      end else begin
            if(rout == 1'b1 &amp;&amp; rout == 1'b0 &amp;&amp; rout == 1'b0) begin
                data_valid1 &lt;= 1'b1;
            end else if(rout == 1'b1 &amp;&amp; (rout == 1'b1 || rout == 1'b1))begin
                data_valid &lt;= 1'b0;
                data_valid1 &lt;= 1'b0;
                data_valid2 &lt;= 1'b0;
            end else begin            
                data_valid2 &lt;= data_valid1;
                data_valid &lt;= data_valid2;
            end
      end
    end

    always@(posedge rclk) begin
      if(~rst_n) begin
            vsync_reg &lt;= 1'b0;
            vsync_reg1 &lt;= 1'b0;
      end else begin
            if(rout == 1'b1 &amp;&amp; rout == 1'b1) begin
                vsync_reg1 &lt;= 1'b1;
            end else if (data_valid1 == 1'b1)begin
                vsync_reg1 &lt;= 1'b0;
                vsync_reg &lt;= 1'b0;
            end
            vsync_reg &lt;= vsync_reg1;
      end
    end

    always@(posedge rclk) begin
      if(~rst_n) begin
            data_reg &lt;= 8'b0;
      end else begin
            if(rout &gt; offset)begin
                if(rout - offset &gt; 8'd255)
                  data_reg &lt;= 8'd255;
                else
                  data_reg &lt;= rout - offset;
            end else begin
                data_reg &lt;= 8'b0;
            end
      end
    end

    always@(posedge rclk) begin
      if(~rst_n) begin
            cnt &lt;= 9'b0;
      end else begin
            if(cnt == 324 || rout == 1'b1)begin
                cnt &lt;= 9'b0;
            end else begin               
                cnt &lt;= cnt + 1'b1;
            end
      end
    end

    always@(posedge rclk) begin
      if(~rst_n) begin
            hsync_reg &lt;= 1'b0;
            hsync_reg1 &lt;= 1'b0;
      end else begin
            if(rout == 1'b1 &amp;&amp; rout == 1'b0 &amp;&amp; rout == 1'b0) begin
                hsync_reg1 &lt;= 1'b1;
            end else if(cnt == 324)begin
                hsync_reg &lt;= 1'b0;
                hsync_reg1 &lt;= 1'b0;
            end else begin            
                hsync_reg &lt;= 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> &nbsp;</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> &nbsp;</p>

<p>&nbsp;现在不确定GW1N的芯片在哪能买到,如果能买到芯片画个板玩起来就更方便了。</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

freebsder 发表于 2022-1-10 14:55

<p>前面不久记得虾哥还在琢磨FPGA入门,现在虾哥FPGA已经开始搞事情了?哈哈,厉害厉害!</p>

littleshrimp 发表于 2022-1-10 15:18

freebsder 发表于 2022-1-10 14:55
前面不久记得虾哥还在琢磨FPGA入门,现在虾哥FPGA已经开始搞事情了?哈哈,厉害厉害!

<p>想玩点花样FPGA是躲不过去的坎,只可惜入门时不知道高云FPGA,要不可以省下很多时间。</p>

freebsder 发表于 2022-1-10 15:27

littleshrimp 发表于 2022-1-10 15:18
想玩点花样FPGA是躲不过去的坎,只可惜入门时不知道高云FPGA,要不可以省下很多时间。

<p>复杂系统入门确实不如简化系统直接。这个就像一来就折腾Linux内核,往往不容易摸到门。</p>

bobde163 发表于 2022-5-25 13:49

<p>版主,你的热成像相机哪里买到的,我刚去闲鱼上搜索了一下宝马夜视摄像头,几十到几千的都有,淘宝上基本都是几千上万,这里面有什么玄机?</p>

littleshrimp 发表于 2022-5-25 13:59

bobde163 发表于 2022-5-25 13:49
版主,你的热成像相机哪里买到的,我刚去闲鱼上搜索了一下宝马夜视摄像头,几十到几千的都有,淘宝上基本都 ...

<p>正常情况下,某鱼的价格都要2千左右,也有1千多一些的。有时会碰到几百块那种损坏严重的。</p>

litego 发表于 2024-1-19 15:11

<p>我是一个完全小白,之前完全不懂这类电子设备,但花了些时间,虽然我大概明白了一些原理,但具体实操还是一头雾水,比如解密过程中stm32是如何发出命令给can,eevblog我是看不太懂他们说的。这个帖子里面的开发板实在是太大了,我想做成便携手持,我对您在b站发布的那块板子很感兴趣,可否能出售给我?即使是pcb空板都好。谢谢</p>

littleshrimp 发表于 2024-1-20 12:47

litego 发表于 2024-1-19 15:11
我是一个完全小白,之前完全不懂这类电子设备,但花了些时间,虽然我大概明白了一些原理,但具体实操还是一 ...

<p>在那个帖子的回帖里有说明 基本上就是获取随机数 用密钥生成加密签名后返回给相机</p>

litego 发表于 2024-1-20 16:18

littleshrimp 发表于 2024-1-20 12:47
在那个帖子的回帖里有说明 基本上就是获取随机数 用密钥生成加密签名后返回给相机

<p>&nbsp; &nbsp;好的,谢谢回答,另外我目前有一些疑问:</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>&nbsp; &nbsp; 1.ttl转can</p>

<p>&nbsp; &nbsp; 2.usb转ttl调试器</p>

<p>&nbsp; &nbsp; 3..ds90c124自制解串板</p>

<p>&nbsp; &nbsp; 4.tang primer 20k(帖子里高云的开发板太大了)</p>

<p>以上部件应该可以将nv2输出图像吧?</p>

<p>不好意思打扰您,还是希望有偿能得到你b站展示的自制板,无元件空板都可以,一张板子搞定。</p>

litego 发表于 2024-7-16 13:43

<p>亲爱的版主,跪求手持nv3输出原理图,pm我啊</p>

littleshrimp 发表于 2024-7-16 22:08

litego 发表于 2024-7-16 13:43
亲爱的版主,跪求手持nv3输出原理图,pm我啊

<p>NV3需要用解码芯片读数据</p><br/>

litego 发表于 2024-7-17 09:06

littleshrimp 发表于 2024-7-16 22:08
NV3需要用解码芯片读数据

<p>我了解的应该是通过max9260解串然后用fpga采集再输出,是这样子吧?但我不是这个行业的,我无法理解和设计这些电路和周边电路的设计,麻烦您指导下哈,能有原理图就最好啦。</p>

littleshrimp 发表于 2024-7-17 16:55

litego 发表于 2024-7-17 09:06
我了解的应该是通过max9260解串然后用fpga采集再输出,是这样子吧?但我不是这个行业的,我无法理解和设 ...

<p>电路方面不复杂&nbsp;原理你可以读max9260的数据手册了解&nbsp;然后是如何通过FPGA读取、解析和显示数据,这部分没有一定经验很难上手。</p><br/>

litego 发表于 2024-7-17 19:07

littleshrimp 发表于 2024-7-17 16:55
电路方面不复杂&nbsp;原理你可以读max9260的数据手册了解&nbsp;然后是如何通过FPGA读取、解析和显示数据 ...

<p>是的,很难上手,我不是做这个行业的,仅仅是喜欢捣鼓热成像,所以要求助您,麻烦私信一下,拜托了</p>
页: [1]
查看完整版本: NV2+GW1N+STM32红外热成像数据显示