<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>电子设计 &#8211; Antonio</title>
	<atom:link href="/category/mcu-signal-processing/feed/" rel="self" type="application/rss+xml" />
	<link>https://nstar.ltd</link>
	<description></description>
	<lastBuildDate>Sat, 04 Apr 2026 06:43:32 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>AI视觉机械臂_项目框架与流程</title>
		<link>/ai%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82_%e9%a1%b9%e7%9b%ae%e6%a1%86%e6%9e%b6%e4%b8%8e%e6%b5%81%e7%a8%8b/</link>
					<comments>/ai%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82_%e9%a1%b9%e7%9b%ae%e6%a1%86%e6%9e%b6%e4%b8%8e%e6%b5%81%e7%a8%8b/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 16:41:47 +0000</pubDate>
				<category><![CDATA[博客]]></category>
		<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">/?p=294</guid>

					<description><![CDATA[AI 视觉机械臂 — 项目框架与实施流程 本文档依据毕业论文《AI 视觉机械臂》，并结合本仓库中的 Maixc [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">AI 视觉机械臂 — 项目框架与实施流程</h1>



<p>本文档依据毕业论文《AI 视觉机械臂》，并结合本仓库中的 <strong>Maixcam</strong> 与 <strong>Project</strong> 代码工程整理，用于说明系统分层、主流程步骤及所需技术栈。</p>



<p><a href="https://github.com/pieceofApple/AI-vision-robotic-arm.git">https://github.com/pieceofApple/AI-vision-robotic-arm.git</a></p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="2560" height="1920" src="/wp-content/uploads/2026/04/机械臂实物图_标注-scaled.jpg" alt="" class="wp-image-298" srcset="/wp-content/uploads/2026/04/机械臂实物图_标注-scaled.jpg 2560w, /wp-content/uploads/2026/04/机械臂实物图_标注-300x225.jpg 300w, /wp-content/uploads/2026/04/机械臂实物图_标注-1024x768.jpg 1024w, /wp-content/uploads/2026/04/机械臂实物图_标注-768x576.jpg 768w, /wp-content/uploads/2026/04/机械臂实物图_标注-1536x1152.jpg 1536w, /wp-content/uploads/2026/04/机械臂实物图_标注-2048x1536.jpg 2048w" sizes="(max-width: 2560px) 100vw, 2560px" /></figure>



<p></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. 项目定位与目标</h2>



<ul class="wp-block-list">
<li><strong>定位</strong>：基于边缘计算的「视觉感知 + 机械臂执行」一体化平台，在成本可控前提下实现物体识别、目标定位与抓取类任务。</li>



<li><strong>论文方案</strong>：<strong>Maixcam</strong>（视觉与 AI 推理） + <strong>ESP32</strong>（运动控制与中继） + <strong>4 轴机械臂</strong>（5 路 PWM 舵机驱动），视觉与控制器之间采用 <strong>UDP</strong> 实时通信。</li>



<li><strong>核心链路</strong>：单目图像 → 目标检测 → 像素坐标到棋盘格世界坐标（透视变换）→ 将 ((x,y,z)) 等指令下发 ESP32 → <strong>逆运动学</strong> 解算关节角 → <strong>PWM</strong> 驱动舵机；辅以梯形速度规划、线性插值轨迹以平滑运动。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. 总体架构（三层）</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>层次</th><th>职责</th><th>论文对应</th><th>本仓库代码参考</th></tr></thead><tbody><tr><td><strong>感知层</strong></td><td>采集图像、畸变校正、棋盘格角点、YOLO 检测、世界坐标换算</td><td>第三章 3.2</td><td><code>Project/Maixcam/main.py</code>、<code>Maixcam/纸团-demo/main.py</code></td></tr><tr><td><strong>通信层</strong></td><td>Maixcam <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ESP32 的 UDP 文本指令（如坐标、<code>rst</code>、<code>stop</code> 等）</td><td>3.1.3</td><td><code>main.py</code> 中 <code>udp_communication</code>；ESP 端 <code>WiFiUDP</code></td></tr><tr><td><strong>执行层</strong></td><td>逆运动学、工作空间校验、轨迹/速度规划、5 路 PWM</td><td>3.3</td><td><code>Project/robot_arm_5PWM/robot_arm_5PWM.ino</code></td></tr></tbody></table></figure>



<p><strong>说明</strong>：论文中视觉侧强调将训练好的 <strong>YOLOv5s</strong> 转为 <strong>int8 / cvimodel</strong> 以适配 TPU；当前工程中的在线推理多采用 <strong>Maix 官方 <code>nn.YOLOv5</code> + <code>.mud</code> 模型</strong>（MaixHub 部署路径），原理一致，均为边缘侧 YOLO 推理。仓库 <code>Maixcam/模型文件/</code> 下另有 <strong>YOLO11 OBB</strong> 等 <code>.mud</code>，可用于旋转框等扩展场景，与论文正文以 v5s 为主略有差异，选型时以实际任务为准。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 硬件框架</h2>



<ul class="wp-block-list">
<li><strong>Maixcam</strong>：GC4653 摄像头、Wi‑Fi/蓝牙；算力侧含 NPU（论文中用于加速 YOLO）。</li>



<li><strong>ESP32</strong>：连接同一局域网，监听 UDP；运行逆运动学与 PWM 输出。</li>



<li><strong>机械臂</strong>：论文为 <strong>4 轴结构、5 路 PWM</strong>（多一路如夹爪）；臂长参数见论文表 4.1（如 P、A1～A4），与 <code>robot_arm_5PWM.ino</code> 中宏定义一致。</li>



<li><strong>标定场地</strong>：棋盘格（论文示例 6×8 格、中心为原点）；摄像头置于棋盘上方，视野覆盖工作区。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 软件模块与目录对应</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>模块</th><th>内容</th><th>路径提示</th></tr></thead><tbody><tr><td>端侧视觉主程序</td><td>采集、<code>lens_corr</code>、棋盘格、<code>getPerspectiveTransform</code>、YOLO 检测、逆透视得世界坐标、UDP</td><td><code>Project/Maixcam/main.py</code></td></tr><tr><td>应用描述</td><td>Maix 应用元数据</td><td><code>Project/Maixcam/app.yaml</code></td></tr><tr><td>纯检测 Demo</td><td>无标定与网络，便于验模</td><td><code>Maixcam/纸团-demo/main.py</code></td></tr><tr><td>PC 标定与可视化</td><td>OpenCV 标定、坐标映射等（论文 PC 端标定）</td><td><code>Project/Maixcam/PC_cv2/*.py</code>、<code>论文代码/相机标定.py</code></td></tr><tr><td>机械臂固件</td><td>WiFi、UDP、逆运动学、状态机、PWM</td><td><code>Project/robot_arm_5PWM/robot_arm_5PWM.ino</code></td></tr><tr><td>备份/试验</td><td>历史 UDP 测试等</td><td><code>Project/save_backup/</code></td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. 主流程步骤（建议实施顺序）</h2>



<h3 class="wp-block-heading">5.1 研发与标定阶段</h3>



<ol class="wp-block-list">
<li><strong>数据集与训练（PC）</strong>：按论文构建场景数据（如小纸团），用 <strong>YOLOv5s</strong> 训练；再按 <strong>Sophgo / Maix 工具链</strong> 导出为设备可用的 <strong>int8</strong>（论文）或按 Maix 流程导出 <strong><code>.mud</code></strong>（工程现状）。</li>



<li><strong>PC 相机标定（可选但推荐）</strong>：用棋盘格求内参与畸变，与端上 <code>lens_corr</code> 或粗略校正配合；参考 <code>PC_cv2/</code> 与论文 2.3、3.2.1。</li>



<li><strong>部署模型到 Maixcam</strong>：将模型放到设备约定路径（如 <code>main.py</code> 中的 <code>nn.YOLOv5(model=...)</code>）。</li>
</ol>



<h3 class="wp-block-heading">5.2 运行阶段（端侧闭环）</h3>



<ol class="wp-block-list">
<li><strong>初始化</strong>：摄像头分辨率与模型输入一致；启动 <strong>目标检测线程</strong> 与 <strong>UDP 线程</strong>（<code>threading</code>）。</li>



<li><strong>每帧视觉</strong>：
<ul class="wp-block-list">
<li>读图 → <code>lens_corr</code>；</li>



<li>转 OpenCV 灰度 → <code>findChessboardCorners</code> + <code>cornerSubPix</code>；</li>



<li>成功则计算世界四角与图像四角 → <strong>透视矩阵 M</strong>（异常时用上一帧 <code>last_M</code> 兜底）；</li>



<li><strong>YOLO 检测</strong> → 目标中心像素坐标 → <code>cv2.perspectiveTransform</code>（配合 (M^{-1})）得到 <strong>世界坐标 (cm 级)</strong>。</li>
</ul>
</li>



<li><strong>通信</strong>：ESP32 侧按协议发请求或接收指令；Maixcam 将 <code>x,y,z,flag</code> 或论文表 3.1 所列格式发往 ESP32（具体字符串以固件解析为准）。</li>



<li><strong>执行</strong>：ESP32 <strong>逆运动学</strong> → 关节角 → <strong>梯形规划 + 线性插值</strong> → <strong>PWM</strong>；完成抓取/放置/复位等状态切换。</li>
</ol>



<h3 class="wp-block-heading">5.3 联调与测试</h3>



<ul class="wp-block-list">
<li>论文第四章：检测准确率、坐标映射误差、实时性、重复定位、整机拾放等；环境为稳定 Wi‑Fi、统一光照与棋盘摆放。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6. 技术栈汇总</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>类别</th><th>技术</th></tr></thead><tbody><tr><td><strong>视觉 / AI</strong></td><td>Python 3（Maix 设备）、<strong>maix</strong>（camera、display、image、nn、app）、<strong>OpenCV（opencv-python）</strong>、<strong>NumPy</strong>；<strong>YOLOv5s</strong> 训练（PyTorch 生态，PC 端）；模型部署：<strong>TPU/NPU 量化 int8</strong>（论文）或 <strong>Maix <code>.mud</code></strong>（工程）</td></tr><tr><td><strong>几何与标定</strong></td><td>棋盘格角点、<strong>透视变换 / 单应性</strong>、亚像素角点；可选传统相机标定</td></tr><tr><td><strong>通信</strong></td><td><strong>UDP</strong>（<code>socket</code>）、<strong>Wi‑Fi</strong>；多线程 <strong><code>threading</code></strong>、<strong>queue</strong></td></tr><tr><td><strong>控制</strong></td><td><strong>ESP32</strong>、<strong>Arduino 框架</strong>、<strong>WiFi / WiFiUDP</strong>、<strong>math</strong>；<strong>逆运动学（几何法）</strong>、<strong>梯形速度规划</strong>、<strong>线性插值轨迹</strong>、<strong>PWM 舵机</strong></td></tr><tr><td><strong>工具</strong></td><td><strong>Arduino IDE</strong> + ESP32 板支持；PC 上 Python 标定脚本；可选 <strong>SolidWorks / 3D 打印</strong>（臂体，论文描述）</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7.小结</h2>



<p>本项目在论文层面是 <strong>「Maixcam 边缘视觉 + ESP32 实时控制 + 单目透视定位」</strong> 的完整闭环；在仓库层面，<strong><code>Project/Maixcam/main.py</code></strong> 与 <strong><code>Project/robot_arm_5PWM/robot_arm_5PWM.ino</code></strong> 分别对应感知通信与执行两大核心，<strong><code>Maixcam/纸团-demo</code></strong> 用于快速验证检测模型，<strong><code>PC_cv2</code></strong> 与 <strong><code>论文代码</code></strong> 支撑标定与坐标映射开发。实施时以论文第三章、第四章为理论依据，以当前工程中的 IP、端口、指令字符串和模型路径为运行配置依据。</p>



<h2 class="wp-block-heading">8.演示视频</h2>



<figure class="wp-block-video"><video controls src="https://chevereto.nstar.ltd/images/2025/04/19/5d01974067923df7cb7df9d88a5f40ae.mp4"></video></figure>
]]></content:encoded>
					
					<wfw:commentRss>/ai%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82_%e9%a1%b9%e7%9b%ae%e6%a1%86%e6%9e%b6%e4%b8%8e%e6%b5%81%e7%a8%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://chevereto.nstar.ltd/images/2025/04/19/5d01974067923df7cb7df9d88a5f40ae.mp4" length="260063561" type="video/mp4" />

			</item>
		<item>
		<title>FPGA——逻辑分析仪（纯verilog实现）</title>
		<link>/fpga-%e9%80%bb%e8%be%91%e5%88%86%e6%9e%90%e4%bb%aa%ef%bc%88%e7%ba%afverilog%e5%ae%9e%e7%8e%b0%ef%bc%89/</link>
					<comments>/fpga-%e9%80%bb%e8%be%91%e5%88%86%e6%9e%90%e4%bb%aa%ef%bc%88%e7%ba%afverilog%e5%ae%9e%e7%8e%b0%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 19:02:45 +0000</pubDate>
				<category><![CDATA[FPGA]]></category>
		<category><![CDATA[嵌入式笔记]]></category>
		<category><![CDATA[未分类]]></category>
		<category><![CDATA[电子设计]]></category>
		<category><![CDATA[逻辑分析仪]]></category>
		<guid isPermaLink="false">/?p=286</guid>

					<description><![CDATA[引言—— 闲来无事，兴起整个基于FPGA的逻辑分析仪吧，前段时间看到开源的100M采样率的pico逻辑分析仪挺 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>引言——<br>                 闲来无事，兴起整个基于FPGA的逻辑分析仪吧，前段时间看到开源的100M采样率的pico逻辑分析仪挺感兴趣的，但手中暂无pico，那就用手中的NANO 9K FPGA手搓一个。</p>



<p>该项目采用TANG NANO 9K（GW1NR-9）实现，最大采样率为27MHz，采样深度48K。（勉强能用，其实PLL倍频输出下也能达到GW1NR-9的工作频率上限125M）。</p>



<p>移植难度：<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" />             纯verilog</p>



<p>Gitlab代码地址：<a href="https://github.com/pieceofApple/GW1NR-9_Logicanalyzer">pieceofApple/GW1NR-9_Logicanalyzer: 该项目采用TANG NANO 9K（GW1NR-9）实现，最大采样率为27MHz，采样深度48K。</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E6%B3%A8%E6%84%8F%E7%BB%8F%E8%BF%87%E5%A4%9A%E6%AC%A1%E6%B5%8B%E8%AF%95%E5%A6%82%E9%80%9A%E8%BF%87fpga%E6%8E%A5%E6%94%B6rx%E5%86%8D%E8%BF%9E%E6%8E%A5%E8%87%B3rx-ext%E8%BE%93%E5%87%BA%E5%B0%86rx-ext%E8%BF%9E%E6%8E%A5%E8%87%B3%E9%87%87%E6%A0%B7%E9%80%9A%E9%81%93%E6%97%A0%E6%B3%95%E9%87%87%E6%A0%B7%E6%95%B0%E6%8D%AE%E4%BD%86%E5%A4%96%E9%83%A8%E4%B8%B2%E5%8F%A3%E7%9B%B4%E6%8E%A5%E6%8E%A5%E5%88%B0ch%E9%80%9A%E9%81%93%E5%8F%AF%E4%BB%A5%E6%AD%A3%E5%B8%B8%E9%87%87%E6%A0%B7%E6%95%85%E5%B0%BD%E9%87%8F%E9%81%BF%E5%85%8Dfpga%E5%86%85%E9%83%A8%E8%BE%93%E5%87%BA%E4%BF%A1%E5%8F%B7%E5%88%B0%E9%87%87%E6%A0%B7%E9%80%9A%E9%81%93%E9%87%87%E6%A0%B7">注意：经过多次测试，如通过FPGA接收RX再连接至RX-EXT输出，将RX-EXT连接至采样通道无法采样数据，但外部串口直接接到CH通道可以正常采样。故尽量避免FPGA内部输出信号到采样通道采样！</h2>



<h2 class="wp-block-heading" id="%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0">系统概述</h2>



<h3 class="wp-block-heading" id="%E7%A1%AC%E4%BB%B6%E8%A7%84%E6%A0%BC">硬件规格</h3>



<ul class="wp-block-list">
<li><strong>FPGA</strong>: TANG NANO 9K (GW1NR-LV9QN88PC6/I5)</li>



<li><strong>系统时钟</strong>: 27MHz</li>



<li><strong>采样通道</strong>: 8通道 (CH0-CH7)</li>



<li><strong>缓冲区大小</strong>: 48KB (49152字节)</li>



<li><strong>最大采样率</strong>: 27MHz</li>



<li><strong>通信接口</strong>: UART (115200波特率, 8N1)</li>



<li><strong>默认采样率</strong>: 100kHz</li>
</ul>



<h3 class="wp-block-heading" id="%E5%8A%9F%E8%83%BD%E7%89%B9%E6%80%A7">功能特性</h3>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8通道逻辑信号采样</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 可配置采样率（10kHz &#8211; 27MHz）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8种触发模式（立即、边沿、电平、模式、序列）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 预触发功能（捕获触发前的数据）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 可配置频率输出（用于测试信号生成）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 可配置占空比（0-100%）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 实时波形显示和分析</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 频率和占空比测量</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> PulseView支持（VCD/CSV导出）</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E7%A1%AC%E4%BB%B6%E5%BC%95%E8%84%9A%E9%85%8D%E7%BD%AE">硬件引脚配置</h2>



<h3 class="wp-block-heading" id="%E5%BC%95%E8%84%9A%E5%88%86%E9%85%8D%E8%A1%A8">引脚分配表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">功能</th><th class="has-text-align-left" data-align="left">引脚号</th><th class="has-text-align-left" data-align="left">方向</th><th class="has-text-align-left" data-align="left">电压</th><th class="has-text-align-left" data-align="left">说明</th></tr></thead><tbody><tr><td><strong>系统时钟</strong></td><td>52</td><td>输入</td><td>1.8V</td><td>27MHz系统时钟</td></tr><tr><td><strong>复位信号</strong></td><td>4</td><td>输入</td><td>1.8V</td><td>低电平复位</td></tr><tr><td><strong>UART TX</strong></td><td>17</td><td>输出</td><td>3.3V</td><td>板载Type-C UART发送</td></tr><tr><td><strong>UART RX</strong></td><td>18</td><td>输入</td><td>3.3V</td><td>板载Type-C UART接收</td></tr><tr><td><strong>UART TX_EXT</strong></td><td>33</td><td>输出</td><td>3.3V</td><td>外部UART发送（与TX同步）</td></tr><tr><td><strong>UART RX_EXT</strong></td><td>34</td><td>输出</td><td>3.3V</td><td>RX信号输出（与RX同步）</td></tr><tr><td><strong>CH0</strong></td><td>25</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道0</td></tr><tr><td><strong>CH1</strong></td><td>26</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道1</td></tr><tr><td><strong>CH2</strong></td><td>27</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道2</td></tr><tr><td><strong>CH3</strong></td><td>28</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道3</td></tr><tr><td><strong>CH4</strong></td><td>29</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道4</td></tr><tr><td><strong>CH5</strong></td><td>30</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道5</td></tr><tr><td><strong>CH6</strong></td><td>31</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道6</td></tr><tr><td><strong>CH7</strong></td><td>32</td><td>输入</td><td>3.3V</td><td>逻辑分析仪通道7</td></tr><tr><td><strong>频率输出</strong></td><td>84</td><td>输出</td><td>1.8V</td><td>可调频率输出</td></tr><tr><td><strong>LED状态</strong></td><td>10-13</td><td>输出</td><td>1.8V</td><td>状态指示LED</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="%E5%BC%95%E8%84%9A%E8%AF%B4%E6%98%8E">引脚说明</h3>



<h4 class="wp-block-heading" id="uart%E6%8E%A5%E5%8F%A3">UART接口</h4>



<ul class="wp-block-list">
<li><strong>引脚17 (uart_tx)</strong>: 板载Type-C UART发送，连接到PC</li>



<li><strong>引脚18 (uart_rx)</strong>: 板载Type-C UART接收，接收PC命令</li>



<li><strong>引脚33 (uart_tx_ext)</strong>: 外部UART发送，与引脚17同步输出相同数据</li>



<li><strong>引脚34 (uart_rx_ext)</strong>: RX信号输出，实时输出引脚18的信号（与RX同步）
<ul class="wp-block-list">
<li>可用于示波器测量</li>



<li>可连接到逻辑分析仪输入通道（如CH2）进行采样</li>



<li>支持外部串口设备直接连接进行数据采样</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading" id="%E9%80%BB%E8%BE%91%E5%88%86%E6%9E%90%E4%BB%AA%E8%BE%93%E5%85%A5">逻辑分析仪输入</h4>



<ul class="wp-block-list">
<li><strong>引脚25-32 (CH0-CH7)</strong>: 8个逻辑分析仪输入通道</li>



<li><strong>CH0-CH2 (引脚25-27)</strong>: 无内部上拉，适合采样外部信号（如RX_EXT输出）</li>



<li><strong>CH3-CH7 (引脚28-32)</strong>: 带内部上拉电阻（PULL_MODE=UP）</li>



<li>所有输入引脚配置为3.3V LVCMOS</li>



<li>支持0-3.3V逻辑电平输入</li>
</ul>



<h4 class="wp-block-heading" id="%E7%8A%B6%E6%80%81%E6%8C%87%E7%A4%BAled">状态指示LED</h4>



<ul class="wp-block-list">
<li><strong>LED0 (引脚10)</strong>: 状态指示位0</li>



<li><strong>LED1 (引脚11)</strong>: 状态指示位1</li>



<li><strong>LED2 (引脚13)</strong>: 状态指示位2</li>
</ul>



<p><strong>LED状态编码</strong>：</p>



<ul class="wp-block-list">
<li><code>000</code> (IDLE): 全灭</li>



<li><code>001</code> (CONFIG): LED0亮</li>



<li><code>010</code> (ARM): LED1亮</li>



<li><code>011</code> (SAMPLING): LED0+LED1亮</li>



<li><code>100</code> (READY): LED2亮</li>



<li><code>101</code> (TRANSMIT): LED0+LED2亮</li>



<li><code>110</code> (SET_FREQ): LED1+LED2亮</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="e58a9fe883bde789b9e680a7-1">功能特性</h2>



<h3 class="wp-block-heading" id="1-%E9%87%87%E6%A0%B7%E5%8A%9F%E8%83%BD">1. 采样功能</h3>



<ul class="wp-block-list">
<li><strong>8通道同步采样</strong>: 同时采样8个通道的逻辑信号</li>



<li><strong>可配置采样率</strong>: 10kHz &#8211; 27MHz（通过分频比配置）</li>



<li><strong>48KB缓冲区</strong>: 可存储49152个采样点</li>



<li><strong>自动传输</strong>: 采样完成后自动通过UART发送数据</li>
</ul>



<p><strong>通道配置说明</strong>:</p>



<ul class="wp-block-list">
<li><strong>CH0-CH2 (引脚25-27)</strong>: 无内部上拉电阻，适合采样外部信号源
<ul class="wp-block-list">
<li>推荐用于：外部串口信号（RX_EXT）、频率输出（freq_out）、其他外部数字信号</li>



<li>优点：无上拉电阻干扰，能准确采样外部信号电平</li>
</ul>
</li>



<li><strong>CH3-CH7 (引脚28-32)</strong>: 带内部上拉电阻（PULL_MODE=UP）
<ul class="wp-block-list">
<li>推荐用于：需要上拉的信号、按键输入、开漏输出等</li>



<li>优点：悬空时为高电平，适合需要上拉的场景</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading" id="2-%E8%A7%A6%E5%8F%91%E5%8A%9F%E8%83%BD">2. 触发功能</h3>



<p>支持8种触发模式：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">模式</th><th class="has-text-align-left" data-align="left">代码</th><th class="has-text-align-left" data-align="left">说明</th></tr></thead><tbody><tr><td><strong>立即触发</strong></td><td>0</td><td>无触发条件，立即开始采样</td></tr><tr><td><strong>上升沿触发</strong></td><td>1</td><td>检测到上升沿时触发</td></tr><tr><td><strong>下降沿触发</strong></td><td>2</td><td>检测到下降沿时触发</td></tr><tr><td><strong>双边沿触发</strong></td><td>3</td><td>检测到任意边沿时触发</td></tr><tr><td><strong>高电平触发</strong></td><td>4</td><td>检测到高电平时触发</td></tr><tr><td><strong>低电平触发</strong></td><td>5</td><td>检测到低电平时触发</td></tr><tr><td><strong>模式触发</strong></td><td>6</td><td>数据匹配指定模式时触发</td></tr><tr><td><strong>序列触发</strong></td><td>7</td><td>先匹配模式1，再匹配模式2时触发</td></tr></tbody></table></figure>



<p><strong>触发参数</strong>：</p>



<ul class="wp-block-list">
<li><strong>触发通道掩码</strong>: 选择哪些通道参与触发（8位，1=启用）</li>



<li><strong>触发模式1</strong>: 用于模式触发和序列触发的第一阶段</li>



<li><strong>触发模式2</strong>: 用于序列触发的第二阶段</li>



<li><strong>预触发采样</strong>: 在触发前采样指定数量的样本</li>
</ul>



<h3 class="wp-block-heading" id="3-%E9%A2%91%E7%8E%87%E8%BE%93%E5%87%BA%E5%8A%9F%E8%83%BD">3. 频率输出功能</h3>



<ul class="wp-block-list">
<li><strong>可配置频率</strong>: 1Hz &#8211; 10MHz（通过分频比配置）</li>



<li><strong>可配置占空比</strong>: 0-100%</li>



<li><strong>输出引脚</strong>: 引脚84 (freq_out)</li>
</ul>



<h3 class="wp-block-heading" id="4-%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD">4. 数据分析功能</h3>



<ul class="wp-block-list">
<li><strong>频率测量</strong>: 自动计算信号频率</li>



<li><strong>占空比测量</strong>: 自动计算信号占空比</li>



<li><strong>波形显示</strong>: 实时显示8通道波形</li>



<li><strong>数据导出</strong>: 支持VCD和CSV格式导出</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="uart%E5%91%BD%E4%BB%A4%E6%A0%BC%E5%BC%8F">UART命令格式</h2>



<h3 class="wp-block-heading" id="%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8">命令列表</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">命令</th><th class="has-text-align-left" data-align="left">代码</th><th class="has-text-align-left" data-align="left">数据长度</th><th class="has-text-align-left" data-align="left">说明</th></tr></thead><tbody><tr><td><strong>CMD_START</strong></td><td>0x01</td><td>0</td><td>开始采样</td></tr><tr><td><strong>CMD_STOP</strong></td><td>0x02</td><td>0</td><td>停止采样</td></tr><tr><td><strong>CMD_SET_FREQ</strong></td><td>0x06</td><td>4字节</td><td>设置频率输出（小端序）</td></tr><tr><td><strong>CMD_SET_SAMPLE_RATE</strong></td><td>0x07</td><td>4字节</td><td>设置采样率（小端序）</td></tr><tr><td><strong>CMD_SET_DUTY</strong></td><td>0x08</td><td>4字节</td><td>设置占空比（小端序）</td></tr><tr><td><strong>CMD_SET_TRIGGER</strong></td><td>0x09</td><td>6字节</td><td>设置触发配置</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="%E5%91%BD%E4%BB%A4%E8%AF%A6%E7%BB%86%E6%A0%BC%E5%BC%8F">命令详细格式</h3>



<h4 class="wp-block-heading" id="cmd_set_freq-0x06---%E8%AE%BE%E7%BD%AE%E9%A2%91%E7%8E%87%E8%BE%93%E5%87%BA">CMD_SET_FREQ (0x06) &#8211; 设置频率输出</h4>



<p><strong>数据格式</strong>: 4字节，小端序（Little-Endian）</p>



<pre class="wp-block-code"><code>&#91;字节0] 分频比低字节
&#91;字节1] 分频比次低字节
&#91;字节2] 分频比次高字节
&#91;字节3] 分频比高字节
</code></pre>



<p><strong>计算公式</strong>:</p>



<ul class="wp-block-list">
<li>分频比 = 27MHz / 目标频率</li>



<li>实际频率 = 27MHz / 分频比</li>
</ul>



<p><strong>示例</strong>: 设置10kHz频率</p>



<ul class="wp-block-list">
<li>分频比 = 27,000,000 / 10,000 = 2700</li>



<li>发送: <code>0x06 0xAC 0x0A 0x00 0x00</code> (2700 = 0x00000AAC)</li>
</ul>



<h4 class="wp-block-heading" id="cmd_set_sample_rate-0x07---%E8%AE%BE%E7%BD%AE%E9%87%87%E6%A0%B7%E7%8E%87">CMD_SET_SAMPLE_RATE (0x07) &#8211; 设置采样率</h4>



<p><strong>数据格式</strong>: 4字节，小端序</p>



<pre class="wp-block-code"><code>&#91;字节0] 分频比低字节
&#91;字节1] 分频比次低字节
&#91;字节2] 分频比次高字节
&#91;字节3] 分频比高字节
</code></pre>



<p><strong>计算公式</strong>:</p>



<ul class="wp-block-list">
<li>分频比 = 27MHz / 目标采样率</li>



<li>实际采样率 = 27MHz / 分频比</li>
</ul>



<p><strong>示例</strong>: 设置1MHz采样率</p>



<ul class="wp-block-list">
<li>分频比 = 27,000,000 / 1,000,000 = 27</li>



<li>发送: <code>0x07 0x1B 0x00 0x00 0x00</code> (27 = 0x0000001B)</li>
</ul>



<h4 class="wp-block-heading" id="cmd_set_duty-0x08---%E8%AE%BE%E7%BD%AE%E5%8D%A0%E7%A9%BA%E6%AF%94">CMD_SET_DUTY (0x08) &#8211; 设置占空比</h4>



<p><strong>数据格式</strong>: 4字节，小端序</p>



<pre class="wp-block-code"><code>&#91;字节0] 高电平周期数低字节
&#91;字节1] 高电平周期数次低字节
&#91;字节2] 高电平周期数次高字节
&#91;字节3] 高电平周期数高字节
</code></pre>



<p><strong>注意</strong>: 必须先设置频率，再设置占空比</p>



<h4 class="wp-block-heading" id="cmd_set_trigger-0x09---%E8%AE%BE%E7%BD%AE%E8%A7%A6%E5%8F%91%E9%85%8D%E7%BD%AE">CMD_SET_TRIGGER (0x09) &#8211; 设置触发配置</h4>



<p><strong>数据格式</strong>: 6字节</p>



<pre class="wp-block-code"><code>&#91;字节0] 触发类型 (0-7)
&#91;字节1] 触发通道掩码 (8位，1=启用该通道)
&#91;字节2] 触发模式1 (用于模式触发和序列触发)
&#91;字节3] 触发模式2 (用于序列触发的第二阶段)
&#91;字节4] 预触发数量低字节
&#91;字节5] 预触发数量高字节
</code></pre>



<p><strong>触发类型</strong>:</p>



<ul class="wp-block-list">
<li><code>0x00</code>: 立即触发</li>



<li><code>0x01</code>: 上升沿触发</li>



<li><code>0x02</code>: 下降沿触发</li>



<li><code>0x03</code>: 双边沿触发</li>



<li><code>0x04</code>: 高电平触发</li>



<li><code>0x05</code>: 低电平触发</li>



<li><code>0x06</code>: 模式触发</li>



<li><code>0x07</code>: 序列触发</li>
</ul>



<p><strong>示例</strong>: 设置上升沿触发（CH0），预触发1000个样本</p>



<ul class="wp-block-list">
<li>发送: <code>0x09 0x01 0x01 0x00 0x00 0xE8 0x03</code>
<ul class="wp-block-list">
<li><code>0x01</code>: 上升沿触发</li>



<li><code>0x01</code>: 仅CH0启用 (0x01 = 00000001)</li>



<li><code>0x00</code>: 触发模式1（不使用）</li>



<li><code>0x00</code>: 触发模式2（不使用）</li>



<li><code>0xE8 0x03</code>: 预触发1000 (0x03E8 = 1000)</li>
</ul>
</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B">快速开始</h2>



<h3 class="wp-block-heading" id="1-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87">1. 环境准备</h3>



<p><strong>硬件要求</strong>:</p>



<ul class="wp-block-list">
<li>TANG NANO 9K FPGA开发板</li>



<li>USB Type-C数据线</li>



<li>待测信号源（可选）</li>
</ul>



<p><strong>软件要求</strong>:</p>



<ul class="wp-block-list">
<li>Python 3.7+</li>



<li>串口驱动（通常自动安装）</li>



<li>matplotlib（用于波形显示）</li>



<li>PulseView（可选，用于高级分析）</li>
</ul>



<p><strong>安装Python依赖</strong>:</p>



<pre class="wp-block-code"><code>pip install pyserial matplotlib
</code></pre>



<h3 class="wp-block-heading" id="2-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8">2. 基本使用</h3>



<p><strong>最简单的使用方式</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11
</code></pre>



<p>这将：</p>



<ol class="wp-block-list">
<li>连接到FPGA（COM11）</li>



<li>使用默认采样率（100kHz）</li>



<li>立即开始采样</li>



<li>自动接收数据</li>



<li>显示波形和分析结果</li>
</ol>



<h3 class="wp-block-heading" id="3-%E5%A4%96%E9%83%A8%E4%B8%B2%E5%8F%A3%E4%BD%BF%E7%94%A8">3. 外部串口使用</h3>



<p><strong>使用外部串口设备进行采样</strong>:</p>



<p>本逻辑分析仪支持通过外部串口设备发送数据，并通过RX_EXT引脚输出，然后连接到逻辑分析仪输入通道进行采样。</p>



<p><strong>连接方式</strong>:</p>



<ol class="wp-block-list">
<li>将外部串口设备的TX连接到FPGA的RX（引脚18）</li>



<li>将FPGA的RX_EXT（引脚34）连接到逻辑分析仪输入通道（如CH2，引脚27）</li>



<li>外部串口设备发送的数据会被FPGA接收，同时通过RX_EXT输出</li>



<li>逻辑分析仪可以采样RX_EXT输出的信号</li>
</ol>



<p><strong>使用示例</strong>:</p>



<pre class="wp-block-code"><code><em># 设置采样率为1MHz，显示采样率为500kHz，占空比0.8，导出CSV</em>
python examples/read_data.py COM11 --sample-rate 1M --display-rate 500k --duty 0.8 --export-csv
</code></pre>



<p><strong>注意事项</strong>:</p>



<ul class="wp-block-list">
<li>确保外部串口设备的波特率与FPGA UART配置一致（115200 bps）</li>



<li>采样率应足够高，建议至少是信号频率的5-10倍</li>



<li>CH0-CH2通道无内部上拉，适合采样外部信号</li>
</ul>



<h3 class="wp-block-heading" id="4-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E7%A4%BA%E4%BE%8B">4. 常用命令示例</h3>



<p><strong>设置采样率为1MHz</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --sample-rate 1M
</code></pre>



<p><strong>上升沿触发（CH0）</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger rising --trigger-mask 0x01
</code></pre>



<p><strong>模式触发（匹配0x55）</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger pattern --trigger-pattern 0x55
</code></pre>



<p><strong>导出为VCD格式（PulseView）</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --export-vcd
</code></pre>



<p><strong>完整示例（采样率+触发+导出）</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --sample-rate 1M --trigger rising --trigger-mask 0x01 --pre-trigger 1000 --export-vcd
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E8%A7%A6%E5%8F%91%E5%8A%9F%E8%83%BD">触发功能</h2>



<h3 class="wp-block-heading" id="%E8%A7%A6%E5%8F%91%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3">触发模式详解</h3>



<h4 class="wp-block-heading" id="1-%E7%AB%8B%E5%8D%B3%E8%A7%A6%E5%8F%91-immediate">1. 立即触发 (immediate)</h4>



<p><strong>说明</strong>: 无触发条件，发送开始命令后立即开始采样</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>需要捕获所有数据</li>



<li>不需要等待特定条件</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger immediate
</code></pre>



<h4 class="wp-block-heading" id="2-%E4%B8%8A%E5%8D%87%E6%B2%BF%E8%A7%A6%E5%8F%91-rising">2. 上升沿触发 (rising)</h4>



<p><strong>说明</strong>: 检测到上升沿（0→1）时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获信号启动时的数据</li>



<li>分析上升沿后的信号变化</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code><em># CH0上升沿触发</em>
python examples/read_data.py COM11 --trigger rising --trigger-mask 0x01

<em># 所有通道上升沿触发</em>
python examples/read_data.py COM11 --trigger rising --trigger-mask 0xFF
</code></pre>



<h4 class="wp-block-heading" id="3-%E4%B8%8B%E9%99%8D%E6%B2%BF%E8%A7%A6%E5%8F%91-falling">3. 下降沿触发 (falling)</h4>



<p><strong>说明</strong>: 检测到下降沿（1→0）时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获信号停止时的数据</li>



<li>分析下降沿后的信号变化</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger falling --trigger-mask 0x01
</code></pre>



<h4 class="wp-block-heading" id="4-%E5%8F%8C%E8%BE%B9%E6%B2%BF%E8%A7%A6%E5%8F%91-both">4. 双边沿触发 (both)</h4>



<p><strong>说明</strong>: 检测到任意边沿（上升或下降）时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获信号变化时的数据</li>



<li>分析边沿前后的信号</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger both --trigger-mask 0x01
</code></pre>



<h4 class="wp-block-heading" id="5-%E9%AB%98%E7%94%B5%E5%B9%B3%E8%A7%A6%E5%8F%91-high">5. 高电平触发 (high)</h4>



<p><strong>说明</strong>: 检测到高电平时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获高电平期间的数据</li>



<li>分析高电平状态</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger high --trigger-mask 0x01
</code></pre>



<h4 class="wp-block-heading" id="6-%E4%BD%8E%E7%94%B5%E5%B9%B3%E8%A7%A6%E5%8F%91-low">6. 低电平触发 (low)</h4>



<p><strong>说明</strong>: 检测到低电平时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获低电平期间的数据</li>



<li>分析低电平状态</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --trigger low --trigger-mask 0x01
</code></pre>



<h4 class="wp-block-heading" id="7-%E6%A8%A1%E5%BC%8F%E8%A7%A6%E5%8F%91-pattern">7. 模式触发 (pattern)</h4>



<p><strong>说明</strong>: 数据匹配指定模式时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获特定数据模式</li>



<li>分析特定数据序列</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code><em># 匹配0x55模式（01010101）</em>
python examples/read_data.py COM11 --trigger pattern --trigger-pattern 0x55

<em># 仅CH0-CH3匹配0x05</em>
python examples/read_data.py COM11 --trigger pattern --trigger-mask 0x0F --trigger-pattern 0x05
</code></pre>



<h4 class="wp-block-heading" id="8-%E5%BA%8F%E5%88%97%E8%A7%A6%E5%8F%91-sequence">8. 序列触发 (sequence)</h4>



<p><strong>说明</strong>: 先匹配模式1，再匹配模式2时触发</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获特定数据序列</li>



<li>分析复杂的数据模式</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code><em># 先匹配0x55，再匹配0xAA</em>
python examples/read_data.py COM11 --trigger sequence --trigger-pattern 0x55 --trigger-pattern2 0xAA
</code></pre>



<h3 class="wp-block-heading" id="%E9%A2%84%E8%A7%A6%E5%8F%91%E5%8A%9F%E8%83%BD">预触发功能</h3>



<p><strong>说明</strong>: 在触发条件满足前，先采样指定数量的样本</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>捕获触发前的数据</li>



<li>分析触发前后的完整波形</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code><em># 上升沿触发，预触发1000个样本</em>
python examples/read_data.py COM11 --trigger rising --pre-trigger 1000
</code></pre>



<p><strong>工作原理</strong>:</p>



<ol class="wp-block-list">
<li>系统进入ARM状态，等待触发</li>



<li>持续采样数据到缓冲区（循环覆盖）</li>



<li>检测到触发条件时，继续采样预触发数量的样本</li>



<li>然后开始正常采样，直到缓冲区满</li>
</ol>



<p><strong>注意事项</strong>:</p>



<ul class="wp-block-list">
<li>预触发数量不能超过缓冲区大小（49152）</li>



<li>建议预触发数量 &lt; 10000，以确保有足够空间存储触发后的数据</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="pulseview%E6%94%AF%E6%8C%81">PulseView支持</h2>



<h3 class="wp-block-heading" id="%E4%BB%80%E4%B9%88%E6%98%AFpulseview">什么是PulseView？</h3>



<p>PulseView是一个开源的逻辑分析仪软件，支持多种硬件和文件格式。本逻辑分析仪支持导出VCD和CSV格式，可以在PulseView中打开和分析。</p>



<h3 class="wp-block-heading" id="%E5%AF%BC%E5%87%BA%E6%A0%BC%E5%BC%8F">导出格式</h3>



<h4 class="wp-block-heading" id="1-vcd%E6%A0%BC%E5%BC%8F-value-change-dump">1. VCD格式 (Value Change Dump)</h4>



<p><strong>特点</strong>:</p>



<ul class="wp-block-list">
<li>标准格式，广泛支持</li>



<li>包含时间信息</li>



<li>适合波形分析</li>
</ul>



<p><strong>导出方法</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --export-vcd
</code></pre>



<p><strong>输出文件</strong>:&nbsp;<code>logic_analyzer_data.vcd</code></p>



<h4 class="wp-block-heading" id="2-csv%E6%A0%BC%E5%BC%8F-comma-separated-values">2. CSV格式 (Comma-Separated Values)</h4>



<p><strong>特点</strong>:</p>



<ul class="wp-block-list">
<li>易于处理和分析</li>



<li>可以用Excel打开</li>



<li>适合数据分析</li>
</ul>



<p><strong>导出方法</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --export-csv
</code></pre>



<p><strong>输出文件</strong>:&nbsp;<code>logic_analyzer_data.csv</code></p>



<h3 class="wp-block-heading" id="%E5%9C%A8pulseview%E4%B8%AD%E6%89%93%E5%BC%80">在PulseView中打开</h3>



<h4 class="wp-block-heading" id="%E6%96%B9%E6%B3%951-%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80vcd%E6%96%87%E4%BB%B6">方法1: 直接打开VCD文件</h4>



<ol class="wp-block-list">
<li>启动PulseView</li>



<li>选择 <code>File</code> → <code>Open</code></li>



<li>选择 <code>logic_analyzer_data.vcd</code></li>



<li>波形将自动加载</li>
</ol>



<h4 class="wp-block-heading" id="%E6%96%B9%E6%B3%952-%E5%AF%BC%E5%85%A5csv%E6%96%87%E4%BB%B6">方法2: 导入CSV文件</h4>



<ol class="wp-block-list">
<li>启动PulseView</li>



<li>选择 <code>File</code> → <code>Import</code></li>



<li>选择 <code>CSV</code> 格式</li>



<li>选择 <code>logic_analyzer_data.csv</code></li>



<li>配置导入参数（采样率、通道数等）</li>
</ol>



<h3 class="wp-block-heading" id="pulseview%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD">PulseView高级功能</h3>



<h4 class="wp-block-heading" id="%E5%8D%8F%E8%AE%AE%E8%A7%A3%E7%A0%81">协议解码</h4>



<p>PulseView支持多种协议解码：</p>



<ul class="wp-block-list">
<li>UART</li>



<li>SPI</li>



<li>I2C</li>



<li>1-Wire</li>



<li>等等</li>
</ul>



<p><strong>使用方法</strong>:</p>



<ol class="wp-block-list">
<li>在PulseView中打开VCD文件</li>



<li>选择信号</li>



<li>右键 → <code>Add Decoder</code> → 选择协议</li>



<li>配置协议参数（波特率、数据位等）</li>
</ol>



<h4 class="wp-block-heading" id="%E6%B5%8B%E9%87%8F%E5%92%8C%E5%88%86%E6%9E%90">测量和分析</h4>



<ul class="wp-block-list">
<li><strong>时间测量</strong>: 测量信号周期、脉宽等</li>



<li><strong>频率分析</strong>: 分析信号频率</li>



<li><strong>统计信息</strong>: 统计高/低电平时间</li>



<li><strong>搜索功能</strong>: 搜索特定模式</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD">高级功能</h2>



<h3 class="wp-block-heading" id="1-%E9%A2%91%E7%8E%87%E8%BE%93%E5%87%BA%E9%85%8D%E7%BD%AE">1. 频率输出配置</h3>



<p><strong>设置频率输出</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --freq 10000
</code></pre>



<p><strong>设置频率和占空比</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --freq 10000 --duty 50
</code></pre>



<p><strong>频率范围</strong>: 1Hz &#8211; 10MHz</p>



<p><strong>占空比范围</strong>: 0-100%</p>



<h3 class="wp-block-heading" id="2-%E9%87%87%E6%A0%B7%E7%8E%87%E9%85%8D%E7%BD%AE">2. 采样率配置</h3>



<p><strong>预设采样率</strong>:</p>



<ul class="wp-block-list">
<li><code>27M</code>: 27MHz（最大）</li>



<li><code>13.5M</code>: 13.5MHz</li>



<li><code>9M</code>: 9MHz</li>



<li><code>6.75M</code>: 6.75MHz</li>



<li><code>5.4M</code>: 5.4MHz</li>



<li><code>1M</code>: 1MHz</li>



<li><code>500k</code>: 500kHz</li>



<li><code>100k</code>: 100kHz（默认）</li>



<li><code>50k</code>: 50kHz</li>



<li><code>10k</code>: 10kHz</li>



<li><code>1k</code>: 1kHz</li>
</ul>



<p><strong>使用示例</strong>:</p>



<pre class="wp-block-code"><code><em># 使用预设值</em>
python examples/read_data.py COM11 --sample-rate 1M

<em># 使用自定义值</em>
python examples/read_data.py COM11 --sample-rate 500000
</code></pre>



<h3 class="wp-block-heading" id="3-%E6%98%BE%E7%A4%BA%E9%87%87%E6%A0%B7%E7%8E%87">3. 显示采样率</h3>



<p><strong>说明</strong>: 用于计算和显示的采样率（不影响FPGA硬件采样率）</p>



<p><strong>使用场景</strong>:</p>



<ul class="wp-block-list">
<li>FPGA采样率与显示采样率不同时</li>



<li>需要调整显示时间轴时</li>
</ul>



<p><strong>示例</strong>:</p>



<pre class="wp-block-code"><code>python examples/read_data.py COM11 --sample-rate 1M --display-rate 500k
</code></pre>



<h3 class="wp-block-heading" id="4-%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%80%89%E9%A1%B9%E5%AE%8C%E6%95%B4%E5%88%97%E8%A1%A8">4. 命令行选项完整列表</h3>



<pre class="wp-block-code"><code>python examples/read_data.py &lt;COM端口&gt; &#91;选项]

选项:
  --no-plot        不显示波形图
  --save           保存原始数据到文件 (.bin)
  --export-vcd     导出为 VCD 格式（PulseView 支持）
  --export-csv     导出为 CSV 格式（PulseView 支持）
  --stop           手动停止采样（否则等待缓冲区满）
  --freq &lt;Hz&gt;      设置频率输出（在采样前）
  --duty &lt;值&gt;      设置占空比（在采样前，需要先设置频率）
  --sample-rate &lt;Hz&gt;   设置FPGA硬件采样率
  --display-rate &lt;Hz&gt;  指定显示用采样率（仅用于计算和显示）
  --trigger &lt;类型&gt;     设置触发类型
  --trigger-mask &lt;值&gt;  触发通道掩码（十六进制）
  --trigger-pattern &lt;值&gt;  触发模式1（十六进制）
  --trigger-pattern2 &lt;值&gt; 触发模式2（十六进制）
  --pre-trigger &lt;数量&gt;   预触发采样数量
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</h2>



<h3 class="wp-block-heading" id="q1-%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0fpga">Q1: 无法连接到FPGA</h3>



<p><strong>可能原因</strong>:</p>



<ol class="wp-block-list">
<li>串口号错误</li>



<li>串口被其他程序占用</li>



<li>USB驱动未安装</li>
</ol>



<p><strong>解决方法</strong>:</p>



<ol class="wp-block-list">
<li>检查设备管理器中的串口号</li>



<li>关闭其他可能占用串口的程序</li>



<li>重新安装USB驱动</li>
</ol>



<h3 class="wp-block-heading" id="q2-%E9%87%87%E6%A0%B7%E6%95%B0%E6%8D%AE%E4%B8%8D%E6%AD%A3%E7%A1%AE">Q2: 采样数据不正确</h3>



<p><strong>可能原因</strong>:</p>



<ol class="wp-block-list">
<li>采样率设置过低</li>



<li>信号频率过高</li>



<li>通道连接问题</li>



<li>通道上拉电阻影响（CH3-CH7有上拉，CH0-CH2无上拉）</li>
</ol>



<p><strong>解决方法</strong>:</p>



<ol class="wp-block-list">
<li>提高采样率（至少是信号频率的5-10倍）</li>



<li>检查信号连接</li>



<li>使用示波器验证信号</li>



<li>对于外部信号采样，建议使用CH0-CH2（无上拉电阻）</li>



<li>对于需要上拉的信号，使用CH3-CH7</li>
</ol>



<h3 class="wp-block-heading" id="q3-%E8%A7%A6%E5%8F%91%E5%8A%9F%E8%83%BD%E4%B8%8D%E5%B7%A5%E4%BD%9C">Q3: 触发功能不工作</h3>



<p><strong>可能原因</strong>:</p>



<ol class="wp-block-list">
<li>触发条件不满足</li>



<li>触发通道掩码设置错误</li>



<li>信号状态不符合触发条件</li>
</ol>



<p><strong>解决方法</strong>:</p>



<ol class="wp-block-list">
<li>检查信号状态是否满足触发条件</li>



<li>确认触发通道掩码正确</li>



<li>使用立即触发模式测试</li>
</ol>



<h3 class="wp-block-heading" id="q4-%E9%A2%91%E7%8E%87%E6%B5%8B%E9%87%8F%E4%B8%8D%E5%87%86%E7%A1%AE">Q4: 频率测量不准确</h3>



<p><strong>可能原因</strong>:</p>



<ol class="wp-block-list">
<li>采样率设置不正确</li>



<li>信号边沿不够清晰</li>



<li>信号频率过高</li>
</ol>



<p><strong>解决方法</strong>:</p>



<ol class="wp-block-list">
<li>确保采样率至少是信号频率的10倍</li>



<li>检查信号质量</li>



<li>使用更高的采样率</li>
</ol>



<h3 class="wp-block-heading" id="q5-pulseview%E6%97%A0%E6%B3%95%E6%89%93%E5%BC%80vcd%E6%96%87%E4%BB%B6">Q5: PulseView无法打开VCD文件</h3>



<p><strong>可能原因</strong>:</p>



<ol class="wp-block-list">
<li>文件格式错误</li>



<li>PulseView版本过旧</li>



<li>文件损坏</li>
</ol>



<p><strong>解决方法</strong>:</p>



<ol class="wp-block-list">
<li>重新导出VCD文件</li>



<li>更新PulseView到最新版本</li>



<li>检查文件是否完整</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E6%8A%80%E6%9C%AF%E8%A7%84%E6%A0%BC">技术规格</h2>



<h3 class="wp-block-heading" id="%E6%80%A7%E8%83%BD%E5%8F%82%E6%95%B0">性能参数</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">参数</th><th class="has-text-align-left" data-align="left">规格</th></tr></thead><tbody><tr><td><strong>最大采样率</strong></td><td>27MHz</td></tr><tr><td><strong>最小采样率</strong></td><td>~1kHz</td></tr><tr><td><strong>采样深度</strong></td><td>49152样本/通道</td></tr><tr><td><strong>通道数</strong></td><td>8通道</td></tr><tr><td><strong>输入电压范围</strong></td><td>0-3.3V</td></tr><tr><td><strong>输入逻辑电平</strong></td><td>LVCMOS 3.3V</td></tr><tr><td><strong>通信波特率</strong></td><td>115200 bps</td></tr><tr><td><strong>缓冲区大小</strong></td><td>48KB</td></tr></tbody></table></figure>



<h3 class="wp-block-heading" id="%E8%B5%84%E6%BA%90%E4%BD%BF%E7%94%A8">资源使用</h3>



<ul class="wp-block-list">
<li><strong>BRAM</strong>: ~48KB (用于数据缓冲区)</li>



<li><strong>LUT</strong>: 根据配置变化</li>



<li><strong>FF</strong>: 根据配置变化</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97">更新日志</h2>



<h3 class="wp-block-heading" id="v10-%E5%BD%93%E5%89%8D%E7%89%88%E6%9C%AC">v1.0 (当前版本)</h3>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8通道逻辑分析仪</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 可配置采样率（10kHz &#8211; 27MHz）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 8种触发模式</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 预触发功能</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 频率输出和占空比配置</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> PulseView支持（VCD/CSV导出）</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> RX/RX_EXT同步输出</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 外部串口数据采样支持</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CH0-CH2无上拉配置，适合外部信号采样</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 已验证外部串口数据采样功能正常</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E8%AE%B8%E5%8F%AF%E8%AF%81">许可证</h2>



<p>本项目采用开源许可证，详见LICENSE文件。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F">联系方式</h2>



<p>如有问题或建议，请提交Issue或Pull Request。</p>
]]></content:encoded>
					
					<wfw:commentRss>/fpga-%e9%80%bb%e8%be%91%e5%88%86%e6%9e%90%e4%bb%aa%ef%bc%88%e7%ba%afverilog%e5%ae%9e%e7%8e%b0%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>开新坑！&#124; 无刷电机&#124;FOC</title>
		<link>/%e5%bc%80%e6%96%b0%e5%9d%91%ef%bc%81-%e6%97%a0%e5%88%b7%e7%94%b5%e6%9c%bafoc/</link>
					<comments>/%e5%bc%80%e6%96%b0%e5%9d%91%ef%bc%81-%e6%97%a0%e5%88%b7%e7%94%b5%e6%9c%bafoc/#comments</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 11:37:23 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">http://antonioz.asia/?p=250</guid>

					<description><![CDATA[早前就准备尝试电机控制、FOC，谁想大力矩的无刷电机这么贵，于是计划搁置了半年。如今材料、元件俱全，趁着上班前 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>早前就准备尝试电机控制、FOC，谁想大力矩的无刷电机这么贵，于是计划搁置了半年。<br>如今材料、元件俱全，趁着上班前折腾一把吧！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>PCB设计参考up主 <strong><code><a href="https://www.bilibili.com/video/BV1yF411f7Ft" data-type="page" data-id="169">折腾plus</a></code></strong></p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="565" src="/wp-content/uploads/2025/07/Schematic_FOC-mini-STM32F103-已打板_2025-07-03-1024x565.png" alt="FOC原理图" class="wp-image-251" srcset="/wp-content/uploads/2025/07/Schematic_FOC-mini-STM32F103-已打板_2025-07-03-1024x565.png 1024w, /wp-content/uploads/2025/07/Schematic_FOC-mini-STM32F103-已打板_2025-07-03-300x165.png 300w, /wp-content/uploads/2025/07/Schematic_FOC-mini-STM32F103-已打板_2025-07-03-768x423.png 768w, /wp-content/uploads/2025/07/Schematic_FOC-mini-STM32F103-已打板_2025-07-03.png 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="416" height="392" src="/wp-content/uploads/2025/07/PCB_PCB_PCB_foc_motor_2024-04-28-copy_2025-07-03-2.png" alt="" class="wp-image-254" srcset="/wp-content/uploads/2025/07/PCB_PCB_PCB_foc_motor_2024-04-28-copy_2025-07-03-2.png 416w, /wp-content/uploads/2025/07/PCB_PCB_PCB_foc_motor_2024-04-28-copy_2025-07-03-2-300x283.png 300w" sizes="(max-width: 416px) 100vw, 416px" /></figure>
</div>


<p>最终成品：</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="1921" data-id="257" src="/wp-content/uploads/2025/07/motor_FOC-3-edited-scaled.jpg" alt="" class="wp-image-257" srcset="/wp-content/uploads/2025/07/motor_FOC-3-edited-scaled.jpg 2560w, /wp-content/uploads/2025/07/motor_FOC-3-edited-300x225.jpg 300w, /wp-content/uploads/2025/07/motor_FOC-3-edited-1024x768.jpg 1024w, /wp-content/uploads/2025/07/motor_FOC-3-edited-768x576.jpg 768w, /wp-content/uploads/2025/07/motor_FOC-3-edited-1536x1153.jpg 1536w, /wp-content/uploads/2025/07/motor_FOC-3-edited-2048x1537.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure>
</figure>



<p>经测试AS5600正常，DRV8313输出正常，但由于购买的小电机是小黄鱼上几块钱淘的3S 2208高转速电机（FPV上用的），DRV8313峰值电流才2.5A，完全带不动，仅有轻微阻尼感，所以还是乖乖换云台电机吧<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f602.png" alt="😂" class="wp-smiley" style="height: 1em; max-height: 1em;" />。<br>驱动板整体积巨小，比2208电机稍宽，比较适合做个棘轮旋钮，等下一次更新吧。</p>



<p>未完待续&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%bc%80%e6%96%b0%e5%9d%91%ef%bc%81-%e6%97%a0%e5%88%b7%e7%94%b5%e6%9c%bafoc/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>视觉机械臂</title>
		<link>/%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82/</link>
					<comments>/%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Sat, 19 Apr 2025 12:50:30 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">http://antonioz.asia/?p=232</guid>

					<description><![CDATA[方案：Maixcam+ESP32机械臂3D建模设计参考youtobe 紧凑型机械臂 涉及技术： 相机 相机标定 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>方案：Maixcam+ESP32<br>机械臂3D建模设计参考youtobe 紧凑型机械臂</p>



<h2 class="wp-block-heading">涉及技术：</h2>



<h3 class="wp-block-heading">相机</h3>



<h4 class="wp-block-heading">相机标定</h4>



<h4 class="wp-block-heading">相机坐标映射</h4>



<h4 class="wp-block-heading">YOLO模型训练</h4>



<h3 class="wp-block-heading">机械臂</h3>



<h4 class="wp-block-heading">运动学逆解</h4>



<h4 class="wp-block-heading">运动姿态结算</h4>



<p></p>



<figure class="wp-block-video"><video controls poster="http://47.122.127.59:20801/images/2025/04/19/5d01974067923df7cb7df9d88a5f40ae.fr.jpeg" src="http://47.122.127.59:20801/images/2025/04/19/5d01974067923df7cb7df9d88a5f40ae.mp4"></video></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>/%e8%a7%86%e8%a7%89%e6%9c%ba%e6%a2%b0%e8%87%82/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Maixcam使用</title>
		<link>/maixcam%e4%bd%bf%e7%94%a8/</link>
					<comments>/maixcam%e4%bd%bf%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Sat, 15 Mar 2025 18:44:28 +0000</pubDate>
				<category><![CDATA[博客]]></category>
		<category><![CDATA[电子设计]]></category>
		<category><![CDATA[笔记]]></category>
		<guid isPermaLink="false">http://antonioz.asia/?p=218</guid>

					<description><![CDATA[Maixcam使用 注意： 模型转换时，分辨率需保持一致，若为640X640训练的模型，则后面onnx模型转换 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>Maixcam使用</h1>
<h2>注意：</h2>
<ol>
<li>模型转换时，分辨率需保持一致，若为640X640训练的模型，则后面onnx模型转换为. cvimodel模型时需要保持参数一致！！！（适用于Maixcam的分辨率参数是320X224）</li>
<li>遇到如下问题，先升级ONNXRuntime—pip install &#8211;upgrade onnxruntime -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a></li>
</ol>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-219" src="/wp-content/uploads/2025/03/tpc-yolo_error.png" alt="" width="1232" height="136" srcset="/wp-content/uploads/2025/03/tpc-yolo_error.png 1232w, /wp-content/uploads/2025/03/tpc-yolo_error-300x33.png 300w, /wp-content/uploads/2025/03/tpc-yolo_error-1024x113.png 1024w, /wp-content/uploads/2025/03/tpc-yolo_error-768x85.png 768w" sizes="auto, (max-width: 1232px) 100vw, 1232px" /></p>
<p>一般升级后错误消失</p>
<ol>
<li>在文件夹里放置的图片要求：<br />
1.是数据集集里面的<br />
2.大小必须一致<br />
3.边长一定是32的倍数。如果不是32的倍数，就一定不符合模型的输入张量。补救的方法是用python脚本给他填充成32的倍数也行</li>
</ol>
<hr />
<p>用于yolo11n-obb模型：</p>
<p>OBB是什么？——和普通的识别框相比，OBB的识别框可以随物体的姿态转动，更好地标识出物体！你运行Maixvision自带案例中的ai_vision/nn_yolo11n_obb.py试试，看看这框真帅吧！而下图是我自己训练的模型效果：</p>
<p><img decoding="async" src="https://maixhub.com/public/sharing/39207-b7887866d2d04d3bbf2f9bed5e41d8c0.png" alt="" /></p>
<p>有人会问：只看Maixpy官方文档的那个YOLO11-obb部署与识别教程可以吗？——可以，但是大概率会踩不少坑。你也许会遇到识别框无法旋转、INT8模型无法转换成功、运行模型后相机卡死、导入模型失败……等一系列烦人的事。所以，请将官方文档和我这篇文章结合起来食用效果更佳。</p>
<p>所用开发环境是Linux ubuntu22.04。若你是在Windows也没关系，其核心思想万变不离其宗。</p>
<p>如有更好的提议请告诉我，谢谢！</p>
<h1><strong>查看相机Maixpy版本</strong></h1>
<p>在相机内打开设置——设备信息，查看你的MaixPy版本。MaixPy不仅有电脑pip安装的，相机内部也有自己的MaixPy。要确保MaixPy是比较新的版本。</p>
<p>在Maixpy的github仓库中可以看到，自4.9.3开始才支持YOLO11-OBB检测（没找到YOLOV8-OBB是什么时候，所以最好用YOLO11来进行OBB检测）。如果你需要升级相机的maixpy版本，就要准备一个读卡器，烧录教程看maixcam官方文档的即可，很详细我这里就不说了。</p>
<h1><strong>采集数据集</strong></h1>
<p>大多数人常用相机里那个Maixhub客户端来在线设备采集，然而这种设备采集的曝光时间、增益值是自动的，如果你对数据集曝光要求比较严格，那就需要自己写个拍摄的程序。</p>
<p>例如我编写的是下面的采集程序。启动程序后，每秒拍摄4张图片储存在相机SD卡中。你可以随意修改它的曝光，设为-1代表自动。</p>
<pre><code class="language-python">from maix import camera, display, app, time
import os

# 设置摄像头分辨率
cam = camera.Camera(660, 280)
disp = display.Display()

cam.skip_frames(200)# 延时，等待相机稳定

exposure=cam.exposure(value = 3000)
gain=cam.gain(value = 3300)

# 保存文件夹路径。这是关于相机内的路径，和电脑路径无关
save_folder = "/root/photo"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 设置拍摄频率（每秒4张）
capture_interval = 0.25# 每张图片间隔时间
last_capture_time = time.time()

while not app.need_exit():
    img = cam.read()
    disp.show(img)# 显示图片

    current_time = time.time()
    if current_time - last_capture_time &gt;= capture_interval:
# 生成文件名
        timestamp = int(current_time * 1000)# 使用时间戳作为文件名
        file_path = os.path.join(save_folder, f"{timestamp}.jpg")

# 保存图片
        img.save(file_path)
        print(f"Saved: {file_path}")

# 更新上次拍摄时间
        last_capture_time = current_time

    time.sleep(0.01)# 稍微延迟一下，避免占用过多CPU</code></pre>
<h1><strong>下载、配置yolo11训练工程</strong></h1>
<p>给它单独开一个conda环境，我用的python 3.10。</p>
<p>从<a href="https://github.com/ultralytics/ultralytics"><strong>https://github.com/ultralytics/ultralytics</strong></a>下载源码，不用选版本，直接下就行。下载好后执行 pip install -r ultralytics transformers -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple。之后如果报错缺少XX包，你就pip安装什么包。另外注意pip包之间容易有版本冲突，所以不能无脑下载，而是应该提前去百度包和包、包和环境之间的版本对应关系">https://pypi.tuna.tsinghua.edu.cn/simple。之后如果报错缺少XX包，你就pip安装什么包。另外注意pip包之间容易有版本冲突，所以不能无脑下载，而是应该提前去百度包和包、包和环境之间的版本对应关系</a>。</p>
<h1><strong>准备数据集</strong></h1>
<p>（1）数据集文件介绍</p>
<p>制作好的数据集的文件夹分布是这样的：</p>
<p><img decoding="async" src="https://maixhub.com/public/sharing/39207-51430ef88f0f45dbaa17934b82118510.png" alt="" /></p>
<p>images/train 里面放训练图片，labels/train 里面放训练txt。</p>
<p>images/val 里面放验证图片，labels/val 里面放验证txt。</p>
<p>test里面可以是空的。</p>
<p>（2）txt格式介绍</p>
<p>用上海交通大学交龙战队开源的那个就行<a href="https://github.com/xinyang-go/LabelRoboMaster"><strong>https://github.com/xinyang-go/LabelRoboMaster</strong></a>，它生成的txt格式完全符合标准。标注的方法看它的readme。</p>
<blockquote><p>关于训练图片，最好是每张图片分辨率完全一样！！虽说理论上任何大小的图片都可以用于训练。但是训练的图片最好不要有的图片width过大、有的图片hight过大，因为之后训练的时候程序会给它们填充灰边使其统一大小。</p>
<p>（3）整理好的数据集放在哪都行，我习惯放在Ultralytics工程目录下。</p></blockquote>
<h1><strong>获取yolo11n-obb.pt文件</strong></h1>
<p>从这个链接可以下载所有的官方pt权重文件<a href="https://github.com/ultralytics/assets/releases"><strong>https://github.com/ultralytics/assets/releases</strong></a>。注意我们要的不是普通的yolo11n.pt，而是yolo11n-obb.pt ！！它俩结构不一样，只有后者用于检测旋转矩形。</p>
<blockquote><p>使用yolo11s-obb乃至其他字母的行吗？——我的建议是一定要基于yolo11n-obb进行训练。我曾经试过 s 的，但是一开始推理相机就卡死、掉线，必须重启，说明相机内存爆了！去官网查看pt文件的大小，n 文件大小为5MB，而 s 文件19MB体量太大，其他字母的更不用说了，一个比一个大根本不能用。</p></blockquote>
<h1><strong>必备的两个yaml（1）——路径与标签</strong></h1>
<p>在工程目录下创建myfile-obb.yaml，输入：</p>
<pre><code class="language-yaml">path: /home/wp/ultralytics-main/my_data# dataset root dirtrain: images/train
val: images/val
#test: images/testnames:
  0: apple</code></pre>
<p>简单解释一下：train和val是相对于path路径的。有个一劳永逸、安全但麻烦的方法是都使用绝对路径，当然我上面的代码可没有这样做。</p>
<p>这里我只写了一个类别。你可以随意更改类别的数目、内容。</p>
<h1><strong>必备的两个yaml（2）——网络定义</strong></h1>
<p>先声明一点：这个yaml是官方的，自己不用写，我们常说的“基于yolo…”就是选择的这个yaml。</p>
<p>在 ultralytics/cfg/models 下，你会看到从v3到v11所有版本的yaml，里面还细分了pose、obb、普通等各种模型，这个 yolo11-obb.yaml 就是我们想要的，复制一份放在工程目录下。</p>
<p><img decoding="async" src="https://maixhub.com/public/sharing/39207-cb168f32b0374401aee582e88ac3a738.png" alt="" /></p>
<blockquote><p>一定要重命名为yolo11n-obb.yaml，刚拿出来是不带s、n……这些字母的。</p></blockquote>
<p>内容只需要改标签类别(nc)这个数字。</p>
<p>网上有博主给你的，其网络结构大概率和官方的这个yaml内容一模一样，用vscode对比就能看出来。</p>
<h1><strong>编写训练器train.py</strong></h1>
<p>在工程目录下新建一个train.py，那个imgsz是缩放 / 填充预处理，如果你的图片小于这个数，就会填充黑边再训练。其余的改改路径就行：</p>
<p>而v8训练出来的模型识别框根本无法旋转，角度永远输出-1.0000。</p>
<p>可能出现的问题：明明我指定的是yolo11s的pt文件，但是训练前期非要给我下载yolo11n.pt</p>
<p>先说明一点——不要使用yolo11s训练。不过我们还是要解决这个问题：找到amp这个参数，将它关闭就行。在ultralytics-main官方文件中，amp参数在ultralytics/cfgdefault.yaml 中，以键值对的方式，默认为True，把它改为False就行了。</p>
<pre><code class="language-python">from ultralytics import YOLO

def main():
    model = YOLO('yolo11n-obb.yaml').load('/home/wp/ultralytics-main/yolo11n-obb.pt')# build from YAML and transfer weights
    model.train(data='myfile-obb.yaml', epochs=100, imgsz=416, batch=4, workers=4)
if __name__ == '__main__':
    main()</code></pre>
<h1><strong>检查训练结果，获得pt模型文件</strong></h1>
<p>训练好之后，在 runs/obb 下就能看到检测结果了。</p>
<h1><strong>pt转ONNX</strong></h1>
<p>工程目录下新建transform.py，代码如下。</p>
<blockquote><p>这里的 width、height 一定要设置成32的倍数。如&gt;果你没有设置为32的倍数，程序会悄悄设置成32的倍数，之后可能不符合你的预期而浪费时间。</p></blockquote>
<p>转换成功后，在pt文件的同目录下就生成了。</p>
<pre><code class="language-python">from ultralytics import YOLO

net_name = "/home/wp/ultralytics-main/runs/obb/train5/weights/best.pt"
input_width = 864# 一定是32的倍数
input_height = 288

model = YOLO(net_name)
path = model.export(format="onnx", imgsz=[input_height, input_width], dynamic=False, simplify=True, opset=17)# export the model to ONNX formatprint(path)</code></pre>
<h1><strong>ONNX转mud和cvimodel</strong></h1>
<p>（1）确定ONNX模型的输出节点</p>
<p>上https://netron.app/查看ONNX文件的结构图。按ctrl+F分别搜索：/model.23/dfl/conv/Conv_output_0，/model.23/Sigmoid_1_output_0，/model.23/Sigmoid_output_0。看看有没有这三个节点，如果缺少了说明模型错了。</p>
<p>（2）部署并配置算能的tpu-mlir</p>
<ul>
<li>先装好docker吧，用小鱼ROS命令装很轻松。终端输入：按照小鱼的指引一步步来就行。（Windows用其他方式安装）</li>
</ul>
<pre><code>wget http://fishros.com/install -O fishros &amp;&amp; . fishros</code></pre>
<ul>
<li>终端执行命令 wget <a href="https://sophon-file.sophon.cn/sophon-prod-s3/drive/24/06/14/12/sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz">https://sophon-file.sophon.cn/sophon-prod-s3/drive/24/06/14/12/sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz</a> 下载它的压缩包，下载好后执行docker load -i sophgo-tpuc_dev-v3.2_191a433358ad.tar.gz 。</li>
<li>在home目录下新建文件夹MaixCAM，在此文件夹下打开终端，执行 docker run &#8211;privileged &#8211;name MaixCAM -v $PWD:/workspace -it sophgo/tpuc_dev:v3.2 ，创建来一个MaixCAM的容器。没问题，然后关闭终端。</li>
<li>前往<a href="https://github.com/sophgo/tpu-mlir/releases"><strong>https://github.com/sophgo/tpu-mlir/releases</strong></a>，下载一个tpu_mlir-1.15b0-py3-none-any.whl，下载好后将它移动到MaixCAM，在文件夹内打开终端，输入 docker start MaixCAM &amp;&amp; docker attach MaixCAM 打开容器，执行 pip install tpu_mlir-1.15b0-py3-none-any.whl ，完成后如下图所示。（3）将你需要转换的onnx文件放到MaixCAM文件夹中，再将一些待会测试的图片放进去。这里注意，test.jpg和images文件夹里的所有图片有3点要求：1.这些图片来自于数据集。2.大小必须一致。补救的方法是用python脚本用(114,114,114)的灰色填充为大小一致。3.边长一定是32的倍数。如果不是32的倍数，就一定不符合模型的输入张量。补救的方法是用python脚本用(114,114,114)的灰色填充为32的倍数。<img decoding="async" src="https://maixhub.com/public/sharing/39207-ae8cf0bd22674376a2335cb26bcf2ec2.png" alt="" />
<p><img decoding="async" src="https://maixhub.com/public/sharing/39207-930151844bee4c9483bf450f50792938.png" alt="" /></li>
</ul>
<blockquote><p>这里的test.jpg的作用是什么？用于程序内部预处理验证、模型测试。从数据集中选取一张与模型输入相同大小的图片即可。images里面的图像作用又是什么？你会发现这只是专为INT8的转换而传入的。因为模型从浮点类型转为int类型需要生成“校准表”，用来调整网络中各种阈值参数。这个过程可以看做小规模的数据集训练，最后得到程序所需的参数。你需要从训练集中尽可能挑选各种特色鲜明、非极端情况的图片100~1000张。详细原理看https://doc.sophgo.com/sdk-docs/v23.03.01/docs_latest_release/docs/tpu-mlir/developer_manual/html/07_calibration.html</p></blockquote>
<p>（4）建立转换脚本</p>
<p>新建 .sh 脚本，命名为convert_yolo11_to_cvimodel，里面输入下面的代码。</p>
<p>你需要修改的是：把net_name改成模型文件名字，宽和高改成模型输入口的大小。&#8211;output_names改成你自己的模型名称。</p>
<blockquote><p>可能出现的问题：在容器内报错：[ONNXRuntimeError] : 9 : NOT_IMPLEMENTED : Could not find an implementation for Reshape(19) node with name &#8216;/model.22/Reshape&#8217;</p>
<p>那就在容器内执行 pip install &#8211;upgrade onnxruntime -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a> 升级onnxruntime就行。</p></blockquote>
<pre><code>#!/bin/bash

set -e

net_name=my_obb
input_w=864
input_h=288

# mean: 0, 0, 0# std: 255, 255, 255# mean# 1/std# mean: 0, 0, 0# scale: 0.00392156862745098, 0.00392156862745098, 0.00392156862745098mkdir -p workspace
cd workspace

# convert to mlir
model_transform.py 
--model_name ${net_name} 
--model_def ../${net_name}.onnx 
--input_shapes [[1,3,${input_h},${input_w}]] 
--mean "0,0,0" 
--scale "0.00392156862745098,0.00392156862745098,0.00392156862745098" 
--keep_aspect_ratio 
--pixel_format rgb 
--channel_format nchw 
--output_names "/model.23/dfl/conv/Conv_output_0,/model.23/Sigmoid_1_output_0,/model.23/Sigmoid_output_0" 
--test_input ../test.jpg 
--test_result ${net_name}_top_outputs.npz 
--tolerance 0.99,0.99 
--mlir ${net_name}.mlir

# export bf16 model#   not use --quant_input, use float32 for easy coding
model_deploy.py 
--mlir ${net_name}.mlir 
--quantize BF16 
--processor cv181x 
--test_input ${net_name}_in_f32.npz 
--test_reference ${net_name}_top_outputs.npz 
--model ${net_name}_bf16.cvimodel

echo "calibrate for int8 model"
# export int8 model
run_calibration.py ${net_name}.mlir 
--dataset ../images 
--input_num 200 
-o ${net_name}_cali_table

echo "convert to int8 model"
# export int8 model#    add --quant_input, use int8 for faster processing in maix.nn.NN.forward_image
model_deploy.py 
--mlir ${net_name}.mlir 
--quantize INT8 
--quant_input 
--calibration_table ${net_name}_cali_table 
--processor cv181x 
--test_input ${net_name}_in_f32.npz 
--test_reference ${net_name}_top_outputs.npz 
--tolerance 0.9,0.6 
--model ${net_name}_int8.cvimodel</code></pre>
<p>（5）生成cvimodel文件，制作mud文件</p>
<p>在容器中执行 chmod +x convert_yolo11_to_cvimodel.sh &amp;&amp; ./convert_yolo11_to_cvimodel.sh 命令。如果没问题的话，在 workspace 就能生成cvimodel文件。</p>
<p>有2种精度，选一种拷贝一份出来（更推荐使用INT8，虽然精度低，但是非常快），改名为my_model.cvimodel，再新建my_mud.mud文件，内容如下，改一下模型名称，改一下标签。</p>
<pre><code>[basic]
type = cvimodel
model = my_model.cvimodel

[extra]
model_type = yolo11
input_type = rgb
mean = 0, 0, 0
scale = 0.00392156862745098, 0.00392156862745098, 0.00392156862745098
labels = apple</code></pre>
<p>很容易报如下图的错：这是因为文件夹中放置的用于INT8转换的图片不符合上述的3点要求，所以你再仔细检查检查。然而此时精度bf16的cvimodel文件已经输出了，你要是不用INT8，就可以不理会这个报错。</p>
<p><img decoding="async" src="https://maixhub.com/public/sharing/39207-89286b77c64146a19629eb3841124b8e.png" alt="" /></p>
<p>（6）模型导入MaixCAM，打包为软件</p>
<p>打开Maixvision，将相机连接。在文件管理器内，新建my_project文件夹，将cvimodel和mud文件同时导入。</p>
<p>在电脑上新建test.py输入下面的代码，Maixvision打开该文件然后运行。</p>
<pre><code class="language-python">from maix import camera, display, image, nn, app

detector = nn.YOLO11(model="/root/my_project/my_mud.mud", dual_buff = True)

cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format())
disp = display.Display()

while not app.need_exit():
    img = cam.read()
    objs = detector.detect(img, conf_th = 0.7, iou_th = 0.65)# 阈值for obj in objs:

        points = obj.get_obb_points()
        msg = f'{detector.labels[obj.class_id]}: {obj.score:.2f}, {obj.angle * 180:.1f}'
        img.draw_string(points[0], points[1] - 4, msg, color = image.COLOR_RED)
        detector.draw_pose(img, points, 8 if detector.input_width() &gt; 480 else 4, image.COLOR_RED, close=True)
# 打印识别框的信息print(obj)
    disp.show(img)</code></pre>
<p>如果报错“&#8217;maix._maix.nn.Object&#8217; object has no attribute &#8216;get_obb_points&#8217;”未找到get_obb_points这个函数，说明你相机内部的MaixPy版本低于4.9.3，一定要升级。</p>
]]></content:encoded>
					
					<wfw:commentRss>/maixcam%e4%bd%bf%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>浅浅的回顾一下 24年集创赛（待写）</title>
		<link>/%e6%b5%85%e6%b5%85%e7%9a%84%e5%9b%9e%e9%a1%be%e4%b8%80%e4%b8%8b-24%e5%b9%b4%e9%9b%86%e5%88%9b%e8%b5%9b%ef%bc%88%e5%be%85%e5%86%99%ef%bc%89/</link>
					<comments>/%e6%b5%85%e6%b5%85%e7%9a%84%e5%9b%9e%e9%a1%be%e4%b8%80%e4%b8%8b-24%e5%b9%b4%e9%9b%86%e5%88%9b%e8%b5%9b%ef%bc%88%e5%be%85%e5%86%99%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Fri, 28 Feb 2025 16:06:27 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<category><![CDATA[说说]]></category>
		<guid isPermaLink="false">http://192.168.110.68/?p=161</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1233" height="1725" src="/wp-content/uploads/2025/03/集创赛海报-智能游戏机-1.png" alt="" class="wp-image-165"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%b5%85%e6%b5%85%e7%9a%84%e5%9b%9e%e9%a1%be%e4%b8%80%e4%b8%8b-24%e5%b9%b4%e9%9b%86%e5%88%9b%e8%b5%9b%ef%bc%88%e5%be%85%e5%86%99%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>New Idea——机械臂！</title>
		<link>/new-idea-%e6%9c%ba%e6%a2%b0%e8%87%82%ef%bc%81/</link>
					<comments>/new-idea-%e6%9c%ba%e6%a2%b0%e8%87%82%ef%bc%81/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Mon, 02 Dec 2024 10:34:15 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<category><![CDATA[说说]]></category>
		<guid isPermaLink="false">http://192.168.31.64/?p=132</guid>

					<description><![CDATA[solidworks 建模完成]]></description>
										<content:encoded><![CDATA[
<p>solidworks 建模完成</p>



<ul class="wp-block-list">
<li>装配体图片：</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="760" src="/wp-content/uploads/2024/12/屏幕截图-2024-12-02-182856.png" alt="" class="wp-image-133"/></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>/new-idea-%e6%9c%ba%e6%a2%b0%e8%87%82%ef%bc%81/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>树莓派平台-OpenCV</title>
		<link>/%e6%a0%91%e8%8e%93%e6%b4%be%e5%b9%b3%e5%8f%b0-opencv/</link>
					<comments>/%e6%a0%91%e8%8e%93%e6%b4%be%e5%b9%b3%e5%8f%b0-opencv/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Mon, 09 Sep 2024 20:23:10 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">http://192.168.31.64/?p=105</guid>

					<description><![CDATA[人脸检测 由于树莓派系统更新后，官方不再提供camera驱动，而是使用Linux平台libcamera替代，且 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">人脸检测</h2>



<pre class="wp-block-code"><code>运行于Windows11平台：
    import cv2
    import time

    # 加载人脸检测的 Haar 特征分类器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

    # 打开摄像头
    cap = cv2.VideoCapture(0)

    # 获取摄像头分辨率
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    print(f"当前分辨率: {frame_width}x{frame_height}")

    # 初始化帧率计算
    fps = 0
    prev_time = time.time()

    while True:
        # 读取摄像头画面
        ret, frame = cap.read()
        if not ret:
            break

        # 将图像转换为灰度图
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

        # 在检测到的人脸周围绘制矩形框
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

        # 计算并显示帧率
        current_time = time.time()
        fps = 1 / (current_time - prev_time)
        prev_time = current_time
        cv2.putText(frame, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        # 显示结果
        cv2.imshow('Face Detection', frame)

        # 按 'q' 键退出
        if cv2.waitKey(1) &amp; 0xFF == ord('q'):
            break

    # 释放摄像头并关闭窗口
    cap.release()
    cv2.destroyAllWindows()
</code></pre>



<p>由于树莓派系统更新后，官方不再提供camera驱动，而是使用Linux平台libcamera替代，且OpenCV部分还未能适配libcamera库，则不能使用常规的cv2.Capture(0)开启摄像头。</p>



<p>采用libcamera搭配cv2库替代：</p>



<pre class="wp-block-code"><code></code></pre>



<h2 class="wp-block-heading">目标跟踪&amp;距离估算</h2>



<p>单目摄像头需要根据已知实际物体大小来估算具体位置，如估算脸宽0.15m，camera视角范围62.2°（实际应该是160°，但经过裁剪，故估算62.2°左右）</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1285" height="964" src="/wp-content/uploads/2024/09/face_tracking.png" alt="" class="wp-image-107"/></figure>



<p>帧率属实堪忧<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" />。</p>



<pre class="wp-block-code"><code>import math
import cv2
import time
from picamera2 import Picamera2

# Set known parameters
W = 0.15  # Actual face width (in meters)
FOV_x = 62.2  # Horizontal field of view (in degrees)
image_width = 640  # Image width (in pixels)

# Initialize the camera
picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(main={"size": (image_width, 480)}))
picam2.start()

# Load the Haar Cascade for face detection
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Initialize variables for FPS calculation
prev_time = time.time()
fps = 0

while True:
    # Capture the frame
    frame = picam2.capture_array()
    
    # Fix BGR to RGB color inversion
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # Calculate the focal length
    FOV_x_rad = math.radians(FOV_x)
    focal_length = (image_width / 2) / math.tan(FOV_x_rad / 2)

    for (x, y, w, h) in faces:
        face_width = w
        # Estimate the distance
        distance = (focal_length * W) / face_width

        # Draw the detected face and display the distance
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        cv2.putText(frame, f"Distance: {distance:.2f} m", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # Calculate and display FPS
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time
    cv2.putText(frame, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # Display resolution
    resolution_text = f"Resolution: {frame.shape&#91;1]}x{frame.shape&#91;0]}"
    cv2.putText(frame, resolution_text, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # Show the camera feed
    cv2.imshow("Camera", frame)

    # Break the loop if 'q' is pressed
    if cv2.waitKey(1) &amp; 0xFF == ord('q'):
        break

# Cleanup
cv2.destroyAllWindows()
picam2.stop()
</code></pre>



<h2 class="wp-block-heading">帧率优化：</h2>



<p>使用树莓派官方提供的Linux raspberry OS使用OpenCV人脸检测仅仅达到3帧左右，帧率堪忧，还有很多需要优化的地方</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%a0%91%e8%8e%93%e6%b4%be%e5%b9%b3%e5%8f%b0-opencv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>全国工程实践与创新能力大赛 智能物流搬运机器人</title>
		<link>/%e5%85%a8%e5%9b%bd%e5%b7%a5%e7%a8%8b%e5%ae%9e%e8%b7%b5%e4%b8%8e%e5%88%9b%e6%96%b0%e8%83%bd%e5%8a%9b%e5%a4%a7%e8%b5%9b-%e6%99%ba%e8%83%bd%e7%89%a9%e6%b5%81%e6%90%ac%e8%bf%90%e6%9c%ba%e5%99%a8%e4%ba%ba/</link>
					<comments>/%e5%85%a8%e5%9b%bd%e5%b7%a5%e7%a8%8b%e5%ae%9e%e8%b7%b5%e4%b8%8e%e5%88%9b%e6%96%b0%e8%83%bd%e5%8a%9b%e5%a4%a7%e8%b5%9b-%e6%99%ba%e8%83%bd%e7%89%a9%e6%b5%81%e6%90%ac%e8%bf%90%e6%9c%ba%e5%99%a8%e4%ba%ba/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Mon, 09 Sep 2024 20:08:52 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">http://192.168.31.64/?p=101</guid>

					<description><![CDATA[Github：pieceofApple/Intelligent-logistics-car: 2023年中国大 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Github：<a href="https://github.com/pieceofApple/Intelligent-logistics-car">pieceofApple/Intelligent-logistics-car: 2023年中国大学生工程实践与创新能力大赛 (github.com)</a></p>



<h1 class="wp-block-heading">2023年中国大学生工程实践与创新能力大赛 智能物流小车赛道 国三作品</h1>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>此项目为2023年中国大学生工程实践与创新能力大赛 智能物流小车赛道 国三作品</strong></p>



<p><strong>小车所有结构以及代码部分均为团队自己设计</strong></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>注意</strong>：电源需要采用12V大功率的航模电池，否则舵机无法正常驱动</p>
</blockquote>



<h2 class="wp-block-heading">概要</h2>



<ol class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4df.png" alt="📟" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>代码功能</strong>:
<ul class="wp-block-list">
<li>小车步进电机控制</li>



<li>机械臂舵机控制</li>



<li>OpenMV物料识别控制</li>



<li>抓取放置动作组控制</li>



<li>空间坐标解算</li>



<li>PID控制算法</li>
</ul>
</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4bb.png" alt="💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>开发平台</strong>:
<ul class="wp-block-list">
<li>Keil5 ARM</li>



<li>使用的MCU为 STN32F103ZET6</li>



<li>搭配OpenMV识别</li>
</ul>
</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>项目挑战</strong>:
<ul class="wp-block-list">
<li>由于经费有限，前期小车结构并不稳定，所用舵机死区较大，所以止步国三</li>



<li>若换用精度更高的舵机，效果会更好</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">项目特点</h3>



<ul class="wp-block-list">
<li><strong>自主设计</strong>: 项目中的所有结构和代码均为团队自主设计。</li>



<li><strong>多功能集成</strong>: 实现了伺服电机、机械臂、物料识别、抓取放置等多功能集成。</li>



<li><strong>技术挑战</strong>: 在有限的资源条件下，通过优化控制算法和结构设计，尽可能提升小车的性能。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">BSP</h3>



<p><strong>详见</strong>BJDJ.pdf</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1052" height="783" src="/wp-content/uploads/2024/09/337949572-cad4108e-c378-4e20-a0d5-161835b46c54.png" alt="" class="wp-image-114"/></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">使用说明</h3>



<ol class="wp-block-list">
<li><strong>电源要求</strong>: 使用12V大功率的航模电池。</li>



<li><strong>开发环境</strong>: Keil5 ARM。</li>



<li><strong>硬件要求</strong>: STN32F103ZET6 MCU，OpenMV识别模块。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">贡献者</h3>



<ul class="wp-block-list">
<li>4位团队成员</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">许可</h3>



<p>Apache License</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="570" height="515" src="/wp-content/uploads/2024/09/337949324-be330736-23dc-4e8e-8699-e410823b9ec5.jpg" alt="" class="wp-image-113" style="width:838px;height:auto"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%85%a8%e5%9b%bd%e5%b7%a5%e7%a8%8b%e5%ae%9e%e8%b7%b5%e4%b8%8e%e5%88%9b%e6%96%b0%e8%83%bd%e5%8a%9b%e5%a4%a7%e8%b5%9b-%e6%99%ba%e8%83%bd%e7%89%a9%e6%b5%81%e6%90%ac%e8%bf%90%e6%9c%ba%e5%99%a8%e4%ba%ba/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>信号处理 DSPF28335 FFT（2023电赛C题）</title>
		<link>/%e4%bf%a1%e5%8f%b7%e5%a4%84%e7%90%86-dspf28335-fft%ef%bc%882023%e7%94%b5%e8%b5%9bc%e9%a2%98%ef%bc%89/</link>
					<comments>/%e4%bf%a1%e5%8f%b7%e5%a4%84%e7%90%86-dspf28335-fft%ef%bc%882023%e7%94%b5%e8%b5%9bc%e9%a2%98%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[Antonio]]></dc:creator>
		<pubDate>Sun, 03 Sep 2023 13:12:11 +0000</pubDate>
				<category><![CDATA[电子设计]]></category>
		<guid isPermaLink="false">http://192.168.1.8/?p=29</guid>

					<description><![CDATA[（任何与FFT相关的信号处理都可以参考哦~） CSDN链接：FFT 相位差计算DSPF28335（较为精准，± [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>（任何与FFT相关的信号处理都可以参考哦~）</p>



<p>CSDN链接：<a href="https://blog.csdn.net/Mr_bug_jiang/article/details/140803394?spm=1001.2014.3001.5502">FFT 相位差计算DSPF28335（较为精准，±0.1°）-CSDN博客</a></p>



<h1 class="wp-block-heading">DSP-Based Measurement System<a href="https://github.com/pieceofApple/DSPF28335_FFT-#dsp-based-measurement-system"></a></h1>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d0.png" alt="📐" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>项目描述</strong>： 该设计参考2023年全国大学生电子设计大赛C题，采用 TMS320F28335 制作。普通的 MCU 单片机计算效率低下，因此采用 DSP 完成。显示器件为 LCD1602。</p>



<p></p>



<p>![测量显示图]<a target="_blank" rel="noreferrer noopener" href="https://private-user-images.githubusercontent.com/116827010/337956616-af8a5ba4-fe2d-4fe3-acc6-2870850fb9bd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI2OTA3MTgsIm5iZiI6MTcyMjY5MDQxOCwicGF0aCI6Ii8xMTY4MjcwMTAvMzM3OTU2NjE2LWFmOGE1YmE0LWZlMmQtNGZlMy1hY2M2LTI4NzA4NTBmYjliZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODAzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwM1QxMzA2NThaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00YzU3NWNjYzAzY2QzMjI2NjE0MGY2YzZhZGQ3MmVkMTUyMmJmNWVmMDZmZDAwMWIxMTdhNWE2OTA0Y2JhNzlhJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.r90ggwHfeeo6AJzilO688qTRP5UxVcxIZQojohwtZrc"></a>&nbsp;由图片可见，所测结果分别为： VIN2幅值：1.28 VIN1幅值：0.49 相位差：91.53 电容C：9.223nf D值:0.0268 电桥测量103钽电容实际值为： C:9.42nf D值:0.017 综合以上测量结果可见： 所测量的幅值、相位差都很精准，所得电容C的值精确度也较高，但所得D值误差稍大，结合示波器测量结果可以判断，DSP所得数据无误，故误差应由外围测量电路造成，由于所用运放SN10501的非理想特性，会有极小的偏置电流，同时反馈电阻Rf的非理想特性也会导致所测电流大小偏差。故若想提升精度，需要改进测量外围电路，增加补偿电容或者通过大量的测量数据拟合曲线以修正偏差。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="668" height="665" src="/wp-content/uploads/2024/08/屏幕截图-2024-06-09-154024.png" alt="" class="wp-image-30" srcset="/wp-content/uploads/2024/08/屏幕截图-2024-06-09-154024.png 668w, /wp-content/uploads/2024/08/屏幕截图-2024-06-09-154024-300x300.png 300w, /wp-content/uploads/2024/08/屏幕截图-2024-06-09-154024-150x150.png 150w" sizes="auto, (max-width: 668px) 100vw, 668px" /></figure>



<h2 class="wp-block-heading">总体方案<a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E6%80%BB%E4%BD%93%E6%96%B9%E6%A1%88"></a></h2>



<p>根据电路基础的知识，一个阻抗两端的电压除以流过其中的电流，就是阻抗值。阻抗包括电阻和电抗。电阻是阻抗的实部，电抗是阻抗的虚部。在交流电压情况下，电抗会使电流波形和电压波形产生相位差。根据阻抗的电学定义，测试到电压和电流，相位差，就可以计算出阻抗。</p>



<p>运放电路中有一个基础单元电路，IV转换电路（电流转电压）。使用这个电路，就可以进行阻抗测量。&nbsp;<a href="https://private-user-images.githubusercontent.com/116827010/337956687-09edf311-f6fa-45fc-ac65-b0a9d635cdf0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI2OTA3MTgsIm5iZiI6MTcyMjY5MDQxOCwicGF0aCI6Ii8xMTY4MjcwMTAvMzM3OTU2Njg3LTA5ZWRmMzExLWY2ZmEtNDVmYy1hYzY1LWIwYTlkNjM1Y2RmMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODAzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwM1QxMzA2NThaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNGYzZTM3YmY1ZDBlYjM3ZmY4NGIwZjMxOWJiZGU4OWYxMzJiZDVjNTkxODMwNTYxZDBlNGU1MWQyN2UyMDZjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.7zOS6dM0RgwDtApwrbtNJ8yrpp9A7n76lSPtV939vck" target="_blank" rel="noreferrer noopener"></a></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="366" height="423" src="/wp-content/uploads/2024/08/FFT_28335.png" alt="" class="wp-image-31" style="width:432px;height:auto" srcset="/wp-content/uploads/2024/08/FFT_28335.png 366w, /wp-content/uploads/2024/08/FFT_28335-260x300.png 260w" sizes="auto, (max-width: 366px) 100vw, 366px" /></figure>



<h3 class="wp-block-heading">具体步骤<a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E5%85%B7%E4%BD%93%E6%AD%A5%E9%AA%A4"></a></h3>



<ol class="wp-block-list">
<li>经过外围电路处理，电流以电压形式体现，再通过DSP的ADC模块分别对待测元件两端的电压 VIN1 和通过待测元件的电流（以电压形式体现） VIN2 进行采样 1024 个点，存至数组后对其进行 FFT 运算，对得到的 VIN1、VIN2 的幅值进行运算：
<ul class="wp-block-list">
<li>相位差 α = VIN1 相位 &#8211; VIN2 相位</li>



<li>阻抗 Zx = VIN1 / VIN2 * Rf (Rf 为反馈电阻)</li>
</ul>
</li>



<li>电容计算：
<ul class="wp-block-list">
<li>Zc = Zx * sin(α)</li>



<li>C = 1 / (2 * π * Zc)</li>
</ul>
</li>



<li>电感计算：
<ul class="wp-block-list">
<li>Zl = Zx * sin(α)</li>



<li>L = 1 / (2 * π * Zl)</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">FFT 运算参数<a href="https://github.com/pieceofApple/DSPF28335_FFT-#fft-%E8%BF%90%E7%AE%97%E5%8F%82%E6%95%B0"></a></h3>



<ul class="wp-block-list">
<li>采样点数 N：512</li>



<li>采样率 fs：100KHz</li>



<li>待测频率固定为 25kHz，因此 25k / 100k * 512 = 128，所以所测信号对应频率点应该为第 128 点，只需关注第 128 点的幅值。</li>



<li>第 0 点为直流分量。</li>
</ul>



<h3 class="wp-block-heading">显示部分<a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E6%98%BE%E7%A4%BA%E9%83%A8%E5%88%86"></a></h3>



<p>在完成以上计算后，将计算结果显示在 LCD1602 上。</p>



<h2 class="wp-block-heading">核心设计</h2>



<p><a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1"></a></p>



<ul class="wp-block-list">
<li><strong>核心芯片</strong>: TMS320F28335</li>



<li><strong>显示器件</strong>: LCD1602</li>



<li><strong>运算放大器</strong>: LF347（4个）</li>
</ul>



<h2 class="wp-block-heading">设计说明</h2>



<p><a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E8%AE%BE%E8%AE%A1%E8%AF%B4%E6%98%8E"></a></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f527.png" alt="🔧" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>电路设计</strong>: 借鉴 TIDA-060029 文档中的电路设计，核心思想是 IV 分离电路，但采用了自主平衡阻抗和更优良的补偿机制。</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c4.png" alt="📄" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>参考文档</strong>:&nbsp;<a href="https://www.ti.com.cn/cn/lit/ug/zhcu794b/zhcu794b.pdf?ts=1717917139311&amp;ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fsitesearch%252Fzh-cn%252Fdocs%252Funiversalsearch.tsp%253FlangPref%253Dzh-CN">TIDA-060029 文档</a></p>



<p>由于现有器件限制，使用的运放为 LF347，刚好4个够用。运放电路较为简单，并未采用补偿机制，但测量精度尚可。由于电路的非理想特性，若不采用补偿机制，只能通过后期 FFT 所得参数进行拟合调教。</p>



<h2 class="wp-block-heading">硬件组件</h2>



<p><a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E7%A1%AC%E4%BB%B6%E7%BB%84%E4%BB%B6"></a></p>



<ul class="wp-block-list">
<li><strong>TMS320F28335</strong>: 高性能 DSP</li>



<li><strong>LCD1602</strong>: 显示模块</li>



<li><strong>LF347</strong>: 四运放芯片</li>
</ul>



<h2 class="wp-block-heading">功能介绍</h2>



<p><a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D"></a></p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f310.png" alt="🌐" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>高效计算</strong>: 采用 DSP 提高计算效率</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4ca.png" alt="📊" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>精确测量</strong>: 通过自定义电路实现高精度测量</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5a5.png" alt="🖥" class="wp-smiley" style="height: 1em; max-height: 1em;" />&nbsp;<strong>实时显示</strong>: 使用 LCD1602 实时显示测量数据</li>
</ul>



<h2 class="wp-block-heading">连接示例</h2>



<p><a href="https://github.com/pieceofApple/DSPF28335_FFT-#%E8%BF%9E%E6%8E%A5%E7%A4%BA%E4%BE%8B"></a></p>



<pre class="wp-block-code"><code>TMS320F28335    LCD1602   LF347
VCC             VCC       VCC
GND             GND       GND
SDA             SDA       -
SCL             SCL       -
...</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>/%e4%bf%a1%e5%8f%b7%e5%a4%84%e7%90%86-dspf28335-fft%ef%bc%882023%e7%94%b5%e8%b5%9bc%e9%a2%98%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
