STM32单片机IO端口
01 STM32IO端口
一、前言
这个STM32单片机测试电路板, 在前两天进行了输出IO口的冒烟测试。 在对地和对电源短路的情况下, 它的输出最大电流大约为 40mA。 之后为了更好的利用它输出信号, 下面对它的IO输出端口特性进行测试。 查看一下具体它输出端口对外的阻抗特性。 下面准备利用一个可编程的电阻箱, QR10, 来对单片机IO口输出电流电压进行测试。 来查看输出特性是否与一个线性电阻等同。 在什么电流范围内可以近似为一个线性电阻。
▲ 图1.1.1 测试STM32单片机电路
二、测量结果
先通过程序, 将单片机的PB7端口设置为输出高电平。 测量该端口, 可以看到它的电压为 3.3V 左右。 下面将QR10电阻箱连接在 PB7端口和地线。 分别测量不同电阻下输出端口的电压。
通过编程, 改变QR10的电阻从 50欧姆变化到5000欧姆, 测量每个阻值下电阻箱的电压, 实际上也是单片机IO口输出电压。 可以看到 在电阻变化到 1kΩ时, 输出电压已经达到了3.2V。 下面重新测量 QR10 从 20欧姆变化到 1000欧姆对应的输出电压。 随着电阻增加, 输出电压升高。 使用电压除以电阻, 可以得到输出电压与电流之间的关系曲线。 在 输出电流 30mA 之前, 输出电压近似线性下降, 由这两个电压对应的变化电流可以计算出 IO 端口近似输出电阻为 22.2欧姆。 这里绘制了不同输出电流下对应的输出等效串联电阻。 在30mA 之前, 电阻在 25欧姆左右。 当输出电流超过40mA, 输出电阻变急剧上升了。
▲ 图1.2.1 负载电阻从50变化到5k对应的输出端口电压
rdim=[50.0000,100.0000,150.0000,200.0000,250.0000,300.0000,350.0000,400.0000,450.0000,500.0000,550.0000,600.0000,650.0000,700.0000,750.0000,800.0000,850.0000,900.0000,950.0000,1000.0000,1050.0000,1100.0000,1150.0000,1200.0000,1250.0000,1300.0000,1350.0000,1400.0000,1450.0000,1500.0000,1550.0000,1600.0000,1650.0000,1700.0000,1750.0000,1800.0000,1850.0000,1900.0000,1950.0000,2000.0000,2050.0000,2100.0000,2150.0000,2200.0000,2250.0000,2300.0000,2350.0000,2400.0000,2450.0000,2500.0000,2550.0000,2600.0000,2650.0000,2700.0000,2750.0000,2800.0000,2850.0000,2900.0000,2950.0000,3000.0000,3050.0000,3100.0000,3150.0000,3200.0000,3250.0000,3300.0000,3350.0000,3400.0000,3450.0000,3500.0000,3550.0000,3600.0000,3650.0000,3700.0000,3750.0000,3800.0000,3850.0000,3900.0000,3950.0000,4000.0000,4050.0000,4100.0000,4150.0000,4200.0000,4250.0000,4300.0000,4350.0000,4400.0000,4450.0000,4500.0000,4550.0000,4600.0000,4650.0000,4700.0000,4750.0000,4800.0000,4850.0000,4900.0000,4950.0000,5000.0000]
vdim=[2.0411,2.6215,2.8275,2.9327,2.9968,3.0397,3.0705,3.0938,3.1121,3.1269,3.1392,3.1495,3.1582,3.1656,3.1721,3.1773,3.1817,3.1862,3.1903,3.1943,3.1976,3.2005,3.2034,3.2057,3.2077,3.2090,3.2110,3.2123,3.2141,3.2159,3.2159,3.2185,3.2200,3.2212,3.2222,3.2232,3.2240,3.2251,3.2261,3.2270,3.2282,3.2307,3.2316,3.2324,3.2331,3.2335,3.2339,3.2344,3.2350,3.2358,3.2361,3.2352,3.2356,3.2364,3.2368,3.2372,3.2374,3.2376,3.2381,3.2385,3.2389,3.2395,3.2402,3.2407,3.2411,3.2415,3.2417,3.2418,3.2419,3.2422,3.2427,3.2430,3.2436,3.2441,3.2445,3.2448,3.2450,3.2450,3.2449,3.2442,3.2443,3.2446,3.2449,3.2456,3.2460,3.2460,3.2460,3.2460,3.2461,3.2465,3.2468,3.2472,3.2477,3.2478,3.2481,3.2482,3.2481,3.2480,3.2481,3.2483]
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2024-01-31
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32 import *
import serial
from _ast import Or
from serial.serialutil import SerialException
#------------------------------------------------------------
qr10 = serial.Serial()
qr10.baudrate = 115200
qr10.timeout = 0.05
try:
qr10.port = 'COM5'
except:
printf('Set qr10 port COM5 error. ')
try:
qr10.open()
except serial.serialutil.SerialException:
printf('Open qr10 port COM5 error.')
else:
printf('Open qr10 port COM5 Ok.')
#------------------------------------------------------------
rdim = linspace(50, 5000, 100)
vdim = []
for r in rdim:
qr10.write(b'AT+USER.SP=%5.1f\n'%r)
time.sleep(2)
meter = meterval()
v = meter[0]
printff(r, v)
vdim.append(v)
tspsave('qr10', rdim=rdim, vdim=vdim)
plt.plot(rdim, vdim, lw=3)
plt.xlabel("Resistance(Omega)")
plt.ylabel("Voltage(V)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
▲ 图1.2.2 输出电阻从20欧姆变化到1000欧姆对应的输出电压
rdim=[20.0000,29.8990,39.7980,49.6970,59.5960,69.4949,79.3939,89.2929,99.1919,109.0909,118.9899,128.8889,138.7879,148.6869,158.5859,168.4848,178.3838,188.2828,198.1818,208.0808,217.9798,227.8788,237.7778,247.6768,257.5758,267.4747,277.3737,287.2727,297.1717,307.0707,316.9697,326.8687,336.7677,346.6667,356.5657,366.4646,376.3636,386.2626,396.1616,406.0606,415.9596,425.8586,435.7576,445.6566,455.5556,465.4545,475.3535,485.2525,495.1515,505.0505,514.9495,524.8485,534.7475,544.6465,554.5455,564.4444,574.3434,584.2424,594.1414,604.0404,613.9394,623.8384,633.7374,643.6364,653.5354,663.4343,673.3333,683.2323,693.1313,703.0303,712.9293,722.8283,732.7273,742.6263,752.5253,762.4242,772.3232,782.2222,792.1212,802.0202,811.9192,821.8182,831.7172,841.6162,851.5152,861.4141,871.3131,881.2121,891.1111,901.0101,910.9091,920.8081,930.7071,940.6061,950.5051,960.4040,970.3030,980.2020,990.1010,1000.0000]
vdim=[0.9786,1.4152,1.7712,2.0322,2.2196,2.3576,2.4643,2.5482,2.6164,2.6727,2.7201,2.7603,2.7949,2.8249,2.8513,2.8744,2.8950,2.9137,2.9306,2.9461,2.9605,2.9736,2.9851,2.9951,3.0052,3.0142,3.0227,3.0306,3.0381,3.0452,3.0520,3.0584,3.0646,3.0703,3.0755,3.0804,3.0850,3.0893,3.0935,3.0974,3.1013,3.1052,3.1090,3.1126,3.1157,3.1190,3.1214,3.1245,3.1270,3.1297,3.1325,3.1353,3.1372,3.1400,3.1411,3.1433,3.1448,3.1467,3.1486,3.1506,3.1524,3.1546,3.1563,3.1580,3.1594,3.1610,3.1623,3.1642,3.1648,3.1664,3.1676,3.1692,3.1708,3.1722,3.1733,3.1745,3.1755,3.1768,3.1774,3.1783,3.1793,3.1803,3.1806,3.1818,3.1828,3.1840,3.1849,3.1854,3.1861,3.1869,3.1877,3.1891,3.1895,3.1906,3.1916,3.1923,3.1926,3.1937,3.1939,3.1946]
▲ 图1.2.3 输出电流与输出电压
▲ 图1.2.4 不同输出电流对应的输出电阻
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2024-01-31
#
# Note:
#============================================================
from headm import *
rdim, vdim = tspload('qr100', 'rdim', 'vdim')
idim = [v/r*1e3 for v,r in zip(vdim, rdim)]
rrdim = [(vdim[-1]-v)/(i-idim[-1])*1e3 for v,i in zip(vdim, idim) if v != vdim[-1]]
printf(vdim, idim)
plt.plot(idim[:-1], rrdim, lw=3)
plt.xlabel("Current(mA)")
plt.ylabel("Resistance(Omega)")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
下面测试一下单片机输出低电平对应的内阻。 将PB7置为低电平, QR10连接工作电源 3.3V 和PB7, 测试不同电阻下, 对应的电阻箱上的电压。 可以看到与前面测量高电平数据曲线很接近。 绘制在一起, 两个测试结果基本重合。 这也说明 STM32 IO 端口 在高电平和低电平下, 对应的内阻特性也基本一致。
▲ 图1.2.5 输出低电平对应的负载电压曲线
rdim=[20.0000,29.8990,39.7980,49.6970,59.5960,69.4949,79.3939,89.2929,99.1919,109.0909,118.9899,128.8889,138.7879,148.6869,158.5859,168.4848,178.3838,188.2828,198.1818,208.0808,217.9798,227.8788,237.7778,247.6768,257.5758,267.4747,277.3737,287.2727,297.1717,307.0707,316.9697,326.8687,336.7677,346.6667,356.5657,366.4646,376.3636,386.2626,396.1616,406.0606,415.9596,425.8586,435.7576,445.6566,455.5556,465.4545,475.3535,485.2525,495.1515,505.0505,514.9495,524.8485,534.7475,544.6465,554.5455,564.4444,574.3434,584.2424,594.1414,604.0404,613.9394,623.8384,633.7374,643.6364,653.5354,663.4343,673.3333,683.2323,693.1313,703.0303,712.9293,722.8283,732.7273,742.6263,752.5253,762.4242,772.3232,782.2222,792.1212,802.0202,811.9192,821.8182,831.7172,841.6162,851.5152,861.4141,871.3131,881.2121,891.1111,901.0101,910.9091,920.8081,930.7071,940.6061,950.5051,960.4040,970.3030,980.2020,990.1010,1000.0000]
vdim=[0.8673,1.2869,1.6685,1.9565,2.1558,2.2996,2.4102,2.4972,2.5678,2.6267,2.6761,2.7185,2.7550,2.7869,2.8149,2.8394,2.8616,2.8822,2.9001,2.9168,2.9319,2.9448,2.9579,2.9697,2.9807,2.9907,3.0005,3.0088,3.0169,3.0248,3.0321,3.0392,3.0460,3.0518,3.0579,3.0633,3.0684,3.0732,3.0778,3.0824,3.0867,3.0910,3.0952,3.0979,3.1015,3.1050,3.1082,3.1112,3.1140,3.1169,3.1198,3.1226,3.1257,3.1280,3.1305,3.1329,3.1348,3.1368,3.1393,3.1411,3.1432,3.1456,3.1477,3.1496,3.1512,3.1522,3.1539,3.1553,3.1568,3.1584,3.1599,3.1616,3.1633,3.1647,3.1661,3.1675,3.1685,3.1696,3.1708,3.1719,3.1721,3.1734,3.1749,3.1762,3.1773,3.1782,3.1793,3.1800,3.1808,3.1818,3.1828,3.1836,3.1847,3.1859,3.1869,3.1877,3.1886,3.1893,3.1899,3.1895]
▲ 图1.2.6 高电平与低电平对应的负载电压曲线
※ 总 结 ※
本文利用电阻箱测试了 STM32 输出 IO特性。 在输出电流小于 30mA 下, 输出端口可以等效串联一个 25欧姆左右的电阻。 当输出电流超过30mA 之后, 输出电压变会急剧下降了。
一、补充实验
下面, 初始化PB7,PB6为输出端口, 一个输出高电平, 一个输出低电平。 下面将他们连接在一起, 测试一下它们短路电流应该是多少。 这个问题我也非常感兴趣。
将PB6,PB7短路之后, 此时工作电流为 76mA, 这比静态工作电流 35mA 多出了41mA。 两者电压为 1.9V。
-
高低电平IO口短接:
-
工作电流增加
:
41mA
:
电压
:1.9V
● 相关图表链接: