一、项目介绍
本项目设计了一款基于“带屏的十二指神探”的元器件特性测试仪,能够测量电阻、电容、电感、LED和三极管的参数。通过搭建测量电路,结合ADC和SPI接口,实时读取元器件数据并在LCD屏幕上显示测量值及元器件图标。系统将测量值与元器件的标称值进行对比,验证其准确性。该测试仪操作简单,适用于电工电子技术教学、电子实验等场景,能够快速检测元器件性能,提升工作效率。
二、使用硬件
- 带屏的十二指神探(主控模块,集成显示屏)。
- 面包板(用于搭建测量电路)。元器件:电阻、电容、电感、LED、三极管(作为被测对象)。
- 基本电路元件:如已知电阻、参考电压源等(用于测量电路设计)。
三、项目框图
四、软件流程
1.电阻测量
(1)原理
用于计算未知电阻的值。它基于一个已知电阻(R_KNOWN)和参考电压(V_REF),
通过测量电压分压电路中的电压值(voltage),利用欧姆定律和分压公式计算出未知电阻的值。
(2)实现
#resistance
def calres(voltage, known_resistance, reference_voltage):
if voltage == 0:
return float('inf') #too big
return known_resistance * (reference_voltage - voltage) / voltage
def Resistance_Check():
vol=read_adc_voltage(adc)
resval = calres(vol, R_KNOWN, V_REF)
display.text(font1, "Value="+str(resval) , 10, 120)
2.电容测量
(1)原理
这段代码通过RC电路的充电过程来测量电容值。以下是简要原理和步骤:
- RC充电公式:电容电压 V(t)=Vref(1−e−tRC)。
- 当电容电压达到 0.632×Vref 时,所用时间 t=RC,即时间常数 τ。通过测量这个时间,可以计算电容值 C=t/R。
(2)实现
#Capcitance
CHARGE_PIN = Pin(16, Pin.OUT) # 充电控制引脚
R_KNOWN_small = 1000;
def calcap(vol,time_diff):
if vol == 0:
return float('inf')
return time_diff/(R_KNOWN_small*vol)
# 电容测量
def Cap_Check():
# 放电电容
CHARGE_PIN.off() # 设置引脚为低电平
time.sleep_ms(100) # 等待电容放电完成
# 开始充电
CHARGE_PIN.on() # 设置引脚为高电平
start_time = time.ticks_us() # 使用微秒计时
# 等待电容电压达到阈值
threshold_voltage = V_REF * 0.632 # 63.2% of V_REF (RC时间常数)
while True:
vol = read_adc_voltage(adc)
if vol >= threshold_voltage:
break
# 计算时间差
time_diff = time.ticks_diff(time.ticks_us(), start_time) / 1e6 # 转换为秒
# 根据时间差选择合适的电阻值
if time_diff < 0.01: # 如果时间差小于10ms,使用大电阻(20kΩ)
r_known = R_KNOWN_LARGE
else: # 否则使用小电阻(1kΩ)
r_known = R_KNOWN_SMALL
# 计算电容值
rescap = calcap(threshold_voltage, time_diff, r_known)
# 显示结果
display.fill(st7789.BLACK)
display.text(font1, "Capacitance Test", 10, 10, st7789.WHITE)
display.text(font1, f"Value: {rescap * 1e6:.2f} uF", 10, 30, st7789.WHITE)
display.text(font1, f"R_used: {r_known} Ohm", 10, 50, st7789.WHITE)
3.电感测量
(1)原理
通过RL电路充电时间常数 τ=LR,测量电感 L。
步骤:
- 充电并记录时间。
- 监测电流直到达到阈值。
- 计算 L=t×R。
- 显示结果。
(2)实现
# 电感
# 硬件配置
charge_pin = Pin(27, Pin.OUT) # 使用 GP27 控制充电
R = 1000 # 已知电阻值,单位:欧姆
# 变量初始化
voltage_threshold = 30000 # ADC 阈值(3.3V 对应 65535)
tau = 0 # 时间常数
inductance = 0 # 电感值
# 充电函数
def charge_circuit():
charge_pin.value(1) # 开始充电
start_time = time.ticks_us() # 记录开始时间
timeout = time.ticks_add(start_time, 1000000) # 设置超时时间为 1 秒
while adc.read_u16() < voltage_threshold:
if time.ticks_diff(time.ticks_us(), timeout) >= 0: # 检查是否超时
charge_pin.value(0) # 停止充电
print("Timeout! Check circuit or threshold.")
display.text(font1, "Timeout! Check circuit" , 10, 150)
return 0 # 返回 0 表示超时
end_time = time.ticks_us() # 记录结束时间
charge_pin.value(0) # 停止充电
return time.ticks_diff(end_time, start_time) # 返回充电时间
# 计算电感值
def calculate_inductance(charge_time):
global tau, inductance
tau = charge_time * 1e-6 # 将时间转换为秒
inductance = tau * R # 计算电感值
return inductance
def Check_inductance():
time = charge_circuit()
value = calculate_inductance(time)
display.text(font1, "Value="+str(value) , 10, 120)
4.LED测量
(1)原理
LED_polarity
函数:- 根据电阻值判断 LED 的极性是否正确。
- 如果电阻值大于 20,返回
0
(表示极性错误);否则返回1
(表示极性正确)。
calLED
函数:- 计算 LED 的电压和电流。
- 使用欧姆定律计算电流,并直接返回测量到的电压作为 LED 的电压。
LED_Check
函数:- 读取 ADC 电压值。
- 调用
calres
函数计算电阻值,并通过LED_polarity
判断 LED 的极性。 - 调用
calLED
函数计算 LED 的电压和电流。 - 在屏幕上显示 LED 的电压、电流和极性。
(2)实现
# led
def LED_polarity(res):
if res > 20:
return 0
else:
return 1
def calLED(voltage, known_resistance):
current = (V_REF - voltage) / known_resistance
led_voltage = voltage
return led_voltage, current
def LED_Check():
vol=read_adc_voltage(adc)
polarity = LED_polarity(calres(vol, R_KNOWN, V_REF))
LEDvol, current = calLED(vol, R_KNOWN)
display.text(font1, "Voltage="+str(LEDvol) , 10, 120)
display.text(font1, "current="+str(current) , 10, 140)
display.text(font1, "Polarity="+str(polarity) , 10, 160)
5.三极管测量
(1)原理
测量三极管(晶体管)的工作状态,通过控制基极(Base)的电压,读取集电极(Collector)的状态来判断三极管是否导通。
- GPIO 设置:
base_pin
设置为输出模式,用于控制三极管的基极。collecter_pin
设置为输入模式,用于读取三极管的集电极状态。
measure_transistor
函数:- 打开基极(设置为高电平),等待一段时间使电路稳定,然后读取集电极的状态。
- 关闭基极(设置为低电平),并返回集电极的状态。
Transistor_Check
函数:- 调用
measure_transistor
函数获取集电极的状态。 - 在屏幕上显示集电极的状态。
- 调用
(2)实现
#Transistor
# 设置 GPIO 引脚
base_pin = Pin(20, Pin.OUT)
collecter_pin = Pin(21, Pin.IN)
# 初始化
base_pin.value(0)
# 测量三极管
def measure_transistor():
base_pin.value(1) # 打开基极
time.sleep(0.1) # 等待稳定
collector_value = collecter_pin.value() # 读取集电极状态
base_pin.value(0) # 关闭基极
return collector_value
def Transistor_Check():
value = measure_transistor()
display.text(font1, "Value="+str(value) , 10, 120)
6.UI显示界面实现
st7789_res = 0 # 复位引脚
st7789_dc = 1 # 数据/命令选择引脚
disp_width = 240 # 显示屏宽度
disp_height = 240 # 显示屏高度
CENTER_Y = int(disp_width/2) # 显示屏垂直中心点
CENTER_X = int(disp_height/2) # 显示屏水平中心点
spi_sck = Pin(2) # SPI 时钟引脚
spi_tx = Pin(3) # SPI 数据输出引脚
spi0 = SPI(0, baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
def Set_Element():
display.fill(st7789.BLACK)
if Choose==0:
display.text(font1, "resistance" , 10, 70)
f_image = open(res, 'rb')
elif Choose==1:
display.text(font1, "capcitance" , 10, 70)
f_image = open(cap, 'rb')
elif Choose==2:
display.text(font1, "LED" , 10, 70)
f_image = open(led, 'rb')
elif Choose==3:
display.text(font1, "inductance" , 10, 70)
f_image = open(ind, 'rb')
else:
display.text(font1, "transistor" , 10, 70)
f_image = open(tra, 'rb')
for column in range(1,50):
buf=f_image.read(100)
display.blit_buffer(buf, 1, column, 50, 1)
六、功能展示图及说明
二极管导通返回1 截止返回0
电阻测量,更多细节见视频
电容测量
电感测量
七、心得体会
在完成“元器件特性测试仪”项目的过程中,我深刻体会到理论与实践结合的重要性。通过设计电路和编写代码,我不仅巩固了电阻、电容、电感等元器件的工作原理,还掌握了 ADC、SPI 等接口的使用技巧。调试过程中,我学会了如何排查硬件和软件问题,并通过优化算法提高了测量精度。模块化设计让开发更高效,也便于未来扩展功能。此外,用户体验的优化让我意识到界面友好和操作简单的重要性。最终,项目成功实现,让我充满成就感,也激发了我对更多技术探索的兴趣。这次经历让我明白,耐心、细致和不断学习是完成复杂项目的关键。