用STM32自制晶体管特性曲线图示仪:从原理到校准 📅 发布时间:2026/9/19 20:25:47 👁 浏览次数: 简介这是南京邮电大学“简易晶体管特性曲线图示仪”实验文档面向电子电路、模拟电子技术等课程的本科生与电子爱好者解决晶体管输出特性曲线难以直观观测的教学实验问题同时帮助理解锯齿波与阶梯波各自的生成机制。文档不仅讲解实验原理与制作方法还细致介绍555时基电路产生锯齿波、74LS161计数器配合74LS00反相处理形成阶梯波、LM324运放完成信号放大调理等关键模块并配有各芯片内部构造与管脚排列图方便对照查阅。文档进一步说明如何将锯齿波和阶梯波接入被测三极管借助沙育图形在示波器上还原晶体管输出特性曲线对电路搭建设计、焊接调试均有实际指导价值。资源包共1个doc文件体积约2.88MB内容完整精炼。目前已有666人浏览学习适合需要系统掌握晶体管图示仪原理、芯片功能应用及实验排障思路的读者使用。1. 晶体管特性曲线图示仪先理解这条曲线再决定怎么搭示波器能看正弦波、方波可一旦想看三极管的输出特性曲线普通示波器就无能为力了。原因在于晶体管特性曲线是一条「一簇」曲线横轴是 VCE纵轴是 IC每一条曲线对应一个固定的 IB要画完整簇必须让仪器同时产生阶梯波和扫描波并把两个量同步复用显示。南邮这套「简易晶体管特性曲线图示仪」实验目标不是复刻 XJ4810 那种专业仪器而是用有限的单片机资源把「一簇输出曲线」稳定地画出来能定量读出放大区、饱和区、截止区就够了。这个实验有意思的地方在于专业图示仪动辄几千元核心是精密阶梯电流源和功率扫描电路而数字化之后DAC 负责生成阶梯波、ADC 负责同步采样整个系统可以被压缩到「单片机 运放 采样电阻」三个环节。真正的难点反而不是硬件本身而是时序同步IB 每跳一级VCE 就要完整扫一遍两者的同步一旦错位画出来的曲线簇就又乱又飘。这篇文章从曲线读法讲起一直落到代码和校准照着做就能复现一套能交实验报告的简易图示仪。2. 图示仪测什么输入/输出特性曲线的读法2.1 从 2N2222 的输出曲线看图示仪的原点以 2N2222 这类常用 NPN 管为例输出特性曲线组画在以 VCE 为横轴、IC 为纵轴的平面上每条曲线对应一个固定的 IB。当 IB 分别为 10μA、20μA、30μA……逐级增大时IC 曲线会整体上移曲线的起始段是陡峭上升的饱和区随后进入近似水平的放大区最后在 VCE 超过一定值后再次上翘对应 Early 效应。一个容易忽略的细节是饱和区的陡峭程度和放大区的水平程度直接反映器件质量。如果饱和区太陡或是放大区斜率高说明管子散热差或 β 值不稳定这时候图示仪的价值就体现出来了。相比于万用表只能测出 hFE图示仪让你一眼看出整个工作区间的性状。简易图示仪的基线校准就是围绕这条曲线展开的横轴电压怎么标定、纵轴电流怎么换算全部以输出特性曲线为参照。2.2 阶梯波与扫描波数字实现里的时序关系专业图示仪的扫描方式是「逐行扫描」基极阶梯波每升高一级集电极电压就由一条锯齿波完整扫描一次。比如阶梯波设为 10 级每级 IB 步进 10μA那么一帧完整曲线需要 10 次扫描每次扫描集电极电压从 0V 上升到最高值再回落到 0V。仪器把每行扫描的 (VCE, IC) 数据点连成一条线最终叠成一簇曲线。数字实现中这个逻辑对应两层循环外层循环是阶梯级数 s内层循环是扫描点数 p。一帧时间等于 N × M × TdTd 是每个采样点的驻留时间。这里有一个常见误区把 Td 压得太小让 DAC 快速扫完一行虽然后级有低通滤波器但采样电阻上的电压还未稳定就会导致曲线出现锯齿状抖动。所以我在课程项目里通常把 Td 放在 100~500μs 之间宁可帧率低一点也要保证每一点的数据可信。2.2.1 同步误差的量化参考阶梯波每跳变一次扫描波最好从零重新开始否则会出现「曲线平移」现象。具体表现是同一 IB 下后一条曲线比前一条向右偏。排查时可以用示波器同时看阶梯输出引脚和扫描输出引脚检查 IB 跳变沿是否与 VCE 回扫沿对齐。数字方案里常用软件触发解决扫描循环每完成一行就强制 VCE 输出为零并延时几个毫秒再开始下一行。2.3 简易图示仪的三个性能分档档次扫描电压源阶梯波分辨率适用场景入门级8-bit DAC 运放跟随8 级手动电位器课程实验看曲线轮廓进阶级12-bit DAC如 MCP492116 级软件设定能定量读放大区斜率准专业级12-bit DAC 功率放大级32 级可测功率管可测 3A 以下器件南邮的简易图示仪实验一般落在「入门级」与「进阶级」之间STM32 内置的 DAC 是 12 位的但受限于参考电压精度和运放偏置电压实际有效位数往往只有 10 位左右。做实验时没必要追求 16 级阶梯起步用 10 级就够了太多级反而让每级 IB 步进变小基极电流源的精度不足时曲线会挤在一起难以分辨。3. 硬件设计电压扫描与取样电阻怎么选3.1 最小系统的信号流向整套系统的信号流向是单片机 DAC 输出两路信号一路是阶梯波基极电压一路是集电极扫描电压基极电压经限流电阻或恒流电路变换为 IB集电极扫描电压经运放扩流后加到晶体管的 C 极取样电阻串在发射极与地之间把 IC 转换为电压再经 ADC 回读。仪器显示时横轴是 VCE纵轴是取样电阻电压换算出的 IC。这里最关键的是「共地」问题。取样电阻接地的一端如果与 DAC 地、ADC 地之间存在压差测量结果就会叠加直流偏置。实际布线时推荐单点接地把取样电阻的地端、DAC 参考地、ADC 参考地汇集到同一颗 0.1μF 瓷片电容旁边的接地铜皮上整流效果会好很多。我用洞洞板搭过一版飞线较多时 ADC 读数跳动超过 5%改成单点接地后下到 1% 以内。3.2 用 DAC 运放搭可控电压源集电极扫描电压源要求是输出内阻小、带载能力强、电压能从 0V 线性爬到设定值。最简单实用的做法是用运放搭一个同相放大器DAC 输出电压经放大后直接驱动晶体管集电极。运放选型时注意轨到轨输出普通运放比如 LM358 在接近电源轨时非线性严重会让曲线顶端被「压弯」。我一般用 MCP6002 或 OPA2333前者便宜后者温漂更小。扫描电压源的建立时间受运放驱动能力和被测管输入电容影响。三极管本身的 Ccb 很小但连接导线和插座会引入几 pF 到几十 pF 的寄生电容如果运放输出直接连到这段长引线很容易产生振铃。解决方法是运放输出端串联一个 100Ω 电阻再接到管子 C 极这个电阻和寄生电容构成低通能有效抑制高频振荡。代价是 VCE 实际值会有微小压降校准阶段用万用表测一下补偿进去即可。3.3 取样电阻、限流电阻与阶梯级数的配合取样电阻的选择直接决定电流测量上限和分辨率。设 ADC 满量程电压为 3.3V取样电阻为 Rs则最大可测电流 Imax 3.3 / Rs。如果设计目标是测 0~30mARs 取 100Ω测 0~300mARs 取 10Ω。实际实验里被测管是 9013 这类小功率管时Rs 用 50Ω 比较合适再小会因为取样电压过低在低电流段读不出细节。基极限流电阻的选取则要配合阶梯电压。设 DAC 基极电压最低为 0.6V每级步进生成 IB (V_DAC - VBE) / Rb。以 9013 为例VBE 约为 0.65V若 Rb 100kΩ每级 DAC 电压步进 1VIB 约为 10μA。阶梯级数与 IB 步进的矩阵组合决定了曲线簇的间距过密还是过松。一个很好用的起始参数是10 级阶梯IB 从 10μA 到 100μAVCE 扫描 0~5V。被测管类型取样电阻 Rs基极限流电阻 RbVCE 扫描范围小信号 NPN901350Ω100kΩ0~5V中功率 NPNTIP315Ω10kΩ0~10V小信号 PNP855050Ω100kΩ-5~0VN 沟道 MOSFET2N700010Ω门极直驱0~10V3.4 防振荡的三板斧实验中最常见的失败现象是曲线边缘出现密密麻麻的毛刺看起来像锯齿噪声叠加在一条平滑曲线上这通常是局部振荡而非电源噪声。排查时先看运放输出端是否串了 100Ω 阻尼电阻再看基极驱动回路的退耦电容是否到位。高频振荡的三板斧第一基极引脚处并联 10nF 电容到地第二取样电阻两端并联 100nF 电容做高频旁路但注意这会让 ADC 采样值变慢需要增加驻留时间第三所有运放电源脚加 100nF 10μF 双电容退耦。4. 从代码到曲线微控制器驱动与 Python 上位机4.1 微控制器的扫描核心逻辑以下代码以 STM32 HAL 库风格写出核心是把「阶梯波在外、扫描波在内」的循环框架搭起来。实际移植到 Arduino 时把 DAC 写函数替换成 analogWrite 或外部 SPI DAC 驱动即可。#define STEP_MAX 10 // 阶梯级数 #define POINT_MAX 256 // 每行扫描点数 #define VCE_STEP 20 // 每点 VCE 步进约 20mV uint16_t row[POINT_MAX]; // 当前行的采样数据 uint16_t frame[STEP_MAX][POINT_MAX]; // 完整一帧曲线数据 void scan_frame(void) { for (int s 0; s STEP_MAX; s) { // 外循环设置基极阶梯波电流 set_base_voltage(0.65f s * 0.10f); // 每级增加 IB 约 10uA delay_us(500); // 等待基极回路建立稳定 for (int p 0; p POINT_MAX; p) { // 内循环从 0V 线性扫描 VCE uint16_t dac_val p * VCE_STEP; set_collector_voltage(dac_val); // 输出到运放扫描源 delay_us(200); // 等待取样电阻电压建立 // 跳过每行的前 1/4 点避免 VCE 初始跳变尖峰 if (p POINT_MAX / 4) { row[p] read_adc(CH_CURRENT); // 读取取样电阻电压 } else { row[p] 0; } } memcpy(frame[s], row, sizeof(row)); } }代码里set_base_voltage和set_collector_voltage是两个关键封装前者输出阶梯电压后者输出扫描电压。delay_us(200)的长短直接决定曲线质量太短则运放未稳定太长则整帧时间过长STM32F103 跑 72MHz 时200μs 的延时对 256 点来说整帧约 0.6 秒刷新率可以接受。POINT_MAX / 4的跳点是工程技巧因为 VCE 从 0 跳变到第一个非零电压时Ccb 充电电流会叠加在 IC 上形成尖峰毛刺。4.2 用 Python 把数据画成一簇曲线微控制器把 frame 数组经串口发送到上位机数据格式用最简单的 CSV第一行输出阶梯级数之后每行是一组 (VCE, IC) 对。Python 端用 pySerial 接收并直接绘图import matplotlib.pyplot as plt import numpy as np import serial ser serial.Serial(COM5, 115200, timeout1) lines int(ser.readline().strip()) # 阶梯级数 colors plt.cm.viridis(np.linspace(0, 1, lines)) plt.figure(figsize(6, 4)) for s in range(lines): data np.array(ser.readline().strip().split(,), dtypefloat) vce, ic data[0::2], data[1::2] plt.plot(vce, ic, colorcolors[s], lw1.2, labelfIB{s}) plt.xlabel(VCE (V)) plt.ylabel(IC (mA)) plt.grid(alpha0.3) plt.legend() plt.tight_layout() plt.savefig(curve.png, dpi200) plt.show()这段代码把每一行阶梯数据画一条线颜色用 viridis 色带区分不同 IB。注意ic的单位换算如果取样电阻是 50Ω串口发送的 ADC 原始值换算为电压后再除以 50 得到电流安培显示时乘 1000 转为毫安。单位换算建议在单片机端完成避免上位机重复处理同时也便于直接用串口助手调试。4.3 曲线「画歪了」时先检查哪些量画出来的曲线如果与教科书形状差别很大不要立刻怀疑硬件先用三个步骤定位。第一步检查 VCE 横轴是否真的到零拉低集电极 DAC 输出用万用表测 C 极对地电压如果还有几十毫伏残留说明运放存在失调电压软件里做零点校准。第二步检查每行扫描是否从同一电压开始观察第一行与最后一行的起点横坐标是否重合不重合就是阶梯波与扫描波的同步没做好。第三步检查电流曲线在放大区是否「上翘」如果上翘严重可能不是 Early 效应而是自热效应说明驻留时间过长导致管子发热缩短delay_us到 50μs 再试。提示如果曲线整体噪声很大优先检查串口发送的波特率是否匹配以及 ADC 采样是否做了软件均值。最简单有效的滤波是连续采 8 次取中位数比均值更能抵抗毛刺干扰。5. 校准与排错让曲线稳定可复现5.1 实测 9013 输出特性的校准流程校准分三步横轴校准、纵轴校准、零点校准。横轴校准用万用表直流电压档并联在 C 极与 E 极之间让单片机依次输出 1V、2V、3V记录实际值与设定值的误差如果误差呈线性直接在 Python 里做vce_real vce_dac * k b修正。纵轴校准先固定基极电流断开集电极回路把取样电阻换成一个可调精密电阻箱在已知电流下记录 ADC 读数标定出 ADC 每码对应的电流值。零点校准最简单但最容易被忽略让 VCE 输出 0V 时采集一次基线把该值作为后续所有采样点的减数。我用 9013 做完整校准的实际参数是VCE 设定 2.5V万用表实测 2.53V比例系数 k 为 1.012取样电阻标称 50Ω实测 49.8Ω按 49.8 代入换算。这些数值看似微小但积累起来会让放大区斜率读数偏差超过 10%直接影响实验报告里 β 值的计算结果。5.2 曲线漂移、锯齿振荡、阶梯不齐的排查表现象直接原因排查顺序曲线整体右移左端起点不为零VCE 实际值比设定值高运放失调或 DAC 参考电压偏高用万能表测 C 极电压先确认硬件实际值曲线边缘细密毛刺高频自激振荡运放带容性负载振铃在运放输出串 100Ω基极并 10nF同一层曲线来回「漂」每行扫描首点不同步或基极电容未放电每行结束后强制 VCE 归零并延时 2ms阶梯波明显重影基极 DAC 电压建立慢或退耦电容不足基极回路并 10μF 100nF延时加至 1ms5.3 电流读数归一化的关键一步实验报告里经常要求把多条曲线按相同比例尺对比但不同 IB 下的 IC 数量级不同直接画出来低阶梯曲线会被压扁。解决办法是归一化每一条曲线的 IC 值除以该条曲线在最大 VCE 处的 IC 值得到 0~1 区间的相对值再绘图。这样放大区的差别一目了然饱和区的压降大小也能横向比较。归一化还可以用来估算直流放大倍数 hFE取每条曲线放大区中段的 IC除以对应的 IB得到一组 hFE再取平均。这个步骤手动算很繁琐放到 Python 里两三行代码就能批量完成。hfe_list [] for s in range(lines): idx len(ic) // 2 # 放大区中段 hfe_list.append(ic[idx] / (ib_step * (s 1))) print(fAverage hFE {np.mean(hfe_list):.1f})6. 进阶改动扩展测 MOSFET、LED 并把曲线直接写进报告把同一个框架稍加改动就能测量不止三极管一类器件。测 N 沟道增强型 MOSFET 时把基极阶梯电流换成栅极阶梯电压阶梯范围放到 0~4V取样电阻的位置不变但注意 MOSFET 栅极输入电容远大于三极管阶梯电压每跳一档后要额外多等几毫秒。测 LED 时更简单把 LED 串取样电阻接到扫描电压源DAC 从 0V 扫到 3V画出的伏安特性曲线能直观看出开启电压、正向电阻的差异此时阶梯波可以关闭只保留单条扫描线。测稳压管则把管子反接VCE 扫描 0 到 -12V击穿段的陡峭程度清晰可见。南邮这份实验要求提交 doc 文档曲线图自然要嵌入其中。最简单的流程是Python 画完图后plt.savefig存为 PNG再插入 Word。每次手动插入很繁琐我习惯用 python-docx 在脚本里自动完成图片插入和参数表格生成跑一次就能产出一份完整的实验报告底稿from docx import Document doc Document() doc.add_heading(晶体管特性曲线测量结果, level1) doc.add_picture(curve.png, width6144000) # 约 16cm 宽 doc.add_heading(测量参数, level2) table doc.add_table(rows4, cols2) params [(取样电阻, 49.8Ω), (IB 步进, 10μA), (VCE 范围, 0~5V), (阶梯级数, 10)] for i, (k, v) in enumerate(params): table.cell(i, 0).text k table.cell(i, 1).text v doc.save(report_draft.docx)到这里你的简易图示仪已经能覆盖三极管、MOSFET、LED 和稳压管四类器件曲线自动画好、数据自动成表交实验报告时真正花时间的只是写结论。本文还有配套的精品资源点击获取