2021/1/12 2019全国大学生电子设计大赛 - F题纸张计数 (纯模电设计方案 全国一等奖)

本文围绕F题纸张计数(测电容)展开,介绍题目要点,分析测量电容范围,确定主控芯片及硬件模块。阐述测量思路,进行部分电路设计,包括反馈电阻计算等。展示测试数据与结果,分析误差原因,还提及双通道设计、网络终端和低功耗设计等发挥部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在开头
研究生考试结束了,也算是闲下来了,打算把以前没有写、没有整理的一些东西重新整理一下,恰好翻到了这个资料,重温一下旧梦。

F题纸张计数 (测电容)

1.1 题目

在这里插入图片描述
具体的题目文件我会发在附录里面,在这里我简单介绍一下几个要点.

  • 极板 A 和极板 B 上的金属电极部分均为边长 50mm±1 mm 的正方形, 导线 a 和导线 b 长度均为 500mm±5mm。
  • 测量显示电路可自检并报告极板 A 和极板 B 电极之间是否短路。
  • 测量纸张数量大于60张
  • 极板 A、B 可用金属板材制作,也可用双面覆铜板制作。双面板的一面加工出边长 50mm±1mm 的正方形覆铜电极板,另一面允许有用于焊接导线 a、b 的过孔焊盘与引线、 不允许有覆铜面网。 禁止用多层板制作极板。
  • 极板之间仅允许单线接出,极板不允许接地!

2.1 题目分析及思路

2.1.1 题目分析

从拿到所有题目到选出这道题,大概花了半小时,明确具体要测量电容之后,马上开始进入到机械结构的设计,其实本来这里要配图的,但是时间太久了,没有图了。
设计好机械结构后,简单的拿RLC电桥测量了一下电容范围,从一张纸到一坨纸,电容值大概在20pf - 600pf之间变化,但变化不是线性的,就大概可以设计电路了.
我们组能力比较强,我负责软件部分,我女朋友负责焊板子,还有个大佬负责硬件设计,商量了一下。具体方案如下:

  • 主控芯片采用STM8L,电池供电,争取低功耗作为加分项(无效)
  • 硬件部分采用
信号源
待测电容
带通滤波器
全波整流器
AD转换器
  • 信号源选用 AD9833
  • 带通滤波器 考虑到由电池供电 选用MCP6022 虚地1.25V
  • 全波整流器 采用MCP6022
  • AD转换器 采用TM7705 16Bit ADC

模块电路图见附录

2.1.2 测量思路

采用恒流法测量,测量原理来源于阻抗的定义。已知流经被测阻抗的电流 I 0 I_0 I0,并测得被测阻抗两端的电压 U 0 U_0 U0,则通过比率便可得到被测阻抗 Z Z Z= U 0 I 0 \frac{U_0}{I_0} I0U0 在一定的工作频率下,根据电容容抗公式 Z Z Z = 1 2 π f c \frac{1}{2πfc} 2πfc1 得相应电容值变化,进而得到纸张数量。

2.2 部分电路设计

2.2.1 反馈电阻计算

  • 如下图所示为容抗测量电路,信号源给出高频信号,信号作用于待测电容 上,不同容值的电容会产生不同的容抗,产生不同的电流,通过采样电阻将电流 值转换为电压值,此电压值与电容值呈一定关系。图中,反馈通道上的电流与反相端电流相等,其中接口 XH 为检测装置的极板,电路中的采样电阻的确定由如 下公式推算,经测试,测量装置的极板间短路与满载时的电容为 20pF 与 600pF, 工作频率为 100KHZ,根据运算放大器的虚短虚断特点,同相端与反向端电压值相等。

在这里插入图片描述

2.2.2 驱动信号源电路

  • 信号源输出波形后,用一阶高通进行隔离直流,使用 106 电容与 10K 电阻。 由于信号源输出电压最大峰峰值为 500mV,为测得更精准的 AD 值,将信号源峰峰 值放大至 2.6V,即放大 5倍,根据同向放大器放大倍数公式,故电阻取值 10K 与 39K。
    在这里插入图片描述

2.2.3 带通滤波器设计电路

  • 为增加抗干扰能力,设置中心频率为100KHZ的二阶有源带通滤波器。如图 所示,图中 R 16 R_{16} R16 C 19 C_{19} C19构成低通网络, R 18 R_{18} R18 C 16 C_{16} C16组成高通网络,两者串联组成带通滤波电路。根据带通计算公式
  • Q Q Q= 1 3 − A v f \frac{1}{3-A_{vf}} 3Avf1=5
  • A v f A_{vf} Avf=1+ R f R 1 = 2.8 \frac{R_f}{R_1}=2.8 R1Rf=2.8
  • B W BW BW= f 0 Q \frac{f_0}{Q} Qf0
  • 求得低通网络阻值为1.592K,容值为1nF,高通网络阻值为3.184K,容值为1nF,同相比例放大电阻值为1k与1.8K。
    在这里插入图片描述

2.2.3 AD采样电路

  • 为提高AD采样精度,电路中采用TM7705采样芯片,如图3-4所示基准源为1.25V。并且采用了继电器切换采样电阻的方法.
  • 继电器不吸合时控制反馈电阻R7与R25并联,为166Ω,继电器吸合时反馈电阻为500Ω,以此来提高AD采样精度,适合于不同的量程范围。在这里插入图片描述

2.3 最终成品照片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1 测试数据

给定纸张数测量纸张数测试次数
0020
6620
131320
191920
232320
282820
343420
393920
454520
535320
606020

3.2 测试结果分析

  • 系统实现了纸张测量,并且误差率低,偶然发生一张纸的误差。
  • 产生的原因有两点:在测量过程中,外界干扰因素或者系统本身引起的引起零点漂移,会造成测量误差或者人体靠近极板的过程中由于人体自身所带的电磁场影响待测装置的两极板间的电荷分布从而引起误差。

3.3 发挥部分

  • 双通道设计:通道1为50mm×50mm的极板通道,通道2为25mm×50mm的极板通道,通道2的极板,当极板面积减为题目要求的一半时,通道可以完成题目要求,并且测量纸张范围为0~45张。
  • 网络终端:具有远程网络通信功能,可以作为从机接入网络中,可以在远程控制测量装置。
  • 低功耗设计:3.6V电池给系统供电,系统工作时,工作电流仅需30mA。

4.1 最终致谢

  • 这一块要好好感谢我的女朋友还有我的好兄弟,一路从省赛到国赛到复测。从上海到北京。一路太多心酸汗水不说了,特别是进测试的时候,听到别人使用 FDC2214方案能够测几百张纸的时候,我内心一度挣扎,为什么要挑战模电方案,放着现成的传感器方案不用!!!
  • 最终的结果还不错,成功拿下国一,女朋友考研成功,而我安安心心当个废物。

附录

  • ( A ) F题_纸张计数显示装置
  • ( B ) 报告
  • ( C ) 程序
  • ( D ) 原理图
  • 以上资料将在稍后提供下载 急需请评论区留言
<think>嗯,用户想了解Java中如何遍历List。首先,我得回忆一下Java中的List遍历方法有哪些。常见的应该有三种:for循环、增强for循环和迭代器。可能还有Java 8的Stream API的forEach方法。 然后,我需要考虑用户可能的背景。可能是刚开始学Java,或者对集合操作不太熟悉。需要解释清楚每种方法的用法,给出示例代码,并指出优缺点,这样用户可以根据情况选择合适的方法。 接下来,要确保回答结构清晰。分点说明每种遍历方式,比如1. 普通for循环,2. 增强for循环,3. 迭代器,4. forEach方法。每种方法都需要代码示例,注意要使用正确的语法,比如泛型、变量命名等,可能需要用List<String>作为例子。 还要注意提到线程安全的问题,比如在用迭代器遍历时删除元素会抛异常,而使用CopyOnWriteArrayList或者在迭代器中正确使用remove方法。这点可能对用户在实际开发中遇到问题时有帮助。 另外,Java 8的Stream API的forEach可能用户不太熟悉,需要简单说明,但要指出它在并行处理时的优势。同时提醒顺序问题,避免误解。 需要检查是否覆盖了所有常见的遍历方式,有没有遗漏,比如ListIterator可能不太常用,但如果有必要可以提到,不过可能用户更关注基础方法。不过用户的问题只是“介绍”,所以可能不需要太深入。 确保回答的语言用中文,避免术语错误,比如“迭代器”而不是“迭代器”。代码中的注释也要用中文吗?用户没有特别要求,但可能更易于理解,所以可以保留英文注释,或者简单翻译。 最后,总结一下各种方法的适用场景,帮助用户根据需求选择。比如普通for循环需要索引,增强for代码简洁,迭代器适合边遍历边删除,forEach适合函数式编程。 还要注意用户提到的系统级指令,数学表达式用$...$,但这个问题不涉及数学公式,所以可能不需要处理。但如果有代码块,需要用正确的格式,比如Java代码块标记出来,确保语法正确。 可能用户的问题比较基础,但需要详细说明,特别是异常情况和最佳实践,比如不要在遍历时用List的remove方法,而用迭代器的remove,避免ConcurrentModificationException。 检查是否有错误,比如普通for循环的条件是i < list.size(),对吗?是的,因为索引从0开始。迭代器的hasNext()和next()的使用是否正确。是的。 总结一下,回答的结构应该是先介绍遍历方法,每种方法给出示例,说明优缺点,然后注意事项,最后总结。这样用户能逐步理解,并根据自己的情况选择合适的方法。</think>在 Java遍历 `List` 有以下几种常见方法,以下从基础到进阶逐步说明: --- ### 1. **普通 for 循环** 通过索引遍历,适用于需要操作索引的场景。 ```java List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); for (int i = 0; i < list.size(); i++) { String element = list.get(i); System.out.println(element); } ``` - **优点**:可通过索引访问元素。 - **缺点**:对 `LinkedList` 性能较差(`get(i)` 时间复杂度为 $O(n)$)。 --- ### 2. **增强 for 循环(foreach)** 语法简洁,适用于不需要索引的场景。 ```java for (String element : list) { System.out.println(element); } ``` - **优点**:代码简洁,适用于所有实现 `Iterable` 接口的集合。 - **缺点**:无法直接操作索引,遍历时不能修改集合结构(否则抛出 `ConcurrentModificationException`)。 --- ### 3. **迭代器(Iterator)** 显式使用迭代器,适合需要边遍历边删除元素的场景。 ```java Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); // 安全删除当前元素 if (element.equals("B")) { iterator.remove(); } } ``` - **优点**:支持安全的元素删除操作。 - **缺点**:代码相对冗长。 --- ### 4. **Java 8+ 的 forEach 方法** 结合 Lambda 表达式,实现函数式编程风格。 ```java list.forEach(element -> System.out.println(element)); // 或使用方法引用 list.forEach(System.out::println); ``` - **优点**:代码简洁,支持并行流(`parallelStream()`)。 - **缺点**:无法修改集合外部变量(需使用 `final` 或等效 final 的局部变量)。 --- ### 5. **ListIterator** 双向遍历(仅适用于 `List`),允许向前或向后遍历及修改元素。 ```java ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) { String element = listIterator.next(); System.out.println(element); } // 反向遍历 while (listIterator.hasPrevious()) { String element = listIterator.previous(); System.out.println(element); } ``` --- ### **注意事项** - **遍历时修改集合**:除通过 `Iterator.remove()` 外,其他修改操作(如 `list.add()` 或 `list.remove()`)会触发 `ConcurrentModificationException`。 - **性能选择**:根据 `List` 实现类选择遍历方式(如 `ArrayList` 适合普通 for 循环,`LinkedList` 适合迭代器)。 - **线程安全**:多线程环境下需使用 `CopyOnWriteArrayList` 或同步机制。 --- ### **总结** | 方法 | 适用场景 | 线程安全 | |--------------------|----------------------------------|------------------| | 普通 for 循环 | 需要索引操作 | 需自行同步 | | 增强 for 循环 | 简单遍历 | 需自行同步 | | 迭代器 | 需要删除元素 | 需自行同步 | | forEach + Lambda | 函数式风格 | 依赖集合实现 | | ListIterator | 双向遍历或修改 | 需自行同步 | 根据具体需求选择合适的方法,优先考虑代码简洁性和性能。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值