尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

开尔文四线法电阻测量:STC89C52+恒流源+TLC1543仿真设计

开尔文四线法电阻测量:STC89C52+恒流源+TLC1543仿真设计 简介这是一份基于51单片机的电阻测量仿真资料包采用开尔文四线法电路设计面向单片机毕设或课设学生也适合电子爱好者学习低电阻测量。包内共78个文件以PDF、DOC/DOCX文档、C/H源码、DSN仿真、PNG/BMP图片和原理图文件为主压缩包大小约30.32MB并附带常用器件手册和元件清单文档类涵盖设计方案、芯片手册和使用说明源码与仿真工程可直接用于验证目录结构清晰便于按模块查找。内含完整C语言程序、仿真工程、原理图及流程图按键可调节恒流源电流实测误差约5%支持对电机内阻等对象测量参数修改需停止仿真或改用电位器。配套有制作步骤与问题解决思路、毕设答辩技巧、焊接方法等辅助文档覆盖从搭建、调试到答辩的完整流程。目前已有157人学习这是一份毕业设计或课程设计的实用参考。1. 开尔文电路不是悬空概念是拿小电阻没辙时的工程答案做电机控制或者电源设计的同行应该都遇到过这个场景数字万用表显示绕组电阻 0.5Ω换一块表可能显示 0.8Ω再换一个量程又不一样。不是表坏了是表笔线本身的铜阻和表笔与端子的接触电阻被一并算进去了。冰箱压缩机启动绕组的阻值才两三欧这点误差足以让你判断错故障。开尔文四线法就是为这种工况设计的把电流注入回路和电压采样回路彻底分开电压表只看到被测电阻上的真实压降线阻接触电阻不再进测量结果。这个基于 STC89C52 的电阻测量仿真项目完整落了一套「恒流源 TLC1543 ADC LCD1602 显示」的测量链路仿真文件、原理图、程序、流程图、器件清单全包适合毕业设计选「智能仪表」方向或者想把模电数电串起来的人。下文我会把四线法的原理、恒流源档位切换、SPI 采集时序、Proteus 调试里容易卡住的点一次说清。2. 四线测量原理与 LM358 恒流源选型逻辑2.1 开尔文四线法的误差消除机制开尔文电路的核心只有一句话让电流路径和电压采样路径在物理上分开。电流源驱动被测电阻 R_x产生压降 V_x采样端的内阻极高几乎不分走电流。此时引线电阻 R_L1、R_L2 上的压降因为不经过采样端完全被排除在测量结果之外最终 V_sample I × R_x相当干净。用公式看更清楚。两线测法测得的值是R_display (I × R_x I × R_L1 I × R_L2) / I R_x R_L1 R_L2四线测法里电压采样回路的高输入阻抗使采样回路电流趋近于零于是R_display I × R_x / I R_x这就是开尔文电路能测毫欧级阻值的原因。仿真原理图里四个端子分别对应电流线的进出和电压线的采样明白这一点再看原理图里的四根走线就不会觉得那是冗余的连线了。2.2 LM358 恒流源与按键档位切换项目摘要里明确提到「按键用来调整恒流源电流电流不同对应误差也不同」。51 单片机本身不带 DAC要连续调整恒流源输出常见做法是用数字电位器或者 PWM 加 RC 滤波产生参考电压。这里先说一个面试时经常问到的点恒流源的电流受参考电压 V_ref 限制其稳定度直接决定测量精度。LM358 在这个电路里的作用是构成电压跟随和负反馈基准电压从同相端输入运放输出驱动 NPN 管发射极通过采样电阻 R_set 接地。当电流增大导致 R_set 上压降超过 V_ref 时运放输出电压回落三极管基极电流减小形成负反馈。按键调整电流时比较直接的做法是把反馈采样电阻做成网络形式用模拟开关或继电器切换// 档位参数表按一次按键切换一档 // R_set 为运放反馈采样电阻I V_ref / R_set #define CHANNEL_NUM 4 // 档位电阻值单位欧姆 code unsigned short R_set_table[CHANNEL_NUM] { 100, // 档位0: V_ref1.0V 时 I10mA 50, // 档位1: I20mA 20, // 档位2: I50mA 10 // 档位3: I100mA }; unsigned char current_channel 0; void key_scan(void) { if (KEY_PRESSED) { delay_ms(20); // 消抖 if (KEY_PRESSED) { current_channel (current_channel 1) % CHANNEL_NUM; set_current_channel(current_channel); while(KEY_PRESSED); // 等待释放避免连按 } } }这里有几个参数要特别留意一是 V_ref 的基准源不能直接用 7805 的输出7805 本身的温漂和压降波动会直接折算成电流误差常见改进是加 TL431 稳压到 2.5V 再分压二是 R_set 要选温漂系数低的电阻金属膜或者精密线绕比碳膜好一个量级三是 LM358 输出摆幅离电源轨还有约 1.5V 压降供电电压要留出余量。2.3 为什么选 TLC1543 而不是 51 内部 ADCSTC89C52 内部没有 ADC 模块外部扩展是必须的。本项目用的是 TLC1543一颗 10 位逐次逼近型 ADCSPI 兼容串行接口最大采样率约 30ksps对小电阻测量的慢变信号完全够用。选它而不是 ADC0832 这类 8 位芯片关键在于分辨率5% 的测量误差前提下8 位 ADC 可分辨满量程的 1/256约 0.4%看似够实际运放噪声和基准波动叠下来最后一位数值跳得很厉害。TLC1543 有 11 路模拟输入和 3 个地址选择位通过 SPI 协议控制CS 拉低启动转换CLK 提供移位时钟数据先送地址再读结果。后面第 3 章会给出完整读取代码。3. 主程序框架按键扫描、TLC1543 采集与 LCD1602 显示的配合3.1 程序模块划分从烧录文件列表可以看到整个软件分成 main.c、TLC1543.c、lcd1602.c 三个核心模块各模块的 .OBJ 文件一一对应。这种分法在课设里算清爽的main 负责流程调度TLC1543 负责数据采集lcd1602 负责显示。如果你要在裸机上扩展功能比如加串口打印或存储标定数据按同样的方式新增一个外设模块即可。主循环的调度顺序值得说一下。这里不建议用 delay 把每个环节串死常见做法是设置一个 100ms 的系统时基每个周期做一次按键扫描、一次 ADC 采样、一次显示刷新三者之间独立互不阻塞void main(void) { unsigned int adc_value; unsigned int resistance_x10; // 电阻值 x10避免浮点数 unsigned char dis_buf[16]; lcd1602_init(); tlc1543_init(); lcd1602_show_string(0, 0, R ); while (1) { key_scan(); // 按键切换恒流源档位 adc_value tlc1543_read_single(0); // 读取通道0即电压采样端 // 换算关系V adc_value * V_ref / 1024 // R V / I_set其中 I_set 由档位决定 resistance_x10 calc_resistance(adc_value, current_channel); dis_buf[0] \0; sprintf(dis_buf, R%d.%d Ohm, resistance_x10 / 10, resistance_x10 % 10); lcd1602_show_string(3, 0, dis_buf); } }calc_resistance 函数里的计算顺序是个易错点。51 单片机是 8 位机int 乘除耗时且容易溢出。V_ref 按 2.048V 计算adc_value 最大值 1023两者乘积约 2100用 unsigned long 可以安全承载。如果先除 1024 再乘电流系数会引入较大的截断误差应该先乘后除unsigned int calc_resistance(unsigned int adc_value, unsigned char ch) { unsigned long voltage_x10000; // 电压的万分之一伏 unsigned long resistance; // V adc_value * 2.048 / 1024转成整数V_x10000 adc_value * 20000 / 1024 voltage_x10000 (unsigned long)adc_value * 20000UL / 1024UL; // R V / I。I 单位安培0.05A 用 5/100 表示 // R_x100 voltage_x10000 * 100 / (I_A * 10000) resistance voltage_x10000 * 100UL / current_to_raw(ch) ; return (unsigned int)resistance; // 返回阻值x100 }3.2 TLC1543 SPI 读取与时序TLC1543 的时序可以分为两步写地址、读数据。CS 拉低后CLK 第一个上升沿之前要把 4 位通道地址高 3 位有效依次移入 DATA IN 引脚第 10 个时钟沿输出前一次转换结果的高位。具体实现如下// 从 TLC1543 读取单通道转换结果 // channel: 0-10 对应 AIN0-AIN10 unsigned int tlc1543_read_single(unsigned char channel) { unsigned char i; unsigned int result 0; CS 0; // 片选拉低启动一次转换周期 // 发送 4 位地址bit3-bit0TLC1543 只使用高3位 for(i 0; i 4; i) { DATA_IN (channel 0x08) ? 1 : 0; // 从最高位开始 channel 1; CLK 0; _nop_(); CLK 1; // 上升沿锁存地址 _nop_(); } // 第4个时钟沿之后的时钟输出前一次转换结果 for(i 0; i 10; i) { CLK 0; _nop_(); CLK 1; // 上升沿后数据移出 _nop_(); result 1; if(DATA_OUT) { result | 0x01; } } CS 1; // 片选拉高结束本次访问 return result; }两个细节值得强调。第一TLC1543 的 DATA OUT 数据是在 CLK 的下降沿之后变化的所以读数据应该在上升沿之后读取代码里先拉低再拉高、读操作放在拉高之后能保证数据稳定第二EOC 引脚如果不接单片机就需要靠延时保证上一次转换完成本项目仿真中直接读取不会有问题但做硬件时建议把 EOC 接到外部中断引脚上转换完成再触发读取保证每次读到的都是最新的转换结果。4. Proteus 仿真调试按键调流与 5% 误差的来源排查4.1 仿真工程与器件清单核对仿真文件是仿真.DSN用 Proteus 打开后可以看到完整的电路。原理图 PDF 在__Previews Sheet1.PDF目录里可以查阅。这里先把器件清单列出来方便对照器件型号/规格作用主控STC89C52流程调度与数据计算基准TL431或L358内部基准提供稳定参考电压恒流源LM358 NPN三极管压控恒流ADCTLC1543电压采样并数字化显示LCD1602显示电阻值反馈电阻精密电阻网络 10/20/50/100Ω决定恒定电流大小被测电阻电位器 或 直接改元件参数模拟待测电阻Proteus 仿真和实物的一个重要差别仿真里的运放、基准源都是理想模型不会出现温漂和噪声但仍然要检查电路的偏置是否合适。常见的坑是把 LM358 的电源电压设为 5V而采样电阻上压降加三极管 V_CE 饱和压降后运放输出没有足够余量电流无法稳定。此时仿真表现是切换按键后 LCD 数值长期跳动或溢出但硬件的表现可能更隐蔽。4.2 按键调电流与「停止仿真后才能改电机内阻」的原因项目的器件清单里有可调电阻焊接方法、贴片电阻焊接方法等文件说明实体方案里会用可调电阻做被测对象。而说明文档特别提示电机内阻修改需要每次停止仿真后才能修改也可以换成电位器。这背后的原因是 Proteus 的交互式仿真机制。仿真运行中直接编辑元件参数如电阻阻值SPICE 求解器的瞬态状态不会自动重新收敛会导致显示结果异常跳动甚至直接出现仿真发散。换成电位器后在仿真界面转动电位器Proteus 会在下一次迭代中按新参数计算这个过程中 ADC 采样的读数可能暂时不是真实值。对应到实际调试中的教训就是不管仿真还是实物换挡后都要等电流建立稳定再读数不要按键一按就开始记录数据。4.3 误差 5% 主要从哪里来摘要里写得实在「按键是用来调整恒流源电流的电流不同对应误差也不同。误差不确定无法估计。大致在 5% 左右」。对于课设级别5% 属于可以接受的量级但要知道这个误差的构成误差源典型影响消除思路恒流源电流漂移2%-3%采样电阻改 0.1% 低温漂基准换 TL431TLC1543 量化误差0.1%改用差分采样或更高位数 ADC电压采样端接触电阻0.5%选中合适采样点KELVIN 四端结构51 整数运算截断0.5%-1%先乘后除用 unsigned long排除软件截断误差后大头在恒流源。用万用表实测 R_set 两端电压再对比 ADC 读到的电压就能判断误差出现在电流环还是 ADC 链路。5. 用分段标定把误差从 5% 压到 1% 的现场方法器件清单里的元件本身精度有限单纯靠改硬件成本高更实用的办法是软件标定。先准备几个标准电阻1Ω、2Ω、5Ω、10Ω、20Ω依次接入测量端记录每个标准电阻对应的 ADC 原码值。标定数据出来后画一条「ADC 值—实际电阻」曲线你会发现它不是绝对的线性关系原因是恒流源并非理想电流源在小阻值段电流被线路压降拖低。此时用一次函数拟合得到 k 和 b 后直接把换算公式替换为// 标定后的换算R_cal k * adc_value b // 假设在 10mA 档位标定得到 k0.0312, b0.014单位欧姆 unsigned int calc_resistance_calibrated(unsigned int adc_value) { unsigned long tmp (unsigned long)adc_value * 312UL 14UL; return (unsigned int)(tmp / 1000UL); // 返回 x1000 的阻值 }标定完一个档位再切换另一个电流档重复一次。这样每个档位都有独立 k 和 b显示结果就换成查表选系数的方式。做法很简单在按键切换 current_channel 时同时切换对应的 k_b 数组下标即可。这步做完误差大概能从 5% 压到 1% 附近。剩下的偏差主要来自 R_set 电阻的温漂和基准源自身的电压波动属于硬件底子软件救不回来的部分就交给仪表选型时考虑。想要进一步验证把同一个标准电阻连续测十次观察末位数字的波动范围记录出现的最大值和最小值之间的跨度这就是整机的重复性指标。本文还有配套的精品资源点击获取
返回列表