反激电源参数计算与器件选型，反激变压器计算与绕制教程
AI摘要 文章详细介绍了一款72W反激电源的设计过程，包括参数计算、器件选型及变压器绕制方法。内容涵盖整流滤波电路、变压器设计、MOS管与二极管选型、RCD吸收电路等，适合开关电源设计初学者参考。 此内容根据文章生成，仅用于文章内容的解释与总结 本文章以一个宽电压输入24V3A输出的72瓦反激电源为例来计算电路的各个参数和器件选型，包含反激变压器的计算与绕制方法。文章中的公式是参考网上资料的。如果文章内容有问题，请各位大佬指点一下。【硬件开源】24V3A反激式开关电源（基于UC3842）：https://blog.zeruns.com/archives/910.html磁性元件/磁芯材料/磁芯结构 分析对比和选型指南：https://blog.zeruns.com/archives/897.html电子/单片机技术交流QQ群： 2169025065反激电源工作参数首先需要自己确定好要设计的反激电源的参数。参数值额定输入电压 $V_{acnom}$220VAC最低输入电压 $V_{acmin}$85VAC最高输入电压 $V_{acmax}$265VAC电网工作频率 $f_L$50Hz输出电压 $V_{out}$24V输出电流 $I_{out}$3A工作频率 $f_s$150kHz设计效率 $η$85%反激电源的工作频率通常由设计者根据具体应用需求自定义，而非固定值。提高工作频率可以显著减小变压器、输出滤波电感和电容的体积与重量，从而降低整个电源的尺寸，这是因为高频操作允许使用更小的磁性元件和电容 。然而，频率升高也会导致开关损耗增加，可能降低电源效率、加剧发热，并需要更复杂的散热设计，因此在选择频率时必须综合权衡体积、效率、成本和散热等因素 。工作频率的典型取值范围在20kHz至500kHz之间，其中50kHz～200kHz是最常见的应用区间，这平衡了体积缩减和损耗控制 。对于频率超过300kHz的设计，传统硅基开关管（如MOSFET）的交叉损耗会显著增大，此时通常需要使用氮化镓（GaN）或碳化硅（SiC）等宽禁带半导体开关管，以降低损耗并维持高效率 。单相整流滤波电路计算整流桥二极管耐压值计算：整流滤波后的直流母线电压通常接近输入交流电的峰值电压，而交流电的峰值电压为其有效值的 $\sqrt{2}$ 倍。因此，整流桥二极管的反向耐压应大于最高输入电压有效值的 $\sqrt{2}$ 倍。$$ V_{busmax} = \sqrt{2} \cdot V_{acmax} = 374.77 \mathrm{V} $$同时，为了应对电网浪涌、电压波动等情况，通常还需引入裕量系数 $K_{bri}$（一般取 1.5）。由此可得：$$ V_{busmax} \cdot K_{bri} = 562.15 \mathrm{V} $$因此，整流桥二极管的反向耐压额定值至少应大于 562 V。输入功率：$$ P_{in} = \frac{P_{out}}{η} = 84.7 \mathrm{W} $$整流二极管额定电流计算：整流桥单个二极管最大输入电流（因为整流桥是每两个二极管为一组交替导通的，所以还要除以2）：$$ I_{acmax} = \frac{P_{in}}{2 \cdot V_{acmin}} = 0.498 \mathrm{A} $$这里也是一样，为了应对电网浪涌、电压波动等情况，通常还需引入裕量系数 $K_{bri}$（一般取 1.5）。由此可得：$$ I_{acmax} \cdot K_{bri} = 0.747 \mathrm{A} $$因此，整流桥单个二极管的额定电流至少应大于 0.747 A。根据上面的计算结果，本设计选型的整流桥型号为 MSB40M，其额定电压1000V，额定电流4A，满足上述计算选型要求。输入滤波电容计算：反激电源输入电容的选取有个经验公式，单电压220VAC输入时输入电容 $C_{in}$ 选取1-2μF/W，全电压85VAC-265VAC输入时输入电容 $C_{in}$ 选取2-3μF/W，根据经验公式，计算滤波电容：$$ C_{in} = 2 \cdot P_{out} = 144 \mathrm{μF} $$所以根据上面计算结果可以选150μF的电解电容。输入滤波电容电容耐压选取：一般大于输入交流电的峰值电压就行，比如我这里 $V_{busmax}$ 是374.77V，那选个400V的就可以，也可以选450V。反激变压器计算留有一定余量，取输入最低电压 $V_{busms}$ 为 110V定义反射电压（开关管关断瞬间初级绕组因磁场能量释放而感应的电压） $V_{OR}$ 为 100V，100V 是反激电源设计中针对宽输入电压场景（如 110V/220V AC）的典型工程取值。定义原边MOS开通后源漏极压降为 $V_{ds}$ = 4V计算最大占空比：（其实也可以不用算，直接定义为0.45的经验值也可以，反激电源占空比一般不超0.5）$$ V_{busmin} = \sqrt{2} \cdot V_{acmin} = 120.21 \mathrm{V} $$$$ D_{max} = \frac{V_{OR}}{V_{OR} + V_{busms} - V_{ds}} = 0.485 $$计算原边电流峰值：输入平均电流为$$ I_{avg} = \frac{P_{in}}{V_{busms}} = 0.77 \mathrm{A} $$设定脉动电流 $I_R$ 与峰值电流 $I_P$ 的 脉动系数 $K_{RP}$ 为0.8（CCM模式），计算初级绕组的峰值电流 $I_P$ 为：$$ I_P = \frac{I_{avg}}{(1-0.5 \cdot K_{RP}) \cdot D_{max}} = 2.644 \mathrm{A} $$计算变压器激磁电感：反激变压器激磁电感的计算公式，得到变压器初级侧激磁电感为 $L_P$$$ L_P = \frac{P_{out}}{{I_P}^{2} \cdot K_{RP} \cdot (1 - 0.5 \cdot K_{RP}) \cdot f_s} \cdot \frac{0.5 \cdot (1-\eta) + \eta}{\eta} = 155.686 \mathrm{μH} $$计算AP值，根据AP值选取变压器磁芯：磁芯面积乘积AP=AW*Ae（它是磁芯窗口面积AW与磁芯有效截面积Ae的乘积）取变压器窗口填充系数 $K_o$ 为0.4，电流密度系数 $K_j$ 取3.95，磁通量 $B_w$ 为0.2T，计算所需磁芯的最小 $A_P$ 值：$$ A_{P}=\left(\frac{L_{P} \cdot {I_{P}}^{2} \cdot 10^{2}}{B_{w} \cdot K_{o} \cdot K_{j}}\right)^{1.14}=0.297 \mathrm{~cm}^{4} $$选用的磁芯的 $A_P$ 通常要比设计值大2倍以上，我这里选择PQ2620的磁芯来设计变压器，查询磁芯手册得到该磁芯的 $A_P$ 值为 0.7188$\mathrm{~cm}^{4}$。为什么磁通量 $B_w$ 取值为0.2T：1.避免磁芯饱和磁芯饱和：当磁通密度超过材料的饱和磁通密度 ($ B_{\text{sat}} $) 时，磁芯会失去导磁能力，电感量骤降，导致变压器失效。铁氧体磁芯特性：常用开关电源磁芯（如PC40、PC44、PC95等）的 $ B_{\text{sat}} $ 在100°C时约为 0.3–0.4 T。安全裕量：取 $ B_w = 0.2 \, \text{T} $（约为 $ B_{\text{sat}} $ 的 50–70%），为以下因素预留余量：高温下 $ B_{\text{sat}} $ 下降（铁氧体磁芯的 $ B_{\text{sat}} $ 随温度升高而降低）。直流偏置电流引起的磁通偏移。输入电压波动或负载瞬变导致的峰值电流增加。2.控制磁芯损耗高频损耗：开关电源工作频率高（通常 >20 kHz），磁芯损耗（磁滞损耗+涡流损耗）随磁通密度 指数级增长。损耗优化：经验表明，$ B_w $ 在 0.1–0.25 T 范围内时，磁芯损耗与铜损能较好平衡，整体效率较高。0.2 T 是此区间的常用折中值。计算变压器原副边绕组匝数：$V_F$ 为输出整流二极管导通压降，一般定义为0.7就行根据原副边的磁通量守恒定律，计算出变压器原副变比 $N_{PS}$ 为：$$ N_{PS} = \frac{D_{max}}{(1 - D_{max})} \cdot \frac{(V_{busms} - V_{ds})}{(V_{out} + V_F)} = 4.049 $$防止变压器工作饱和，选取工作时 $B_{max}$ 为 0.15T，PQ2620磁芯的 $A_e$ 值为 119μ（$119 \times 10^{-3}\,\text{m}^2$），计算变压器初级匝数$N_P$为：$$ N_P = \frac{V_{busms} \cdot D_{max}}{A_e \cdot B_{max} \cdot f_s} = 20 $$磁通链 $\Psi = N(\text{匝数}) \times B(\text{磁感应强度}) \times S(\text{面积})$根据变压器的原副边变比计算副边匝数 $N_S$ 为：$$ N_S = \frac{N_P}{N_{PS}} = 5 $$反激变压器额外设置一个输出绕组，该绕组工作的输出电压给控制芯片使用，拟定设计的额外绕组输出电压 $V_{out1}$ 为15V，根据输出电压和绕组变比的关系，可计算得到辅助供电绕组的匝数 $N_{s1}$ 为：$$ N_{s1} = N_s \cdot \frac{V_{out1}}{V_{out}} = 3 $$计算原边/副边绕组线径与股数：计算变压器初级电流有效值$I_{prms}$为：$$ I_{prms} = I_P \cdot \sqrt{D_{max} \cdot \left( \frac{{K_{RP}}^2}{3} - K_{RP} + 1 \right)} = 1.184\,\text{A} $$计算变压器副边绕制电流的有效值$I_{\text{srms}}$为：$$ I_{SP} = I_P \cdot \frac{N_P}{N_S} = 10.575\,\text{A} $$$$ I_{srms} = I_{SP} \cdot \sqrt{(1 - D_{max}) \cdot \left( \frac{{K_{RP}}^2}{3} - K_{RP} + 1 \right)} = 4.877\,\text{A} $$变压器绕组中为高频电流，会存在趋肤效应。电流并非均匀分布在导线内部流动，电流集中在导体的“皮肤”部分，越靠近导体表面，电流密度越大，导体内部实际上电流较小。趋肤效应的影响会使得导线的利用面积大大减小，因此，使用截面积较小的多股细线（可选用利兹线）代替单根粗线可以有效的减小趋肤效应。计算得到趋肤深度 $D_m$ （最大直径）为：$$ D_{m}=\frac{2 \cdot 68.85 \cdot 10^{-3}}{\sqrt{f_{s}}}=0.356\,\text{mm} $$经验电流密度通常在 $4 \sim 6 \,\text{A/mm}^2$。原边绕组选用的绕线直径 $D_p$ 和股数 $P_p$ 如下：$$ D_p = 0.3\,\text{mm} \quad\quad P_p=3 $$计算得到变压器原边绕组的电流密度 $j_p$ 在4到6的范围内。$$ j_p = \frac{I_{prms}}{\left( \frac{D_p}{2} \right)^2 \pi P_p} = 5.585 \times 10^6 \text{A/m}^2 = 5.585\,\text{A/mm}^2 $$可设计变压器副绕组选用的绕线直径 $D_s$ 和股数 $P_s$ 分别如下。$$ D_s = 0.35\,\text{mm} \quad\quad P_s = 10 $$计算得到变压器副边绕组的电流密度 $j_s$ 为。$$ j_s = \frac{I_{srms}}{\left( \frac{D_s}{2} \right)^2 \pi P_s} = 5.069 \times 10^6 \text{A/m}^2 = 5.069\,\text{A/mm}^2 $$计算参考系数：计算所有绕组截面积占变压器窗口的系数为：$$ A_w = 60.4 \times 10^{-3}\,\text{m}^2 $$$$ K_w = \frac{\left( \frac{D_p}{2} \right)^2 \pi P_p N_p + \left( \frac{D_s}{2} \right)^2 \pi P_s N_S}{A_w} = 0.15 $$窗口系数 $K_w$ 一般指定在 $0.1 \sim 0.3$ 之间较为合适。变压器制作规格书计算好变压器参数后就可以做一个变压器制作规格书给到变压器厂商来制作变压器，也可以自己手动绕制。绕组结构：绕组层出线端子绕线规格匝数疏绕方式第一层1-2Φ0.3mm(#28AWG)*3股并绕10密绕第二层5-6Φ0.3mm(#28AWG)3密绕第三层10-12Φ0.35mm(#26AWG)*10股并绕5密绕第四层2-3Φ0.3mm(#28AWG)*3股并绕10密绕绕组制作细节备注：严格按照图纸说明的同名端绕线，1/5/10脚为同名端，绕线请注意同名端第2脚为三明治绕法转接点。各层间加胶带，第2第3层边上加2毫米以上挡墙。引脚出入线套管。1脚打白点识别，保证电感量156uH（1-3脚间测量，@150kHz测量）。每层均匀绕做，不够一层均匀疏绕。拔掉第8脚骨架出线端子、图纸同名端说明、绕组结构图 如下：变压器相关信息：电感量1-3脚 ： 磨中柱保证156uH（@150kHz测量）磁芯PQ2620 (PC95/PC44铁氧体)骨架PQ2620_6PIN+6PIN立式骨架底板无耐压测试1脚-10脚:1500VAC （频率：60Hz、时间：60s）温度等级CLASS F固定方式胶带固定，暂时不点胶和浸胶出线方式所有出入线均加铁弗龙套管/尼龙绝缘管MOS管计算与选型在初级 MOS 关断期间，MOS 源漏极上承受的平台电压为输入电压与由次级折算到初级绕组上的电压之和，并且，当输入电压最高时，平台电压达到最大：$$ V_{mos} = (V_F + V_{out}) \frac{N_P}{N_S} + V_{busmax} = 473.567\,\text{V} $$当MOS关断时，由于实际应用时变压器自身存在一定的原边漏感，漏感中的能量并未传送至副边，而MOS具有一定容量的结电容，漏感的能量会与MOS的结电容产生LC震荡，导致MOS出现尖峰电压。设计中，应避免该尖峰电压过高损坏MOS器件，通常设计专用RCD钳位电路吸收尖峰能量，但同时，选型MOS应选择留有一定耐压余量，本设计留有1.5倍的电压余量：$K_{vmos}=1.3$因此计算得到选型MOS的耐压能力必须满足：$V_{mos} \cdot K_{vmos} = 615.637\,\text{V} $MOS电流有效值等于原边电流有效值，上面已经算出 $I_{prms}=1.184\,\text{A}$，要留有一定余量，所以应该要选额定电流更大点的MOS管根据MOS耐压能力最小值，配合原边绕组的电流有效值 $I_{prms}$，本设计选型的MOS型号为 NJH65R600S，其额定电压700V，额定电流8A，满足上述计算选型要求。注意看下面表格，温度100度下的额定电流也要大于上面算的原边电流有效值。除了额定电压和电流外，MOS管选型主要看的参数还有导通电阻$R_{DS(ON)}$、输入电容$C_{iss}$，这两个值都是越小越好，其中导通电阻$R_{DS(ON)}$越小，MOS管导通时的损耗就越低，另外输入电容$C_{iss}$则直接影响开关损耗与驱动损耗，$C_{iss}$越小，开关响应速度越快，开关损耗也越小，驱动电路所需的充放电电流越小，相应驱动损耗也越低。输出二极管和电容计算与选型输出二极管计算和选型：在 MOS 导通期间，次级整流二极管承受反向电压，二极管截止，其上的平台电压为输出电压与由原边绕组折算到副边绕组的电压之和，并且，当输入电压最高时，平台电压达到最大，计算二极管截止时承受的电压为：$$ V_{dio} = V_{out} + V_{busmax} \cdot \frac{N_S}{N_P} = 117.692\,\text{V} $$当二极管截止时，由于变压器副边绕组存在一定的漏感，其上的能量会与二极管的结电容产生 LC 震荡，导致在二极管关断时产生一定尖峰电压。设计选型时，应该选有一定耐压余量的二极管，本设计留有 1.5 倍的电压余量：$K_{vdio} = 1.5$因此计算得到选型二极管的耐压能力必须满足：$$ V_{dio} \cdot K_{vdio} = 176.5372\,\text{V} $$根据上述计算得到的二极管耐压能力最小值，配合副边绕组的电流有效值 $I_{prms}$，本设计选型的二极管型号为SBDD10200CT，其额定电压200V，额定电流10A，满足上述计算选型要求。另外还要注意的是，二极管要选用肖特基二极管，因为肖特基二极管具有 低正向导通压降（Vf） ，能显著降低导通损耗，提高电源效率；同时其反向恢复时间极短（通常＜10ns），可减少开关过程中的能量损耗和电压振荡，尤其适合高频反激电源。还可以用同步整流二极管（集成 同步整流控制器+MOS管）代替肖特基二极管，因为同步整流技术采用MOS管替代二极管，通过控制器精确控制MOS管通断。其优势在于 导通电阻（$R_{ds(on)}$）极低，可进一步降低导通压降和损耗，提升效率（尤其在大电流输出时）。输出电容计算和选型：MOS开通副边二极管截止，电容给负载供电，电压逐渐下降，形成输出电压纹波。电容电流等于负载电流，电容电压下降斜率等于电容电流除以电容容值。纹波电压等于电压下降的斜率乘以原边MOS导通时间，即副边二极管截止时间。$$ \Delta V_{out} = \frac{V_{out}}{R_{out} \cdot C_{out}} \cdot \frac{D_{max}}{f_s} $$消费电子类的开关电源输出电压的纹波率（即纹波电压峰峰值与输出电压的百分比）一般要求1%至2%以内，我这里24V的输出电压，也就是纹波电压取值要在0.24V到0.48V之间，当然更低的纹波电压取值也是可以的，但所需的电容量也会更高，我这里设 $\Delta V_{out} = 0.1\,\text{V} $ ，因此可以计算输出电容容值为：$$ R_{out} = \frac{V_{out}}{I_{out}} = 8\,\text{Ω} $$$$ C_{out} = \frac{V_{out}}{R_{out} \cdot \Delta V_{out}} \cdot \frac{D_{max}}{f_s} = 97.087\,\text{μF} $$计算为理想电容，即电容无内阻，实际应用电容具有一定的ESR内阻，会导致纹波增大，不同选型的的电容型号，内阻均不相同，通常经验选值要大于理论值，具体以试验为主。为了降低电容ESR内阻，使用多颗电容并联。设计中选用2颗220uF/35V的电解电容并联，可选用固态电容（ESR比电解电容低），还需再并联多颗MLCC电容（如 1μF、100nF）来过滤高频干扰。RCD吸收电路分析与计算电路可能发生两次振荡，第一次主要是初级漏感$L_{kp}$和MOS管的$C_{oss}$的电容引起的，第二次主要是在电路能量耗尽后，励磁电感（初级电感）和$C_{oss}$电容振荡引起的。在增加RCD吸收电路后，当MOS两端的电压大于钳位电容电压与输入电压之和时，钳位二极管导通，钳位电路开始正式工作。假设变压器的初级漏感$L_k$控制在激磁电感（初级电感）的1%以内：$L_k=1\% \cdot L_p=1.557uF$ （最好在变压器生产出来后实际测试一下变压器初级漏感，后面的计算都用实测值再算一遍。初级漏感测量方法：将变压器除初级外的线圈都短路掉，然后用LCR电桥测量初级电感值，测出来的就是初级漏感。）已知开关管最大电压$V_{dsmax}$为700V留有一定余量，设计希望钳位电容上的电压$V_{clamp}$为：$$ V_{clamp} = 0.8 \cdot V_{dsmax} − V_{busmax} = 185.233\,\text{V} $$根据常规RCD计算吸收计算公式计算钳位电阻$R_c$与钳位电容$C_c$：$$ R_c = \frac{2 \cdot \left[V_{clamp} - \frac{N_P}{N_S} \cdot (V_F + V_{out})\right] \cdot V_{clamp}}{L_k \cdot I_p^2 \cdot f_s} = 19.616\,\text{kΩ} $$$$ C_c = \frac{2 \cdot V_{clamp}}{R_c \cdot V_{clamp} \cdot f_s} = 0.68\,\text{nF} $$同时计算钳位的功率为：$$ P_{clamp} = \frac{1}{2} \cdot f_s \cdot L_k \cdot I_p^2 \left(1 + \frac{V_{OR}}{V_{clamp} - V_{OR}}\right) = 1.774\,\text{W} $$选择20kΩ的钳位电阻和1nF的钳位电容，选择2W的功率电阻；根据钳位电容上的电压，考虑到启动初期钳位电容上的电压较大，可以选择耐压能力为1kV的薄膜电容或1206封装的MLCC；同理选择1kV耐压的钳位二极管FR107。资料下载如果不想手动计算也可以使用Mathcad计算书或SMPSKit软件来计算，下载地址如下：123网盘：https://www.123684.com/s/2Y9Djv-A3TdH百度网盘：https://pan.baidu.com/s/1USh47nHgYxjTzTJgo4DVTQ?pwd=xyxf 提取码: xyxf变压器绕制我也是第一次绕变压器，绕得不太行，仅供参考。所有线圈都从同名端引脚开始沿同一个方向绕！我下面图片有用漆包线（左）和利兹线（右）绕的。PQ2620磁芯的直径是14.5mm，根据圆周长公式 $L = \pi d$ 可算出一圈的长度为45.53mm，然后再乘以匝数可得到各级线圈所需长度，然后再加上十几厘米的余量，按照这个算出来的长度把漆包线剪出来。第一层：首先是绕初级线圈的第一层，将3条直径0.3mm的漆包线并一起绕在变压器骨架的1号引脚，然后在骨架上绕10圈。（利兹线我用的是0.1x30的）绕好第一层后把线先绕到上面，然后缠一层胶带（用玛拉胶带或聚酰亚胺胶带），接着把线垂直绕下来到2号引脚上，再缠两层胶带。第二层：先在两边绕挡墙，接着将单根0.3mm的漆包线绕在5号引脚，沿着上面第一层的绕向绕3圈到6号引脚，最后缠两层胶带。（利兹线我用的是0.1x10的）第三层：先在两边绕挡墙，接着将10根直径0.35mm的漆包线并一起绕在变压器骨架的10号引脚，沿着上面第一层的绕向绕5圈到12号引脚，最后缠两层胶带。（利兹线我用的是0.1x60的）第四层：继续绕初级线圈，从2脚开始沿着上面第一层的绕向绕10圈到3脚，绕完后也是最好要垂直下来，最后缠两层胶带。接着把各个引脚的漆包线都焊好在引脚线上，有些漆包线可能得自己用刀片刮一下漆层才能上锡，利兹线就直接烙铁高温烫一段时间就能上锡了。在反激开关电源中，变压器需要储存本周期传输的能量，为了防止出现磁饱和，通常需要在磁芯中设置气隙改变磁滞回线，增大饱和磁场强度进而增加单周期传输的能量。开气隙通常有磨气隙和垫气隙两种方式，其中垫气隙较为简单。最后把磁芯合上去，压紧并测量初级线圈电感值，如果电感值大于目标值很多（我这里要求是156μH）就用锉刀或别的打磨的工具来磨磁芯中间圆柱（磨气隙），每磨一点就测量一下，直到电感值只比目标值大一点点，然后用胶带把整个磁芯缠紧了。也可以用垫气隙的方法，就是在磁芯两边垫几层胶带或其他薄的纸之类的东西，每垫一层就测量一下电感值，直到电感值只比目标值大一点点就可以，然后用胶带把整个磁芯缠紧了。垫气隙相比磨气隙漏感会大点。做好后再次测量，我的这个变压器初级线圈电感值是158.8μH。测量初级线圈漏感，将其他线圈短路掉，然后测量初级线圈的电感值就是漏感，我的这个测出来是2.7μH，略大了一点。开源项目推荐做了个三相电量采集器开源出来，可以方便监测家里用电情况： https://blog.zeruns.com/archives/771.html基于STM32的同步整流Buck-Boost数字电源 开源： https://blog.zeruns.com/archives/791.htmlLM25118自动升降压可调DCDC电源模块：https://blog.zeruns.com/archives/727.html基于CH32V307的智能电子负载开源，嵌入式大赛作品开源： https://blog.zeruns.com/archives/785.htmlEG1151大功率同步整流可调升降压电源模块（支持TypeC PD快充输入）开源：https://blog.zeruns.com/archives/794.html开源 140W+65W升降压PD3.1快充模块(2C+1A口)，IP6557+IP6538，205W桌面充电器：https://blog.zeruns.com/archives/801.html开源TypeC拓展坞，4个10Gbps的USBA口+2.5G网卡+读卡器：https://blog.zeruns.com/archives/868.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/跨境电商独立站搭建教程，WordPress外贸建站指南：https://blog.zeruns.com/archives/889.htmlZGRL-80 摄影灯拆解分析，电路设计分析：https://blog.zeruns.com/archives/882.html机械革命Code10AI笔电（Ultra7-255H） 简单开箱评测和拆解：https://blog.zeruns.com/archives/895.htmlGL-RM1PE 简单开箱测评和拆解，让普通电脑实现BMC远程管理功能：https://blog.zeruns.com/archives/900.htmlEnglish Version of the Article: https://blog.zeruns.top/archives/73.html
沁恒CH224K快充协议芯片功能改变但型号不变？
AI摘要 沁恒CH224K芯片功能变更但型号未变，旧版支持单电阻模式配置电压，新版取消该功能，建议升级至CH224A。此改动引发兼容性争议。 此内容根据文章生成，仅用于文章内容的解释与总结 沁恒CH224K快充协议芯片功能改变但型号不变？在1F版本的芯片手册中，CH224K是支持单电阻模式配置请求电压的，其中CFG引脚全部悬空即为诱骗20V。CH224K_V1F版本数据手册下载地址：https://url.zeruns.com/WCH-CH224-V1F但在V2.1版本的芯片手册中却删除了CH224K的单电阻配置部分，变成只支持高低电平配置诱骗电压，且CFG引脚不能全部悬空，也就是说如果实际芯片也改版了那以前按照单电阻模式设置20V诱骗的CH224K电路全部失效了？CH224K_V2.1版本数据手册下载地址：https://url.zeruns.com/WCH-CH224-V2_1然后新版手册的CH224K部分下面建议升级CH224A芯片，CH224A芯片的引脚基本上与CH224K功能一致，而且CH224A也支持单电阻模式配置请求电压，但20V请求电压的配置电阻是120kΩ，与旧版悬空不同，如果电路设计上没有预留这个电阻焊盘也是替换不了！沁恒的这种改动合理吗？芯片更新不应该出一个新型号吗？有没有兄弟试试新买的CH224K是否还支持单电阻配置？我之前做的一些开源项目用CH224K配置20V诱骗都是用的单电阻模式然后CFG引脚全部悬空，没有预留配置电阻的焊盘。CH224K购买地址：https://s.click.taobao.com/VDx5vFq开源项目推荐基于STM32的同步整流Buck-Boost数字电源 开源： https://blog.zeruns.com/archives/791.htmlEG1164大功率同步整流升压模块开源，最高效率97%：https://blog.zeruns.com/archives/730.htmlEG1151大功率同步整流可调升降压电源模块（支持TypeC PD快充输入）开源：https://blog.zeruns.com/archives/794.html开源 140W+65W升降压PD3.1快充模块(2C+1A口)，IP6557+IP6538，205W桌面充电器：https://blog.zeruns.com/archives/801.html做了个三相电量采集器开源出来，可以方便监测家里用电情况： https://blog.zeruns.com/archives/771.html开源TypeC拓展坞，4个10Gbps的USBA口+2.5G网卡+读卡器，VL822+RTL8156BG+GL3224：https://blog.zeruns.com/archives/868.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/机械革命Code10AI笔电（Ultra7-255H） 简单开箱评测和拆解：https://blog.zeruns.com/archives/895.htmlGL-RM1PE 简单开箱测评和拆解，让普通电脑实现BMC远程管理功能：https://blog.zeruns.com/archives/900.html南澳岛旅行记录和照片分享：https://blog.zeruns.com/archives/902.htmlEnglish Version of the Article: https://blog.zeruns.top/archives/71.html
磁性元件/磁芯材料/磁芯结构 分析对比和选型指南
AI摘要 磁性元件设计中，磁芯选型至关重要。本文系统梳理了磁芯关键参数、主流材料特性及典型结构差异，为电子工程师提供工程选型建议，助力实现产品性能与成本的最优平衡。 此内容根据文章生成，仅用于文章内容的解释与总结 磁性元件/磁芯材料/磁芯结构 对比和选型指南。在磁性元件设计中，磁芯是决定其性能、效率与成本的核心要素。从 AC/DC 电源到新能源逆变器，从滤波电感到高频变压器，磁芯材料的选型直接影响产品的可靠性与市场竞争力。本文将系统梳理磁芯关键参数、主流材料特性、典型结构差异，并给出针对性的工程选型建议，为电子工程师提供一站式参考。电子/单片机技术交流QQ群： 2169025065本文章包含AI生成内容！一、磁芯核心参数定义与作用磁芯参数是材料性能与应用匹配的基础，下表汇总了设计中最常用的关键参数：参数符号单位定义核心作用μ₀H/m真空磁导率（常数，μ₀=4π×10⁻⁷ H/m）计算相对磁导率的基准μᵣ-相对磁导率（μᵣ=μ/μ₀，μ 为材料磁导率）反映材料导磁能力，决定电感量与磁芯体积BₛT（特斯拉）饱和磁通密度（材料达到磁饱和时的磁通密度）限制磁芯最大工作磁通，避免磁芯饱和导致损耗激增、电感量暴跌BᵣT剩余磁通密度（外加磁场为零时的剩余磁通密度）影响磁芯的复位难度，对 DC 偏置下的电感稳定性至关重要HᵍA/m矫顽力（消除剩余磁通所需的磁场强度）反映材料磁滞特性，矫顽力小则磁滞损耗低Pₑ（Pcv）kW/m³比损耗（单位体积内的磁芯损耗，含磁滞损耗与涡流损耗）决定磁芯发热与效率，是高频应用中选型的核心指标Tc℃居里温度（材料磁导率骤降的临界温度）限制磁芯最高工作温度，避免高温下性能失效ALnH/N²电感系数（单位匝数的电感量，AL=L×10⁹/N²）快速计算电感量的关键参数，与磁芯尺寸、材料磁导率直接相关ΔBT工作磁通密度摆幅（实际应用中 B 的变化范围，通常取 0.5~0.8Bₛ）决定磁芯的能量存储能力（W=0.5×B²/μ₀μᵣ×V）二、主流磁芯材料类型及特性对比磁芯材料按成分可分为金属软磁、铁氧体软磁两大类，不同材料的频率特性、损耗与饱和特性差异显著，直接决定其应用场景：材料类型优点缺点适用频率范围典型应用范围硅钢（Si-Steel）高 Bₛ（1.5~2.0T）、成本低、机械强度高高频损耗大、μᵣ中等（1000~8000）50Hz~10kHz电力变压器、配电变压器、工频电感、电机定子锰锌铁氧体高频损耗低、μᵣ高（2000~20000）、绝缘性好、成本适中Bₛ低（0.3~0.5T）、居里温度较低（180~250℃）10kHz~5MHz开关电源变压器、滤波电感、LED 驱动电源镍锌铁氧体高频特性优、电阻率高、温度稳定性好Bₛ低（0.2~0.4T）、μᵣ低（10~1000）1MHz~1GHz射频天线、EMC 滤波器、高频通讯变压器铁硅铝（Sendust）高 Bₛ（1.0~1.2T）、低损耗、磁致伸缩系数接近零（低噪音）机械脆性大、加工难度高10kHz~500kHz车载电源电感、UPS 滤波电感、音频变压器坡莫合金（Permalloy）极高 μᵣ（10⁴~10⁵）、低 Hᵍ、磁滞损耗小Bₛ低（0.6~0.8T）、成本高、易氧化100Hz~100kHz精密电流互感器、磁放大器、音频变压器、弱磁检测传感器非晶合金高 Bₛ（1.5~1.7T）、低 Pₑ（比硅钢低 30%~50%）、磁导率高机械脆性大、磁芯形状受限、成本较高50Hz~50kHz高频电力变压器、UPS 变压器、新能源车载充电机纳米晶合金极高 μᵣ（10⁴~10⁵）、低 Pₑ（高频损耗远低于非晶）、高 Tc（400~500℃）成本高、加工工艺复杂1kHz~1MHz高频开关电源变压器、光伏逆变器电感、电动汽车 DC/DC 变换器铁镍钼（MPP）磁导率稳定性好、抗 DC 偏置能力强、低损耗Bₛ低（0.7~0.8T）、成本极高1kHz~200kHz军工电源、精密仪器电感、高频脉冲变压器三、典型磁芯材料型号及关键参数下表选取各材料体系中最常用的型号，提供具体参数参考（参数为典型值，不同厂家略有差异）：材料类型型号初始磁导率 μᵣ饱和磁通密度 Bₛ（25℃）比损耗 Pₑ（典型条件）AL 值范围（Φ20 磁芯）锰锌铁氧体PC44（TDK）23000.47T200kW/m³（100kHz，0.2T）1800~2200nH/N²锰锌铁氧体PC95（TDK）30000.42T80kW/m³（200kHz，0.15T）2200~2600nH/N²硅钢30Q13045001.95T1.3W/kg（50Hz，1.7T）800~1000nH/N²硅钢50A47030001.85T4.7W/kg（50Hz，1.7T）500~700nH/N²铁硅铝2605SA8001.05T35kW/m³（50kHz，0.5T）400~600nH/N²铁硅铝2605SC12001.0T50kW/m³（100kHz，0.4T）600~800nH/N²坡莫合金1J85300000.78T15kW/m³（10kHz，0.2T）3000~3500nH/N²坡莫合金1J79450000.75T10kW/m³（5kHz，0.2T）4000~4500nH/N²非晶合金1K101150001.56T25kW/m³（20kHz，0.5T）1500~1800nH/N²非晶合金1K107200001.45T20kW/m³（20kHz，0.4T）1800~2100nH/N²纳米晶合金FINEMET500001.2T5kW/m³（100kHz，0.2T）4500~5000nH/N²纳米晶合金NANOPERM800001.0T3kW/m³（200kHz，0.1T）6000~6500nH/N²四、磁芯结构与骨架类型对比磁芯结构决定了磁路特性、装配难度与散热性能，需结合应用场景选择：结构类型优点缺点适用场景EE 型磁路对称、窗口面积大（便于绕线）、装配简单、成本低漏磁较大、屏蔽性差中大功率开关电源变压器、PFC 电感EI 型绕线方便、可拆分装配、成本极低磁路不连续、漏磁大、效率低工频变压器、小功率线性电源PQ 型体积小、功率密度高、漏磁小、散热好窗口面积较小（绕线难度略高）、成本中等高密度开关电源、车载 DC/DC 变换器RM 型屏蔽性优（罐式结构）、漏磁极小、电磁兼容性好绕线空间受限、散热依赖引脚射频变压器、精密信号隔离器环形磁路闭合完整、漏磁极小、磁导率利用率高、损耗低手工绕线效率低、自动化生产难度大高精度电感、电流互感器、音频变压器罐型（Pot）全屏蔽结构、抗干扰能力强、机械强度高散热差、内部绕线维护困难高频脉冲变压器、EMC 滤波器ETD 型窗口高度大、适合多层绕线、功率密度介于 EE 与 PQ 之间体积略大、成本高于 EE 型中大功率逆变器电感、工业电源变压器UU 型磁路对称、可灵活调整气隙、装配方便漏磁较环形大、屏蔽性一般差模电感、中频变压器五、工程化选型建议根据不同应用场景的功率、频率、可靠性要求，下表给出针对性选型方案：1. AC/DC 变换器选型功率范围拓扑结构推荐材料推荐结构选型要点<50W反激、正激锰锌铁氧体（PC44）EE、EI 型优先考虑成本，选低损耗铁氧体，AL 值匹配电感量需求50~500W反激、半桥锰锌铁氧体（PC95）PQ、EE 型平衡损耗与功率密度，PQ 型适合高密度设计500W~2kW全桥、LLC非晶合金、PC95PQ、ETD 型关注高频损耗，非晶合金可降低温升>2kW全桥、移相全桥非晶、纳米晶合金ETD、PQ 型优先高 Bₛ、低 Pₑ材料，确保大电流下磁芯不饱和2. DC/DC 变换器选型应用类型频率范围推荐材料推荐结构选型要点非隔离 Buck/Boost10~100kHz铁硅铝、锰锌铁氧体EE、环形铁硅铝抗 DC 偏置能力强，适合大电流电感隔离正激 / 反激50~200kHz锰锌铁氧体（PC95）PQ、RM 型RM 型适合对 EMC 要求高的场景车载 DC/DC20~50kHz铁硅铝、纳米晶环形、PQ 型耐温性优先（选 Tc>150℃材料），铁硅铝低噪音符合车载要求军工 DC/DC10~100kHz铁镍钼（MPP）环形优先磁导率稳定性与抗干扰能力，MPP 材料适合精密控制3. PFC 与滤波电感选型应用类型工作模式推荐材料推荐结构选型要点连续模式 PFC（CCM）50~100kHz铁硅铝、纳米晶环形、EE 型大电流下抗饱和优先，铁硅铝成本优于纳米晶断续模式 PFC（DCM）100~200kHz锰锌铁氧体EE、PQ 型损耗优先，选低 Pcv 铁氧体，降低开关损耗差模滤波电感10kHz~1MHz锰锌铁氧体、铁硅铝UU、EE 型低频段用铁硅铝，高频段用铁氧体，平衡损耗与电感量共模滤波电感10kHz~10MHz镍锌铁氧体环形、罐型高频特性优先，镍锌铁氧体适合 1MHz 以上频段4. 逆变器与特种应用选型应用类型功率等级推荐材料推荐结构选型要点光伏逆变器>5kW非晶、纳米晶合金ETD、环形高功率密度需求，纳米晶低损耗适合高频化设计车载逆变器1~3kW铁硅铝、非晶PQ、环形耐振动、低噪音，铁硅铝机械强度优于非晶音频变压器20Hz~20kHz坡莫合金、铁硅铝环形坡莫合金低失真，适合高保真音频；铁硅铝成本低，适合民用音频射频变压器>1MHz镍锌铁氧体RM、罐型高电阻率镍锌铁氧体减少涡流损耗，屏蔽结构提升抗干扰能力六、总结磁芯选型是磁性元件设计的核心环节，需遵循 “频率匹配、损耗优先、饱和控制、成本平衡” 的原则：低频大功率场景优先硅钢、非晶合金；中高频常规电源优先锰锌铁氧体、铁硅铝；高频精密与军工场景优先纳米晶、坡莫合金。同时，结合磁芯结构的屏蔽性、绕线便利性与散热性能，才能实现产品性能与成本的最优平衡。实际设计中，建议通过磁芯厂家提供的损耗曲线（Pcv-B-f-T 曲线）与 AL 值手册，结合仿真工具（如 Ansys、Maxwell）进行验证，确保选型的工程可靠性。若你在特定应用场景（如车载高压电感、高频射频变压器）的选型上有进一步需求，或需要某类材料的详细厂家参数对比，欢迎随时交流补充。开源项目推荐做了个三相电量采集器开源出来，可以方便监测家里用电情况： https://blog.zeruns.com/archives/771.html基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版：https://blog.zeruns.com/archives/788.html基于STM32的同步整流Buck-Boost数字电源 开源： https://blog.zeruns.com/archives/791.htmlLM25118自动升降压可调DCDC电源模块：https://blog.zeruns.com/archives/727.htmlEG1164大功率同步整流升压模块开源，最高效率97%：https://blog.zeruns.com/archives/730.html基于合宙Air700E的4G环境监测节点（温湿度、气压等数据），通过MQTT上传阿里云物联网平台：https://blog.zeruns.com/archives/747.html基于CH32V307的智能电子负载开源，嵌入式大赛作品开源： https://blog.zeruns.com/archives/785.htmlEG1151大功率同步整流可调升降压电源模块（支持TypeC PD快充输入）开源：https://blog.zeruns.com/archives/794.html开源 140W+65W升降压PD3.1快充模块(2C+1A口)，IP6557+IP6538，205W桌面充电器：https://blog.zeruns.com/archives/801.html开源TypeC拓展坞，4个10Gbps的USBA口+2.5G网卡+读卡器：https://blog.zeruns.com/archives/868.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/跨境电商独立站搭建教程，WordPress外贸建站指南：https://blog.zeruns.com/archives/889.htmlZGRL-80 摄影灯拆解分析，电路设计分析：https://blog.zeruns.com/archives/882.html机械革命Code10AI笔电（Ultra7-255H） 简单开箱评测和拆解：https://blog.zeruns.com/archives/895.htmlEnglish Version of the Article: https://blog.zeruns.top/archives/68.html
AI摘要 ZGRL-80摄影灯拆解分析：揭示其电路设计及参数虚标问题，包括功率、快充支持等，探讨发热情况与优化可能性。 此内容根据文章生成，仅用于文章内容的解释与总结 ZGRL-80 摄影灯/便携掌上COB补光灯 详细拆解分析，电路设计分析。拆一个疑似参数虚标的补光灯给大家看看。拆解视频：https://www.bilibili.com/video/BV1BR3bztE32/前言2024.12.16 在天猫的 比奥斯数码专营店 以188元购入的ZGRL-80的补光灯，标称的参数为80W的功率，支持65瓦PD快充（实测虚标参数），1万毫安时电池。向淘宝客服投诉，就只赔了张100元优惠券，对卖家没有任何处罚，商品还正常销售，商家就只把支持65瓦PD快充这句话删掉。▶电子/单片机技术交流QQ群： 2169025065基于STM32的同步整流Buck-Boost数字电源 开源： https://blog.zeruns.com/archives/791.html开源TypeC拓展坞，4个10Gbps的USBA口+2.5G网卡+读卡器：https://blog.zeruns.com/archives/868.html开源 140W+65W升降压PD3.1快充模块(2C+1A口)，IP6557+IP6538，205W桌面充电器：https://blog.zeruns.com/archives/801.html参数虚标购买时（2024.12.16）商品详情页标注了支持65W(PD协议)Type-C快充供电，不过今天（2025.7.1）写文章时才发现商品详情页改了，改成Type-C供电，这是不是等于变相承认之前是虚假宣传了？（有交易快照证明这不是我自己P上去的）还有商品详情页的图片里标注了80W大功率，但商品参数里标注的又是60W，互相冲突。还有标注了生产企业为：深圳市美美一族科技有限公司用一个65瓦的PD快充充电器来测试ZGRL-80的充电，实际充电功率不足5V2A，开灯也是一样。（下面的拆解也能验证确实是不支持快充的）我买的另一款补光灯，也是宣称支持65瓦PD快充，实测确实也支持，触发PD快充协议输出20V了，由于灯是40瓦的，且电池已经充满，所以下面图片的功率显示才40.9瓦。给ZGRL-80的DC口输入一个20V的电压，充电功率16.7W，开灯并将亮度调到100%，色温调到中间值，充电+灯珠的功率62.3W，也就是说实际上灯珠功率大概也就40瓦左右，也是虚标参数了，虚假宣传。拆解拔掉两个旋钮的帽子，并拧下屏幕那一面的四颗螺丝可以看到电路板背面和一些电线连接到前面的灯珠和电池等上面标有Y字符的接线是灯珠的暖光灯负极，+字符的是暖光和冷光灯珠的正极，W字符（被遮挡了）的是冷光灯珠的负极。用于驱动COB灯珠的两个MOS管型号都是FQD50N06，VBsemi(微碧半导体)的N沟道MOSFET，参数为 60V 58A，这两个MOS管分别接COB灯珠的暖光和冷光的负极，旁边还有一个120毫欧的电阻，应该是用于电流采样的。下面还有一个丝印为Q3的NMOS管，型号是FQD70N10，没查到资料，我猜参数应该是 100V 70A，根据电路走线，我猜这应该是灯珠供电的Boost升压电路的开关管，升压后输出接灯珠正极。右边有一个丝印为Q1的NMOS管，型号是FQD30N04，没查到资料，我猜参数应该是 40V 30A，根据电路走线，我猜这应该是TypeC接口输入的Boost升压电路的开关管。下面有一个丝印为Q6的PMOS管，型号是CMD50P06，参数为 60V 50A，根据电路走线，我猜这应该是DC接口输入的Buck降压电路的开关管，降压后给电池充电。R34的120毫欧电阻是充电电路的充电电流采样电阻。旁边还有两个型号为SB10100L的肖特基二极管，参数为 100V 10A，正向压降VF为0.85V，这两个二极管阴极接灯珠供电的Boost升压电路输入端，阳极分别接电池正极和DC电源接口正极。还有1个型号为SS56的肖特基二极管，参数为 60V 5A，正向压降VF为0.7V。拧下电路板上四颗螺丝即可拆下电路板，就可以看到电路板正面。液晶屏左边的型号为TM1621B的芯片是LCD显示驱动芯片；TM1621B芯片下方两条黑色线的插座是NTC热敏电阻的接口；右边10μH电感旁边10脚的芯片的型号是CN3765，是PWM降压模式多类型电池充电管理IC，具有涓流，恒流和恒压充电模式，开关频率310KHz，支持最大充电电流4A（实测输入不到1A，输出应该1A左右，查询芯片手册得知电流检测引脚最大为120毫伏，而此电路选用的电流检测电阻R34为120毫欧，也就是此电路设计的充电电流就是1A），CN3765是DC电源接口的充电管理芯片，开关管是Q6，D8和D9二极管型号都是SS56，其中D9是续流二极管，D8是用于防止电池电压倒灌DC接口的；中间的24脚的芯片应该是主控MCU，丝印被打磨掉了，不知道型号；中间15μH电感右边8脚的芯片型号是FP7208，这是远翔科技（Feeling Technology）推出的非同步PWM升压型LED驱动芯片，工作电压范围4.5V至24V，开关频率300kHz，可通过单片机给一个PWM信号或电压信号控制此芯片进行DC调光，恒流模式的，FP7208组成的Boost升压电路的开关管是Q3，二极管是D4，滤波电容是EC5，输出接灯珠正极，实测输出对GND电压23.5V（亮度调到100%）；Type-C接口右边8脚的芯片型号是OC6801B，这是欧创芯（OCX）推出的一款专为升压、升降压开关电源设计的专用DC-DC控制器芯片，支持5至40V输入电压范围，在这个电路中用的升压模式，开关管是Q1，二极管是D1，滤波电容是EC2，芯片4号脚接的电阻R3是120kΩ的，根据芯片手册的公式计算得到设置的开关频率为211.8kHz，升压输出并到DC接口的正极，实测升压输出电压为14.4V（测量时是这个电压，充电过程中逐渐升高），这是C口输入的升压电路，5V进来升压后给到DC接口的正极，也就是给到电池充电电路；这个Type-C接口是6Pin的，两个CC引脚各接了一个5.6kΩ的电阻（正常应该用5.1kΩ这个阻值才对，如果不接这个电阻时连接C口输出的PD充电器时充电器是不会有输出的），这个电路上没看到有任何快充协议芯片，也就是只支持5V，其实加一个快充协议芯片应该也才不到1元的成本，还可以把C口的这个升压电路去掉，快充诱骗输出20V后可以直接给到DC接口的正极再由DC接口的降压电路给电池充电，成本其实并不会高多少，甚至可以降一点，想不通为什么不这么设计。简单画了一下电源部分主要结构的电路图，由图可以看出C口输入经升压电路升压后是直接并到DC口上的正极上，但DC口的负极并没有直接连接到电路板的GND上，而是串联了一个二极管D2才到GND上，避免了C口输入时DC口有输出电压。继续拆开摄影灯前面灯珠部分，灯珠固定在铝散热片上，散热片上还有个散热风扇，外壳中间是一个电池包，由电池包上面的贴纸的信息可知这是由4个18650电池串联成的电池组，电压为14.8V，容量为2500mAh，37Wh，2024年11月生产。拆解到此结束，下面是电路各种工作情况下的热成像图，分析一下发热情况。发热情况热成像开灯，亮度设置100%，色温设置为中间值，由电池供电，电路板背面热成像图如下，D3二极管最高温度100度+，还有R35的灯珠电流采样电阻发热也很高。（环境温度27℃左右）开灯，亮度设置100%，色温设置为中间值，由电池供电，电路板正面热成像图如下，D4二极管最高温度85度+。（环境温度27℃左右）关灯，Type-C口充电，电路板背面热成像图如下，Q1 MOS管最高温度79度+。（环境温度25℃左右）关灯，DC口充电，电路板背面热成像图如下，最高点温度63度+，这个位置背面是D8二极管。（环境温度25℃左右）开灯，亮度设置100%，色温设置为中间值，灯珠最高温度94度+。（环境温度27℃左右）这几张图拍摄的时间不一样，所以环境温度有变化。UTi261M热成像仪购买地址：https://u.jd.com/26j0ewm推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/AMD-R9-9950X 和 微星B850M-MORTAR-WIFI主板 简单开箱测评：https://blog.zeruns.com/archives/881.html用1Panel面板一键部署Halo博客的保姆级教程 | 企业官网/个人博客搭建教程：https://blog.zeruns.com/archives/858.html雨云 RCA云应用(基于K8s) 搭建PHP网站的教程：https://blog.zeruns.com/archives/869.html给电动车加装库仑计，记录一下安装过程：https://blog.zeruns.com/archives/879.htmlEnglish Version of the Article: https://blog.zeruns.top/archives/62.html
AI摘要 中兴F7015TV3光猫拆解：2.5G口、体积小、功耗低，但发热严重，加散热风扇后稳定。支持XGPON/EPON，测速达1200Mbps。拆解展示SOC、内存及多种芯片细节，适合技术爱好者参考。 此内容根据文章生成，仅用于文章内容的解释与总结 中兴 F7015TV3 2.5G光猫拆解跟风换了一个近期比较热门的光猫F7015TV3，看中的是带2.5G口，体积小不带WiFi功耗低。支持XGPON和XEPON。实际用下来温度还挺高的，放机柜里用温度74度+（机柜里气温35度+），每隔几分钟就掉线重启一次，加了个散热风扇温度降到52度左右，这才稳定下来。之前用的华为猫棒80度+的温度也能稳定运行。测速可以跑满千兆宽带，速度1200MBps左右（运营商有预留一部分带宽），我们这边已经可以办理两千兆宽带了，但太贵了就没办。2.5G猫棒购买地址：https://s.click.taobao.com/4cZCQjtVSOL 2.5G光猫：https://s.click.taobao.com/QKq65kt电子/单片机技术交流QQ群：2169025065外观照片正面侧面背面接口，有1个2.5G口，1个IPTV口，2个千兆口，还有一个电话线接口。底部，设备信息贴纸，以及SC光纤接口。贴纸信息如下：产品名称：10Gbit/s无源光网络用户端设备(XG-PON ONU)产品型号：ZXNH F7015TV3电源规格：12V 1A日期：2024/02默认终端配置地址：192.168.1.1默认终端配置账号：useradmin默认终端配置密码：echcf放入机柜后2.5G交换机 TL-SE2109简单开箱评测：https://blog.zeruns.com/archives/780.htmlWiFi7无线路由器TL-7DR6560简单开箱测评：https://blog.zeruns.com/archives/753.htmlTL-SH5428 万兆交换机开箱和简单的评测：https://blog.zeruns.com/archives/707.html拆解照片拆开顶盖，可以看到电路板底面，有一颗型号开头为HYF2G的芯片，应该是江苏扬贺扬公司的NAND Flash芯片，用来存储固件的，容量应该是2Gbit（256MByte）。将电路板翻过来看正面，可以看到有一根光纤从一个屏蔽罩里引出接到外壳上的SC光纤接口，屏蔽罩里应该是光模块。还有一块大的黑色的散热片，散热还挺足的，但为什么还是这么热呢。电路板中间最大的芯片是光猫的SOC，型号为ZXIC ZX279133，中兴微电子自研的芯片，基于中芯国际14nm制程打造，双核A53架构，双核心的CPU与八核心的NPU，组成了10核心的自研主芯片。ZX279133芯片的右边是兆易创新（GigaDevice）的DDR3L内存颗粒，型号为GDP2BFLM-CB，容量为4Gbit（512MByte），速率为1866Mbps。左边还有一颗型号为RTL8221B的芯片，应该是2.5G的PHY芯片。下面还有1颗型号为Si32192FM1的芯片，应该是电话接口的芯片。Si3219x系列芯片是由Skyworks Solutions公司生产的一种高性能的单通道FXS（Foreign Exchange Station）解决方案，专为VoIP网关、路由器、xDSL综合接入设备、光网络终端、模拟终端适配器、电缆eMTA、无线固定终端、无线本地环路和WiMAX客户端设备等应用设计。这些芯片集成了所有必要的BORSCHT功能（Battery feed, Overvoltage protection, Ringing, Supervision, Coding, Hybrid circuit, and Test），在一个4x6毫米的38引脚QFN封装内提供了完整的电话接口解决方案，符合全球的规范要求。电话接口附近还有颗丝印为69L2341的芯片，没查到资料，作用不知道。还有一些小芯片，也是查不到资料。关于这些芯片我公众号文章里有人（adonis）在评论区给出解析：69L2341是语音保护器和电话口有关，三极管也是和电话口有关。那些五脚小IC是LDO，六脚小IC是DCDC，都是把12V直流电转换为5V,3.3V,2V,1V直流电供给不同模块工作所需的电压用的。我们厂是中兴烽火小米光猫机顶盒路由器的代工厂，这个有可能就是我们厂代工的后台截图光猫发热情况热成像图下面这张是中兴的F7015TV3加散热风扇后的热成像图像，顶盖大部分面积40度以上，最高点42.3度：下面这张是移动的吉比特H50G光猫的热成像图像，没有加风扇，顶盖只有小部分面积在40度以上，最高点41度：优利德UTi261M热成像仪开箱测评：https://blog.zeruns.com/archives/798.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/内网穿透服务器搭建教程，NPS搭建和使用教程：https://blog.zeruns.com/archives/741.html免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html威联通(QNAP) TS-466C NAS 开箱评测：https://blog.zeruns.com/archives/777.html
EG1151大功率同步整流可调升降压电源模块（支持TypeC PD快充输入）开源
AI摘要 开源基于EG1151芯片的国产大功率升降压电源模块，支持TypeC PD快充输入，最高效率96.8%。 此内容根据文章生成，仅用于文章内容的解释与总结 开源一款全国产的基于EG1151芯片的大功率可调升降压DCDC电源模块，支持TypeC接口输入，带PD3.1诱骗最高支持48V，还有XT60和DC5.5接口输入，最高输入/输出电压63V，最大输入/输出电流20A，支持过流保护和过温保护，最高效率96.8%。这款模块使用的元器件全都国产的。使用的PD3.1诱骗芯片型号为FS312BH，最高可以诱骗PD充电器输出48V，如果充电器不支持这个电压就会自动选取最接近的电压，比如你PD充电器最高支持28V，那就会输出28V。（截止发文时，市场上的PD3.1充电器好像最高才只能输出28V）如果需要TypeC接口输入28V除了充电器要支持PD3.1 28V，还需要你的数据线有E-mark芯片，并且支持PD3.1 ERP28V协议。注意：三个输入接口不能同时使用，输入接口间是并联的！视频演示：https://www.bilibili.com/video/BV1fS411P7Cp/资料下载链接在文章末尾！本模块设计最大电流是20A，但实际测试最多只能去到18A左右，18A的时候压降已经比较明显了！做得一般，大佬们勿喷，如果觉得有哪些地方可以改进一下的可以在评论区提一下建议，欢迎友善交流。立创开源平台开源链接： https://oshwhub.com/zeruns/eg1151-da-gong-lv-tong-bu-zheng-liu-sheng-jiang-ya-mo-kuai-zhi-chi-typec-pd-kuai-chong-shu-ru 电子/单片机技术交流QQ群：2169025065EG1151简介EG1151 是一款四开关降压-升压型 DC-DC 电源管理芯片。内部集成基准电源、振荡器、误差放大器、限流保护、短路保护、半桥驱动等功能。能根据输入和输出电压的具体关系和不同负载条件采取相应的控制策略。在输入电压的整个波动范围内提供稳定的电压输出。非常适合宽电压范围大电流需要升降压的，特别是电池供电的电压并不恒定的场合，同时支持对蓄电池充电。特性：宽输入电压范围：7V——150V高效率，可高达 95%欠压保护过温保护支持对蓄电池充电输出短路保护封装形式：QFN32实物图外壳是在淘宝买的铝壳，然后前后盖是自己设计然后3D打印出来的。外壳和前后盖的3D模型也在资料里。芯片焊接技巧那个EG1151芯片封装是QFN32，还有FS312BH芯片封装是DFN2X2-6L，这两种封装都很小，比较难焊需要一点技巧。焊接这两种封装时如果你的PCB是沉金工艺的，要先给焊盘丄锡，如果是镀锡工艺的就给芯片引脚丄锡，注意最好用中低温的焊锡（如果用高温焊锡很难焊），中间的焊盘不要上太多锡，上一点点就行，不然会把芯片顶起来导致四周引脚接触不了，如果上多了就把烙铁清理干净慢慢把锡吸走，或者用吸锡带，上好锡后给焊盘挤一点焊油，把芯片放上去，然后放到加热台上，或者用热风枪吹，锡融化后用镊子轻轻动一下芯片，如果会自动归位那就可以了，等凉了后接着检查一下有没有连锡，连锡了就用烙铁处理一下。测试使用XT60接口输入24V电，XT60输出接口接万用表和电子负载。使用TypeC接口输入，接酷态科的140W PD3.1充电器，可以看到成功诱骗28V电压。最高可以输出63V。输出10A电流10分钟后的模块热成像图像，MOS管温度在100度左右，保险丝和保险座的接触电阻可能大了一点，所以保险丝那发热也有点大：用到的测试设备：惠普34401A六位半万用表：https://blog.zeruns.com/archives/772.html睿登RD6012P数控可调电源：https://blog.zeruns.com/archives/740.html普源(RIGOL) DHO914S示波器：https://blog.zeruns.com/archives/764.html炬为电子负载：https://s.click.taobao.com/EdLEpkt优利德UTi261M热成像仪开箱测评：https://blog.zeruns.com/archives/798.html转换效率测试测试得到的最高效率为96.869%。测试数据如下表：输入电压(V)输入电流(A)输入功率(W)输出电压(V)输出电流(A)输出功率(W)转换效率(%)36.0006.932249.55248.1944.996240.77796.48460.0006.264375.84035.6699.995356.51294.85748.0009.434452.83228.84114.993432.41395.49160.0005.941356.46018.43017.988331.51993.00360.0004.270256.20012.12918.990230.33089.90212.00110.913130.96724.0035.002120.06391.67425.0009.915247.87523.74910.008237.68095.88712.0049.889118.70836.0683.002108.27691.21312.0042.29127.5015.0705.00025.35092.17812.0049.130109.59710.11610.013101.29292.42248.0007.812374.97636.18810.005362.06196.55648.0008.658415.58450.3158.001402.57096.869纹波测试输出12V空载时的纹波峰峰值在32mV左右：输出12V10A空载时的纹波峰峰值在191mV左右：输出12V15A时的纹波峰峰值在277mV左右：输出36V空载时的纹波峰峰值在51mV左右：输出36V3A时的纹波峰峰值在292mV左右：输出60V空载时的纹波峰峰值在114mV左右：输出60V3A时的纹波峰峰值在708mV左右：原理图主功率电路：PD诱骗和辅助电源电路：PCB顶层：内层1：内层2：底层：元件购买地址这个项目用到的大部分元件购买地址都在这里：0603电阻电容样品本：https://s.click.taobao.com/SXT7pktTypeC母座 16P：https://s.click.taobao.com/vjLRsktEG1151芯片：https://s.click.taobao.com/le3gAktEG1192L芯片：https://s.click.taobao.com/pG2gAktCJAC80SN10 MOS管：https://s.click.taobao.com/aPsWWltXT60PW接口：https://s.click.taobao.com/6jZ7pkt扁平线电感PQ2918 47μH：https://s.click.taobao.com/RDuLHkt磁环电感 卧式 68μH 20A：https://s.click.taobao.com/8JHHcjt铝合金外壳：https://s.click.taobao.com/fYK0zbt建议在立创商城里购买元器件：https://activity.szlcsc.com/invite/D03E5B9CEAAE70A4.html在立创开源链接里的BOM表那点立即到立创商城下单可将用到的元器件一键导入到购物车。资料下载地址下面下载链接包含：立创EDA工程、原理图PDF文件、用到的各种芯片的数据手册、外壳3D模型文件。百度网盘下载链接：https://pan.baidu.com/s/1gNl48K25p6Pr3gi9lsyMAg?pwd=tmsv 提取码：tmsv 123云盘下载链接：https://www.123pan.com/s/2Y9Djv-r3tvH.html 提取码：0cGK如果觉得对你有用的可以进去上面的123云盘链接里给我打赏，如果是微信文章（公众号：zeruns-gzh）的也可以点击文章下方的喜欢作者给我打赏，谢谢。其他开源项目推荐做了个三相电量采集器开源出来，可以方便监测家里用电情况： https://blog.zeruns.com/archives/771.html基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版：https://blog.zeruns.com/archives/788.html基于STM32的同步整流Buck-Boost数字电源 开源： https://blog.zeruns.com/archives/791.htmlLM25118自动升降压可调DCDC电源模块：https://blog.zeruns.com/archives/727.htmlEG1164大功率同步整流升压模块开源，最高效率97%：https://blog.zeruns.com/archives/730.html基于合宙Air700E的4G环境监测节点（温湿度、气压等数据），通过MQTT上传阿里云物联网平台：https://blog.zeruns.com/archives/747.html基于CH32V307的智能电子负载开源，嵌入式大赛作品开源： https://blog.zeruns.com/archives/785.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html内网穿透服务器搭建教程，NPS搭建和使用教程：https://blog.zeruns.com/archives/741.html雨云 宁波 8272CL 大带宽高防云服务器性能测评，最高500兆带宽和1TB云盘：https://blog.zeruns.com/archives/789.html抖音商城2.6元的120W充电器测试和拆解：https://blog.zeruns.com/archives/786.html
AI摘要 雷迪司D1500 UPS拆解分析：电池衰减快，逆变效率77%，采用工频变压器设计，内部使用ATmega168PA主控芯片和12V9AH铅酸电池。 此内容根据文章生成，仅用于文章内容的解释与总结 雷迪司（LADIS）D1500 不间断电源（UPS）拆解分析。家里网络机柜用的UPS坏了，电池好像充不进电，断开市电直接无输出，断开负载还能空载输出一小段时间，应该是电池坏了。发现坏的时候刚好过了一年保修期了，买过两款雷迪司的UPS，另一款更久前买的，也出现过电池续航不行的情况，电池续航降到了不到5分钟，幸好发现问题时离保修到期还有一个月就在京东申请了换新。感觉雷迪司的UPS电池都衰减得很快。拆解视频：https://www.bilibili.com/video/BV1dy411b77e/抖音商城2.6元的120W充电器测试和拆解：https://blog.zeruns.com/archives/786.html参数机型：D1500容量：1500VA/900W输入电压范围：145~290VAC功率因素：≥0.99 @额定电压（100%负载）输出电压范围（市电模式）：195~255VAC输出频率范围（电池模式）：50Hz ± 0.5Hz输出波形（电池模式）：方波转换时间：≤10ms电池型号：12V/9AH电池数量：2只充电时间：10小时~16小时尺寸：长宽高 320*120*190mm重量：11kg购买地址：雷迪司D1500：https://u.jd.com/xsJjvIr施耐德BK650M2：https://u.jd.com/xiJZA8x华为1KTTS-1KVA/800W：https://u.jd.com/xqJoSOJ拆解正面侧面背面底部拆开盖子后侧面，下面是一个变压器和两块12V9AH的铅酸电池，电池是串联的，上面是电路板。拆开后的顶部主控芯片型号是ATmega168PA，8位的单片机。旁边还有个型号为MC34063A的DCDC降压电源芯片，应该是给单片机和继电器供电的。电路板正面UTC339芯片，四路的电压比较器。EM78M612AAPJ 是一款由 Elan Microelectronics Corporation 制造的微控制器，属于 EM78M612 系列。这个系列是基于 8 位 RISC 架构的通用串行总线（USB）微控制器，适用于低速 USB 设备应用。这款微控制器广泛应用于需要串行通信功能的电子设备或系统中，特别是在 USB 设备应用中，它可以自动识别并解码标准 USB 命令，从而简化 USB 设备的固件设计。电路板上的电容品牌都是AISHI（艾华）。MOS管是无锡紫光微的115N68A，参数为68V 115A。拆掉逆变电路板后电池品牌为LADS，型号SS9-12，12V9AH的铅酸电池，两个串联。正面的液晶显示屏的电路板用电桥测得变压器初级线圈电感值为2.0948mH。分析电子/单片机技术交流QQ群：2169025065大概看了一下走线，简单画了一下这个UPS的逆变部分的电路，只是大概的电路图，各种细节和控制部分没画。这款UPS的逆变器应该属于工频逆变器，就是通过MOS管组成一个H桥电路，然后通过PWM信号控制这些MOS管来产生一个50Hz方波的低压交流电给到工频变压器来升压到220V交流电。（高频逆变器的大概原理是先通过DCDC升压到400V左右，然后再用SPWM波控制MOS管产生一个高频的交流电信号，然后通过电感电容组成LC滤波器来滤出一个低频交流电从而实现逆变，转换效率比工频逆变器高多了，我这个描述可能不太准确，看看就好，大佬可以在评论区讲解一下）然后这个工频的逆变器的次级有4个抽头，通过4个继电器的控制实现：市电直通输出、市电给电池充电、电池逆变输出等功能。走线可以看看下面的PCB图片，我标注了各个接口出来了。UPS市电供电的同时会通过这个工频变压器输出一个低压交流电给到这个H桥电路（这时候这个变压器的初级和次级就相当于调转过来了），H桥电路的这些MOS管的体二极管刚好组成一个整流桥可以整流成直流电，然后经过电容滤波后给电池充电。这个电路相当于一个双向AC-DC变换器。UPS接电池那两根线接到可调电源上，可调电源设置24V电压输出，UPS开启输出，空载功耗18瓦左右，空载功耗略大。测试了一下逆变的转换效率，输入功率104W，输出功率80W，效率在77%左右。尝试过单独给电池充电，几秒钟就充到24V了（两块电池串联），充电电流很小，然后断开充电，电池电压下降得很快。推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html雨云 宁波 8272CL 大带宽高防云服务器性能测评，最高500兆带宽和1TB云盘：https://blog.zeruns.com/archives/789.html基于STM32的同步整流Buck-Boost数字电源 开源：https://blog.zeruns.com/archives/791.html
AI摘要 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A。通过PID算法实现输出控制与保护，含原理图、PCB、源码等开源资料。 此内容根据文章生成，仅用于文章内容的解释与总结 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A，这是我的毕业设计，现在开源出来，含原理图、PCB、程序源码、外壳3D模型等资料。做得一般，勿喷，欢迎友好交流。作品演示视频：https://www.bilibili.com/video/BV1Ui421y7ip/基于CH32V307的智能电子负载开源，嵌入式大赛作品开源：https://blog.zeruns.com/archives/785.html本项目的立创开源平台开源链接：https://url.zeruns.com/noGf0电子/单片机技术交流QQ群：2169025065资料下载地址在文章末尾。硬件电路使用的嘉立创EDA软件来设计，这款软件真的很好用。简介​ 本文设计基于STM32的同步整流Buck-Boost数字电源，该电源电路由MOSFET驱动电路、4开关Buck-Boost电路、信号调理电路、PD快充协议电路、辅助电源电路、单片机控制电路等部分组成。​ 该电源可通过DC接口或Type-C接口供电，而且Type-C接口支持与充电器通过PD快充协议通讯，自动请求并获取最高20V的工作电压。该电源使用STM32G474单片机对输入输出的电压和电流实时监测，并通过PID控制算法来调整输出的PWM占空比，以及实现过压过流保护，还可采样主板温度来实现过温保护。此外可通过OLED屏实时查看电源的参数，并通过旋转编码器和按钮来设置输出电压和电流，还可以通过另一个Type-C接口与上位机通信，通过上位机软件可实时查看电源的各项参数和波形。设计性能参数​ 电源设计性能参数如下表：项目参数指标输入电压范围12Vdc~48Vdc输入电流范围0~10A输出最大功率450W输出电压范围0.5Vdc~48Vdc输出电流范围0~10A输出电压纹波峰峰值≤200mV开关频率181.333kHz实物图使用VOFA+作为上位机软件，可实时查看电源各项参数（输入电压和电流、输出电压和电流、主板温度、MCU温度、电源转换效率等）和波形变化。如下图所示。系统框架图硬件电路设计器件选型计算电感计算​ 在同步BUCK-BOOST电源中，电感的计算需要考虑BUCK模式和BOOST模式下的工作情况，以确保在两种模式下都能满足电路的工作要求。通常，电感的选择会基于两种模式中对电感要求更高的那个模式来进行。​ 当电源工作于BUCK降压模式时，假设输入电压最大为48V，输出电压最小为5V，计算最小的PWM占空比：$$ D_{min} = \frac{V_{out\_min}}{V_{in\_max}} = \frac{5V}{48V} = 10.417\% $$​ 定义电感电流波动量(25%的最大额定电流脉动，设最大额定电流为10A)：$$ \Delta I_L = 25\% \cdot I_{out\_nom} = 25\% \times 10A = 2.5A $$​ 计算最小需要的BUCK电感：$$ L_{minBuck} = \frac{V_{out\_min} \cdot (1 - D_{min})}{\Delta I_L \cdot f_{switch}} = \frac{5V}{2.5A \times 181333Hz} \times (1 - 10.417\%) \approx 9.88\mu H $$​ 当电源工作于BOOST升压模式时，以输入额定电压24V为计算点，计算PWM占空比：$$ D_{Bo} = 1 - \frac{V_{in\_nom}}{V_{out\_max}} = 1 - \frac{24V}{48V} = 50\% $$​ Boost 模式下，取1A（ $I_{minb}$ ）时Boost进入连续模式（CCM），计算电感：$$ L_{minBoost} = \frac{V_{out\_max} \cdot D_{Bo}(1-D_{Bo})^2}{2 \cdot I_{minb} \cdot f_{switch}} = \frac{48V \times 50\% \times (1 - 50\%)^2}{2 \times 1A \times 181333Hz} = 16.544\mu H $$​ 基于公式得出的计算结果，确定了为满足预定纹波电流要求所需的最小电感值。为了确保满足这一条件，应选用一个电感值略高于计算值的电感元件。同时，必须确保所选电感的饱和电流能够承载电路中的最高电流峰值。由于在计算过程中未将效率因素纳入考虑，实际的占空比和峰值电流可能会低于理论计算值。因此，在进行选择时，应该考虑到一定的安全余量，以适应实际工作条件下可能出现的各种情况。​ 综合考虑以上因素，本设计选用1770贴片封装的饱和电流10A以上的22μH的电感作为BUCK-BOOST电路的电感元件。电容计算​ 为了获得较好的输出电压纹波，取设计的电压纹波为50mV。$$ \Delta V_{out} = 0.05V $$​ 上面选用的电感为 22μH 的，所以这里计算也用这个电感值：$$ L_{BB}=22\mu H $$​ 分别计算工作于BUCK降压模式下和BOOST升压模式下所需要的最小电容量 $C_{minBuck}$ 和 $C_{minBoost}$ ：$$ C_{minBuck}=\frac{V_{out\_min}\cdot(1-\frac{V_{out\_min}}{V_{in\_max}})}{8\cdot L_{BB}\cdot \Delta V_{out}\cdot {f_{switch}}^2}=15.48\mu F $$$$ C_{minBoost}=\frac{I_{out\_nom}\cdot(1-\frac{Vin\_min}{Vout\_max})}{\Delta Vout\cdot fswitch}=413.6\mu F $$​ 设计需要留有一定余量，以及为更低的输出纹波，所以选用一颗低ESR的220μF的固态电容加一颗470μF的普通电解电容，共690μF。MOS选型计算​ 在额定输入输出电压范围内，计算输入MOS电流的有效值为：$$ i_{mos\_rms}=7.098A $$​ MOSFET选型中MOS管的额定电流值$I_D$需按流过MOS管最大电流的2倍以上（以防止故障或短路状态下电流过大造成冲击损坏）。$$ 2×i_{mos\_rms}=14.196A $$​ MOSFET选型的额定耐压值$V_{DS}$需大于最大输入电压的1.5倍（以防止尖峰击穿）$$ 1.5×Vin\_max=72V $$​ 在参考了之前的计算之后，对于常规的应用场景，可以选择额定电流超过15安培（A）且耐压等级为100伏特（V）的MOSFET，下管MOSFET选型和上管一样，考虑到发热的情况，为了最大限度地减少导通和开关过程中的能量损耗，应优先选用具有低导通电阻（$R_{DS(on)}$）和低输出电容（Coss）的MOSFET。​ 本设计选用的MOSFET型号为CJAC80SN10，该器件由江苏长晶科技股份有限公司生产，是一款国产化的MOSFET。它具备100V的漏源耐压（$V_{DS}$）和最大80A的漏源电流（$I_D$）。其导通电阻（$R_{DS(on)}$）仅为6.2mΩ，这一低阻特性有利于减少器件在导通状态下的功率损耗。同时，该器件的输出电容Coss具有420pF的典型值，这一较低的电容量有利于降低开关转换过程中的动态损耗。因此，CJAC80SN10在满足项目所需的电气特性的同时，还能有效减少能量损耗，提高系统的整体效率。电源板电路设计主功率电路​ 下图为同步BUCK-BOOST电源主功率电路图，左侧为输入，同步 BUCK降压电路由MOS管Q2和Q4与电感L1组成，同步BOOST升压电路由MOS管Q3和Q5与电感L1组成，每颗MOS管的栅极和源极间均并有10kΩ的电阻，以确保MOS的栅极不悬空，防止误动作导通。​ 主功率电路整体上左右对称结构，输入输出端都设有1个470μF/63V的铝电解电容器和1个220μF/63V的固态铝质电解电容，此外，还有2个小的贴片MLCC（多层陶瓷电容器），参数为10μF/50V，用以过滤端口处的高频噪声干扰。R9和R10作为输入输出端口的假负载，可以在电源断开时能够迅速耗散电路内残留的能量。R13与R14是高精度的5mΩ电阻，用于电流采样，后级接差分放大电路来放大输入输出的电流信号。CNT1和CNT2为输出端子。L1和L2分别是贴片1770封装和直插磁环电感封装，选其中一个焊接即可，两个都画是为了方便测试不同电感的效果和性能。电源输入和快充协议电路​ 下图为电源的输入接口和PD快充协议通信的电路图。​ 电源输入采用了两种接口，分别是DC5.5*2.5mm的母口和TypeC母口，其中TypeC接口支持BC1.2，PD3.0/2.0等多种快充协议，使用的快充协议芯片型号是CH224K，可以与快充充电器通信使充电器输出最高20V的电压，最高支持100W功率。​ D1、D3、D4二极管作用是防止DC接口电压倒灌TypeC接口，设计上是不允许两个接口同时接入的。D5是用于反接保护的二极管。FH1为电源输入保险座，插12A的保险丝。驱动电路​ 在同步BUCK-BOOST电源的设计中，BUCK电路和BOOST电路均包含高侧N-MOSFET。传统上，对于这些高侧N-MOSFET的驱动通常采用变压器隔离驱动的方式，但这种方法会增加电路的复杂性，并且扩大了电路板的尺寸。​ 本设计选用两颗自带自举电路功能的MOS管驱动芯片EG3112用以驱动BUCK电路和BOOST电路的MOS管。EG3112是一款非隔离型的互补双通道驱动芯片；其2A的输出驱动电流能力确保了MOSFET能够迅速导通；芯片还内置了死区时间控制功能，以防止输出驱动信号发生直通，从而提高了系统的稳定性。具体电路如下图所示。​ 以BOOST升压电路的MOS管驱动为例，PWM2L与PWM2H是来自STM32G474微控制器输出的PWM信号，送入EG3112驱动芯片的LIN和HIN引脚，LO为下管驱动信号输出，驱动电阻阻值为10Ω，HO为上管驱动信号输出，驱动电阻阻值为 10Ω，D7为上管驱动电路自举二极管，D9和D11二极管用于快速释放栅极电荷，加快MOS管的关断速度，C14为自举电容。​ 驱动电阻作用是在MOSFET开关过程中，驱动信号可能会在PCB走线、分布电容、电感等元件上产生反射和振荡，通过串联电阻可以减少这种振荡，提高系统的稳定性和可靠性。辅助电源​ 下图是电源板辅助电源供电电路原理图。​ 第一级12V输出的辅助电源电路选用了集成高侧MOSFET的BUCK型电源芯片TPS54360B来设计。按照芯片手册，RT引脚接一个下拉电阻可以设置开关频率，这里选取110kΩ的电阻，对应开关频率是876.5kHz，较高的开关频率可以选择小一点的电感节省空间，根据这个频率计算电感取值应大于9.75μH，这里选取10μH的电感，选取SS310为续流二极管。C26与C27是输入滤波电容；反馈分压电阻R19和R25分压出0.8V的基准电压给芯片FB引脚后保证输出电压在12V时。C18和C19为第一级12V输出辅助电源的滤波电容。第一级12V输出主要供第二级6V降压电路的输入，以及MOSFET驱动电路和散热风扇使用。​ 第二级6V输出的辅助电源电路选用了集成MOSFET的同步整流BUCK型电源芯片SY8205来设计。按照芯片手册说明，芯片开关频率固定为500kHz，选取辅助电源BUCK电路的电感为10μH。C21与C22为输入滤波电容；反馈分压电阻R23和R26分压出0.6V的基准电压给芯片FB引脚后保证输出电压在6V时。C24和C25为第二级6V输出辅助电源的滤波电容。由于直接使用线性稳压器从12V降压到5V会造成比较大的损耗，所以采用先用开关电源降压至接近5V的电压再用线性稳压器降压至目标电压，这样可以保证较高的效率和较低的输出纹波。​ 第二级输出的6V电压经线性稳压芯片AMS1117-5降压成5V作为第三级辅助电源，电压基准芯片REF3033，供信号调理，OLED显示，USB通信等功能电路使用。5V直流电经线性稳压芯片AMS1117-3.3降压成3.3V作为第四级辅助电源，供MCU，蜂鸣器，Flash芯片等电路使用。​ 电压基准芯片REF3033输出3.3V的基准电压供MCU的VREF端口使用，作为MCU内置ADC的参考电压，提高ADC的采样准确性。信号调理电路​ 如上图所示，本设计的输入和输出电压的采样和信号调理电路采用了差分放大技术。差分放大拓扑可以有效地降低开关电源中高频噪声对信号调理电路的干扰，提高了信号稳定和可靠性。在此电路中，选用了低零偏运算放大器GS8558-SR，以提升转换的精度。GS8558-SR运放具有优异的直流精度和低偏置电流特性，这对于提高整个信号调理电路的性能至关重要。​ 差分放大电路的反馈电阻：$$ R_{38}=4.7kΩ $$$$ R_{36}=75kΩ $$​ 计算差分放大倍数：$$ K_V=\frac{R_{38}}{R_{36}}=0.062667 $$​ MCU的ADC最大采样电压为电压基准芯片输出的3.3V，则可以计算出能采样到的输入和输出电压最大值为：$$ V_{max}=\frac{3.3V}{K_V}=52.66V $$​ 为了更好抑制开关电源中的高频噪声对差分放大电路的干扰，在运放的供电管脚添加去耦电容C40和C41用以滤波，电容选用MLCC（多层陶瓷电容器），MLCC由于具有较低的ESR和ESL，在高频噪声的滤波中具有更好的效果，同时输出端添加R35电阻和C39电容构成RC低通滤波器电路，用以滤除高频噪声。​ 如上图所示，输入和输出电流调理电路采用差分放大的方式，输出电流采样电阻为：$$ R_{14}=5mΩ $$​ 差分放大电路的反馈电阻：$$ R_{48}=6.2kΩ $$$$ R_{46}=100Ω $$​ 计算差分放大倍数：$$ K_I=\frac{R_{48}}{R_{46}}=62 $$​ 也就是每1A电流输出310mV的电压。​ MCU的ADC最大采样电压为电压基准芯片输出的3.3V，则可以计算出能采样到的输入和输出电流最大值为：$$ I_{max}=\frac{3.3V}{K_I \times R_{14}}=10.65A $$MCU控制电路​ 本项数字电源设计选用了STM32G474RET6芯片作为控制器，该控制器具有外围电路简洁、控制方式多样、扩展能力优越等显著特点。为了实现精确的时钟信号，控制器采用了外部晶振X1，即一个频率为25兆赫兹（MHz）的石英晶体振荡器。此外，电路中还包含了多个滤波电容器，包括C45、C51、C56、C46和C52，它们分别用于微控制器（MCU）的不同数字电源引脚，以确保电源的稳定性和减少噪声干扰。R49电阻和C49电容构成上电复位电路，SW1为MCU复位按钮。U11是USB转串口的芯片，型号为CH340C，与第二个TypeC接口连接，串口与MCU的USART1接口连接。U10是Flash存储芯片，型号为W25Q64，用来存储参数设置等信息，与MCU的SPI3接口连接。Q6为蜂鸣器的驱动MOS管，用于控制蜂鸣器，MOS管栅极与MCU的PB5端口连接。H1接线端是SWD烧录口。H2和H4是PH2.0接线座，用于与控制面板连接，接线座预留有USART2接口，可方便将控制面板方案更换为串口屏，还可外加ESP32以增加联网和无线控制等功能。D13为5V反接保护二极管。散热风扇驱动和主板温度采样电路​ 主板温度采样电路和散热风扇驱动电路原理图如下图所示。电源主板温度采样的原理是使用NTC热敏电阻R2与下拉电阻R4串联分压输出到MCU的ADC端口进行采样，使用的NTC热敏电阻阻值为10kΩ的，B值为3950K。​ 散热风扇是使用一个N-MOS管来驱动，型号为AO3400，散热风扇接口上反向并联一个二极管D2用于防止由于电机产生的反电动势（back EMF）造成的损害。当电机断电时，由于旋转惯量，电机的转子不会立即停止转动，而是会继续旋转并产生电动势。这个电动势可能会导致电路中的晶体管或集成电路损坏，特别是当电机与这些元件通过半导体开关（如MOSFET）连接时。控制面板电路设计​ 控制面板的电路原理图如下图所示。SW1是旋转编码器，用于设置参数等，SW2和SW3是按钮，SW2用于切换设置项，SW3用于控制电源输出的开启和关闭。LED1是系统运行状态指示灯，正常运行时以500mS的间隔闪烁，LED2是输出状态指示灯，输出开启时亮灯，输出关闭是灭灯。OLED1是OLED屏幕，用于显示电源参数和状态等信息。PCB截图电源板顶层电源板GND层电源板内层2电源板底层面板顶层面板底层使用说明​ 通过按钮和旋转编码器可以设置输出的电压和电流值。如下图所示，反色显示的数值为当前要设置的位，通过旋转编码器可以增加或减少，按下编码器可以切换到下一位进行设置，通过SW2按键可以切换要设置的项目。设置的数据会自动保存到Flash存储芯片里，下次开机会从存储芯片里读出数据。​ SW3按钮开启/关闭电源输出。​ 可切换到数据显示页面查看电源当前的输入输出电压和电流，以及主板温度和MCU温度等信息，如下图所示。​ 可切换到设置页面设置过温/过流/过压保护的阈值，如下图所示。设置的数据会自动保存到Flash存储芯片里，下次开机会从存储芯片里读出数据。纹波测试​ 使用电子负载和示波器测试电源输出性能和输出纹波，如下图所示。在36V输入，12V2A输出时纹波峰峰值测得42mV左右，如下图所示。转换效率测试​ 测试20V输入，12V10A输出时的电源转换效率为92%，如下图所示。​ 下表为各个不同的输入和输出电压下的转换效率，最高效率为94.3%。输入电压(V)输入电流(A)输入功率(W)输出电压(V)输出电流(A)输出功率(W)转换效率(%)20.0034.03580.71215.0105.00075.05092.98547.9995.335256.07524.0409.900237.99692.94048.0007.875378.00036.0209.900356.59894.33848.0009.860473.28045.0309.900445.79794.19323.9988.835212.02248.0704.000192.28090.68923.9989.830235.90035.9986.001216.02491.57412.0999.166110.89924.0704.00096.28086.81720.0082.64552.9214.9709.00044.73084.52220.00810.550211.08424.0308.000192.24091.07336.0006.418231.04824.0109.000216.09093.52636.00010.540379.44035.9509.800352.31092.850MOS管栅极波形​ 测试20V输入，24V输出时的各个MOS栅极波形。​ BUCK电路上下管对地电压波形图：​ BOOST电路上下管对地电压波形图：发热情况测试空载时的热成像图像：输出10A电流10分钟后的热成像图像，MOS管温度100度左右：优利德UTi261M热成像仪开箱测评：https://blog.zeruns.com/archives/798.html元器件购买地址这个项目用到的大部分元件购买地址都在这里：0805电阻电容样品本：https://s.click.taobao.com/begdsktSTM32G474RE芯片：https://s.click.taobao.com/C5yYWltCH224K芯片：https://s.click.taobao.com/4t4bsktCJAC80SN10 MOS管：https://s.click.taobao.com/aPsWWltEG3112芯片：https://s.click.taobao.com/1k9Zskt220μF 63V 固态电容：https://s.click.taobao.com/n60Yskt470μF 63V红宝石电容：https://s.click.taobao.com/WTRUWltGS8558运放：https://s.click.taobao.com/usSVsktTPS54360芯片：https://s.click.taobao.com/r6lSWltSY8205芯片：https://s.click.taobao.com/GxMUsktAMS1117芯片：https://s.click.taobao.com/mxASWltREF3033基准芯片：https://s.click.taobao.com/eOcTsktW25Q64JVSSIQ芯片：https://s.click.taobao.com/QX7TsktCH340C芯片：https://s.click.taobao.com/QYRQWlt3.3V有源蜂鸣器：https://s.click.taobao.com/sovPWltTypeC母座 16P：https://s.click.taobao.com/vjLRskt建议在立创商城里购买元器件：https://activity.szlcsc.com/invite/D03E5B9CEAAE70A4.html在立创开源链接里的BOM表那点立即到立创商城下单可将用到的元器件一键导入到购物车。资料下载地址下面链接包含的资料有：立创EDA工程、原理图PDF文件、各个芯片的数据手册、源代码工程压缩包、一些参考的程序代码。123云盘不限速下载地址：https://www.123pan.com/ps/2Y9Djv-8yevH.html百度网盘下载地址：https://url.zeruns.com/MW2d1项目程序Gitee开源地址：https://gitee.com/zeruns/STM32-Buck-Boost项目程序GitHub开源地址：https://github.com/zeruns/Synchronous-Rectification-Buck-Boost-Digital-Power-Supply-Based-on-STM32求点个Star和点个赞。已知存在的问题辅助电源中的SY8205芯片在低负载时会进入PFM模式，频率较低，从而产生了轻微的噪音。恒流模式的PID控制程序写的不行，只有在纯电阻负载下恒流才稳定。（恒压模式没有问题）其他开源项目推荐做了个三相电量采集器开源出来，可以方便监测家里用电情况：https://blog.zeruns.com/archives/771.html基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版：https://blog.zeruns.com/archives/788.html沁恒CH32V307VCT6最小系统板开源：https://blog.zeruns.com/archives/726.htmlLM25118自动升降压可调DCDC电源模块：https://blog.zeruns.com/archives/727.htmlEG1164大功率同步整流升压模块开源，最高效率97%：https://blog.zeruns.com/archives/730.html基于合宙Air700E的4G环境监测节点（温湿度、气压等数据），通过MQTT上传阿里云物联网平台：https://blog.zeruns.com/archives/747.html基于HT32F52352的智能电子负载开源，合泰杯作品开源：https://blog.zeruns.com/archives/784.html推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html内网穿透服务器搭建教程，NPS搭建和使用教程：https://blog.zeruns.com/archives/741.html雨云 宁波 8272CL 大带宽高防云服务器性能测评，最高500兆带宽和1TB云盘：https://blog.zeruns.com/archives/789.html抖音商城2.6元的120W充电器测试和拆解：https://blog.zeruns.com/archives/786.html
AI摘要 抖音商城2.6元购买的120W快充充电器测试与拆解，实际性能虚标严重，最大输出仅12V，转换效率低，用料差，不建议购买。 此内容根据文章生成，仅用于文章内容的解释与总结 抖音商城2.6元买的120W快充充电器测试和拆解。这个充电器宣称为适用于华为，外形也是仿照华为充电器的。给大家拆一个看看这种几块钱的充电器质量如何。测试和拆解视频：https://www.bilibili.com/video/BV1kf42127Cu/优利德/拓利亚可调电源X08P3010开箱评测拆解：https://blog.zeruns.com/archives/698.html睿登RD6012P数控可调电源简单开箱评测，60V 12A数控直流电源，开关降压+线性降压：https://blog.zeruns.com/archives/740.html华为原装100W充电器购买地址：https://u.jd.com/9sxOBRm产品外形只有一个USB-A口输出，下面写着120w Fast Charge充电器下面印着的信息。型号：120W输入：180-240V ~ 1.8A 50/60Hz输出：5V/9V/12V/15V=3A，20V=3.3A生产厂家是：深圳市威特美贸易有限公司充电器重量53.5克。测试先测试一下支持的快充协议，还挺多的，但最大输出电压只支持到12V，达不到标称的20V。实测最高输出电压12V，最大输出功率15.6瓦，在满载时输出电压从12V被拉低到9V，充电器的转换效率在80%左右。充电器输出12V1A时的纹波峰峰值在460mV左右，纹波高了点。5V输出空载时的纹波如下图所示，纹波峰峰值一百多毫伏左右。拆解拆开顶部的盖子把电路板取出，变压器上面有一个配重铁块。这个电源应该是反激式的开关电源。取下配重块PCB底面侧面，可以看到交流输入侧的滤波电容为400V 6.8μF的，容量偏小，Y电容为2.2nF的。输出端的滤波电容由于被USB接口挡住，只看到耐压值为16V，容值看不到，用电桥测得为644μF。交流输入端的整流桥前串联了一个碳膜电阻做限流电阻。整流桥型号为MB10F，性能参数为1000V/1A。高频变压器初级侧的电源芯片型号为FAB3B09A，资料搜不到。芯片的2号脚通过一个1Ω的电阻接到整流桥负极，这个应该是检流电阻，用来检测电流，把阻值减小应该可以提高输出功率，但不安全。输出端有一个型号为QC7801/FAE41150的芯片，也是查不到资料，应该是一个MOS管。光耦型号为PC817CUSB接口旁的6脚小芯片，应该是快充协议芯片，型号为118/352DEA，也是完全查不到资料。这种电源不建议购买，用料实在太差了，而且性能严重虚标。推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html内网穿透服务器搭建教程，NPS搭建和使用教程：https://blog.zeruns.com/archives/741.html雨云GPU云服务器搭建SD(Stable Diffusion)的教程，搭建自己的AI绘画网站：https://blog.zeruns.com/archives/768.html基于CH32V307的智能电子负载开源，嵌入式大赛作品开源：https://blog.zeruns.com/archives/785.html
基于CH32V307的智能电子负载开源，嵌入式大赛作品开源
AI摘要 基于CH32V307的智能电子负载设计，含原理图、PCB、源码等，使用RT-Thread系统，支持恒压、恒流等功能，适用于嵌入式大赛作品。 此内容根据文章生成，仅用于文章内容的解释与总结 基于CH32V307VCT6的智能电子负载开源，嵌入式大赛作品开源，含原理图、PCB、程序源码、作品报告。2023年嵌入式芯片与系统设计竞赛应用赛道，国二作品。用半个月时间在之前做的合泰版的电子负载的基础上改的，移植了程序到CH32单片机，并使用了RT-Thread系统，优化了一下代码，赶工做出来，做得很一般，勿喷。作品演示视频：https://www.bilibili.com/video/BV1Zu4y1m7Zd/基于HT32F52352的智能电子负载开源，合泰杯作品开源：https://blog.zeruns.com/archives/784.html本开源作品仅供参考学习，不建议复刻，立创开源平台上有更多更好的更完善的电子负载开源作品！本项目的立创开源平台开源链接：https://url.zeruns.com/Et4x4电子/单片机技术交流群：2169025065沁恒官网可以免费申请开发板样品：https://url.zeruns.com/h9a99什么是电子负载电子负载是一种电子设备，用于模拟真实负载环境，以测试电源或电子电路的性能。比起使用大功率可调电阻或者电炉丝等传统的无源负载，电子负载具有参数可调，使用方便等诸多优势。无论是专业的电子工程项目开发还是业余的电子爱好者，电子负载仪都是必备的设备之一。电子负载从测试电源的种类来分可以分为交流电子负载和直流电子负载。从功能上划分常见的有恒流、恒压、恒阻、恒功率四种类型。因为我们常见的大多数电源都是恒压直流电源。测试这类电源时，主要测试的是其电流输出能力。所以大多数的应用场景中，直流恒流电子负载是最为常见的类型。而电子负载从控制方式上划分则又可以分为数控和模拟两种类型。相较于使用纯模拟电路控制的电子负载，数控电子负载使用数字控制，在参数调节上更为直观，而且功能丰富、扩充简单，还可以方便的实现测试的自动化。项目简介本作品采用 CH32V307VCT6 沁恒单片机作为主控芯片设计的电子负载，供电方式由18650锂电池供电，方便携带。控制方式为通过单片机DAC输出一个直流电压作为参考电压给到运放与电流/电压采样放大后的电压做比较，运放输出控制MOS管，从而实现恒压/恒流。触控屏用的是陶晶驰的2.8寸串口屏，型号为：TJC3224T028_011R。散热器用的是2U服务器的1356/1366针散热器，侧吹的。项目程序使用RT-Thread Studio开发。电路设计用的立创EDA软件。最大输入电压电流为100V/10A，最大功率200W。实物图当时没拍多少照片，就找到这几张了，可以去看看演示视频。资料下载地址下面链接中的资料有：电路原理图、立创EDA工程文件、PCB制板文件、程序源码、串口屏工程文件、芯片手册。123云盘不限速下载地址：https://www.123pan.com/ps/2Y9Djv-6NevH.html百度网盘下载地址：https://pan.baidu.com/s/17YSlBZ6F1M18k7JGa7FlVA?pwd=buxx 提取码：buxx元件购买地址CH32V307VCT6芯片：https://s.click.taobao.com/T8MSZotCH32V307VCT6开发板：https://s.click.taobao.com/2JBSZotINA199A1芯片：https://s.click.taobao.com/XLuweot0805贴片电阻样品本：https://s.click.taobao.com/p8YSGpt0805贴片电容样品本：https://u.jd.com/9uvZoBdXL1509芯片：https://s.click.taobao.com/DOcRZot串口屏：https://s.click.taobao.com/pyzleot建议在立创商城里购买元器件：https://activity.szlcsc.com/invite/D03E5B9CEAAE70A4.html原理图功率板电源板控制板PCB功率板顶层底层电源板顶层底层控制板顶层底层其他开源项目推荐做了个三相电量采集器开源出来，可以方便监测家里用电情况：https://blog.zeruns.com/archives/771.html移植好U8g2图形库的STM32F407标准库工程模板：https://blog.zeruns.com/archives/722.html沁恒CH32V307VCT6最小系统板开源：https://blog.zeruns.com/archives/726.htmlLM25118自动升降压可调DCDC电源模块：https://blog.zeruns.com/archives/727.htmlEG1164大功率同步整流升压模块开源，最高效率97%：https://blog.zeruns.com/archives/730.html基于合宙Air700E的4G环境监测节点（温湿度、气压等数据），通过MQTT上传阿里云物联网平台：https://blog.zeruns.com/archives/747.html主要代码main.c文件/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2021/06/06 * Description : Main program body. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * SPDX-License-Identifier: Apache-2.0 * https://blog.zeruns.com *******************************************************************************/ #include "ch32v30x.h" #include <rtthread.h> #include <rtdevice.h> #include <stdlib.h> #include <rthw.h> #include "drivers/pin.h" #include <board.h> #include <rtdbg.h> #include <u8g2_port.h> #include <qpid.h> #include "USART.h" #include "KEY.h" #include "DAC.h" #include "PWM.h" /* Global typedef */ /* Global define */ #define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */ static rt_device_t wdg_dev; /* 看门狗设备句柄 */ /* ADC参考电压 */ #define VREF 3.3 /* 电源电压 */ #define VCC 3.3 /* 补偿校准数据 */ #define V0_COMP 1.000 // 0.0325倍电压档位 #define V1_COMP 1.000 // 0.0947倍电压档位 #define V2_COMP 1.000 // 0.6175倍电压档位 #define YIF1_COMP 1.00 // MOS管1電流採樣補償 #define YIF2_COMP 1.00 // MOS管2電流採樣補償 #define DAC1_COMP 1.00 // DAC1(VREF)输出补偿系数 #define IREF2_COMP 1.00 // IREF2输出补偿系数 #define DAC2_COMP 1.00 // DAC2(IREF1)输出补偿 /* ADC採樣平均值計算次數 */ #define ADC_count 3 /* 一阶低通滤波器滤波系数*/ #define dPower1 0.5 /* 引脚编号，通过查看驱动文件drv_gpio.c确定 */ #define OLED_I2C_PIN_SCL 22 //PB6 #define OLED_I2C_PIN_SDA 23 //PB7 #define LED2 59 //PD11 #define LED1 60 //PD12 #define MCU_G0 62 //PD14 #define MCU_G1 63 //PD14 /* Global Variable */ u8g2_t u8g2; // u8g2的结构体变量 rt_uint16_t AD_Value[4]; //ADC采样数据 // 定义模式页面的枚举变量 enum mode_type { menu = 0, // 菜单 CC, // 恒流 CV, // 恒压 CR, // 恒阻 CW // 恒功率 }; volatile uint8_t Eload_Out = 0; // 电子负载输出开启/关闭状态 volatile uint8_t mode = menu; // 当前模式 volatile uint8_t voltage_dw = 0; // 电压采样档位，0为0.0325倍，2为0.6175倍，1为0.0947倍 volatile double YVF, YIF1, YIF2, YIF, VBAT; // 当前电压电流 volatile double ISET, VSET, RSET, PSET; // 电流、电压、电阻、功率设置值 volatile uint32_t YVF_SUM, YIF1_SUM, YIF2_SUM, VBAT_SUM; // 电压电流算平均值用的计算总和 volatile uint8_t AVG_count = 0; // 电流平均值计算累加计数值 volatile uint8_t YVF_AVG_count = 0; // 电压平均值计算累加计数值 volatile uint8_t VBAT_count = 0; // 电池电压平均值计算累加计数值 volatile uint8_t Key_ONOFF = 0; // 电子负载开启关闭按钮是否被按下状态 static qpid_t qpid_CC; // PID控制数据指针 static qpid_t qpid_CV; // PID控制数据指针 static qpid_t qpid_CR; // PID控制数据指针 static qpid_t qpid_CW; // PID控制数据指针 static double I_SET, V_SET, R_SET, P_SET; /* 函数声明 */ void OLED_Init(void); static int IWDG_Init(); static void thread1_sysLED_entry(void *parameter); static void thread2_OLED_entry(void *parameter); static void thread3_ADC_entry(void *parameter); static void thread4_HMI_GetDate_entry(void *parameter); static void thread5_ONOFF_entry(void *parameter); static void thread7_HMI_Display_entry(void *parameter); static void thread8_FAN_entry(void *parameter); static void thread9_CWCR_entry(void *parameter); static void thread10_BlueTooth_entry(void *parameter); void CW_mode(void); void CR_mode(void); void key123(void); void Thread_Init(void); void SYS_Init(void); void PID(void); /********************************************************************* * @fn main * * @brief Main program. * * @return none */ int main(void) { rt_kprintf("MCU: CH32V307\n"); rt_kprintf("SysClk: %dHz\n", SystemCoreClock); SYS_Init(); while (1) { // 过流和过功率保护 if (YIF > 10 | YVF * YIF > 300) { if (Eload_Out == 1) { Key_ONOFF = 1; } } rt_thread_mdelay(20); } } /* 系统初始化 */ void SYS_Init(void) { IWDG_Init(); // 初始化看门狗 UART_Init(); // 串口3初始化 HMILCD_Send("page 0"); // 切到启动页 Dac_Init(); // 初始化DAC PWM_Init(); // 初始化PWM rt_pin_mode(MCU_G0, PIN_MODE_OUTPUT); // 设置IO口为输出模式 rt_pin_mode(MCU_G1, PIN_MODE_OUTPUT); rt_pin_write(MCU_G0, PIN_LOW); // 输出低电平 rt_pin_write(MCU_G1, PIN_LOW); Thread_Init(); // 创建线程 } /* 线程初始化 */ void Thread_Init(void) { rt_thread_t tid = NULL; //定义一个线程控制块指针 /* 创建线程 */ tid = rt_thread_create("SYS_LED", thread1_sysLED_entry, NULL, 512, 30, 5); //创建一个名为SYS_LED的线程，入口函数为thread1_sysLED_entry，参数为NULL，栈大小为256字节，优先级为30，时间片为5个tick if (tid != RT_NULL) // 判断线程是否创建成功 { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread sysLED create success"); } else { LOG_E("thread1 sysLED create failed..."); } /* tid = rt_thread_create("OLED_Display", thread2_OLED_entry, NULL, 2048, 25, 30); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread2 OLED create success"); } else { LOG_E("thread2_OLED create failed..."); }*/ tid = rt_thread_create("ADC", thread3_ADC_entry, NULL, 1536, 18, 30); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread3 ADC create success"); } else { LOG_E("thread3 ADC create failed..."); } tid = rt_thread_create("HMI_GetDate", thread4_HMI_GetDate_entry, NULL, 2048, 23, 30); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread4 HMI_GetDate create success"); } else { LOG_E("thread4 HMI_GetDate create failed..."); } tid = rt_thread_create("ONOFF", thread5_ONOFF_entry, NULL, 1024, 15, 25); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread5 ONOFF create success"); } else { LOG_E("thread5 ONOFF create failed..."); } tid = rt_thread_create("KEY", thread6_KEY_entry, NULL, 512, 20, 20); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread6 KEY create success"); } else { LOG_E("thread6 KEY create failed..."); } tid = rt_thread_create("HMI_Display", thread7_HMI_Display_entry, NULL, 1024, 25, 30); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread7 HMI_Display create success"); } else { LOG_E("thread7 HMI_Display create failed..."); } tid = rt_thread_create("FAN", thread8_FAN_entry, NULL, 512, 26, 15); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread8 FAN create success"); } else { LOG_E("thread8 FAN create failed..."); } tid = rt_thread_create("CWCR", thread9_CWCR_entry, NULL, 512, 19, 15); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread9 CWCR create success"); } else { LOG_E("thread9 CWCR create failed..."); } tid = rt_thread_create("BlueTooth", thread10_BlueTooth_entry, NULL, 2048, 23, 30); if (tid != RT_NULL) { if (rt_thread_startup(tid) == RT_EOK) // 启动线程 LOG_D("thread10 BlueTooth create success"); } else { LOG_E("thread10 BlueTooth create failed..."); } } /* 一阶低通滤波 * 返回值：iData 经过一阶滤波后的采样值 */ double lowV1(double com1) { static double iLastData1; //上一次值 double iData1; //本次计算值 iData1 = (com1 * dPower1) + (1 - dPower1) * iLastData1; //计算 iLastData1 = iData1; //存贮本次数据 return iData1; //返回数据 } double lowV2(double com1) { static double iLastData2; //上一次值 double iData1; //本次计算值 iData1 = (com1 * dPower1) + (1 - dPower1) * iLastData2; //计算 iLastData2 = iData1; //存贮本次数据 return iData1; //返回数据 } u16 lowV3(u16 com1) { static u16 iLastData3; //上一次值 u16 iData1; //本次计算值 iData1 = (com1 * dPower1) + (1 - dPower1) * iLastData3; //计算 iLastData3 = iData1; //存贮本次数据 return iData1; //返回数据 } u16 lowV4(u16 com1) { static u16 iLastData3; //上一次值 u16 iData1; //本次计算值 iData1 = (com1 * 0.1) + (1 - 0.1) * iLastData3; //计算 iLastData3 = iData1; //存贮本次数据 return iData1; //返回数据 } static void idle_hook(void) { /* 在空闲线程的回调函数里喂狗 */ rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL); //rt_kprintf("feed the dog!\n "); } static int IWDG_Init() { rt_err_t ret = RT_EOK; rt_uint32_t timeout = 1; /* 溢出时间，单位：秒 */ /* 根据设备名称查找看门狗设备，获取设备句柄 */ wdg_dev = rt_device_find(WDT_DEVICE_NAME); if (!wdg_dev) { rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME); return RT_ERROR; } /* 初始化设备 */ rt_device_init(wdg_dev); /* 设置看门狗溢出时间 */ ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout); if (ret != RT_EOK) { rt_kprintf("set %s timeout failed!\n", WDT_DEVICE_NAME); return RT_ERROR; } /* 启动看门狗 */ ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL); if (ret != RT_EOK) { rt_kprintf("start %s failed!\n", WDT_DEVICE_NAME); return -RT_ERROR; } /* 设置空闲线程回调函数 */ rt_thread_idle_sethook(idle_hook); return ret; } /* 线程 1 的入口函数,系统运行状态灯闪烁 */ static void thread1_sysLED_entry(void *parameter) { /* LED1引脚为输出模式 */ rt_pin_mode(LED1, PIN_MODE_OUTPUT); /* 默认低电平 */ rt_pin_write(LED1, PIN_LOW); while (1) { /* 线程 1 采用低优先级运行，一直闪烁LED1 */ rt_pin_write(LED1, !rt_pin_read(LED1)); rt_thread_mdelay(500); } } /* 线程 2 的入口函数,OLED屏显示信息 */ static void thread2_OLED_entry(void *parameter) { // Initialization u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_rtthread_hw_i2c, u8x8_gpio_and_delay_rtthread); u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); u8g2_InitDisplay(&u8g2); u8g2_SetPowerSave(&u8g2, 0); while (1) { char String[26]; u8g2_ClearBuffer(&u8g2); u8g2_SetFont(&u8g2, u8g2_font_wqy15_t_chinese3); // 设置中文字符集 float V0 = AD_Value[0] * VREF / 4096.0; sprintf(String, "AD0:%d V:%d.%d%d%d", AD_Value[0], (uint8_t) V0, (uint16_t)(V0 * 10.0) % 10, (uint16_t)(V0 * 100.0) % 100 % 10, (uint16_t)(V0 * 1000.0) % 1000 % 100 % 10); // 格式化字符串输出到字符串变量 u8g2_DrawStr(&u8g2, 0, 15, String); float V1 = AD_Value[1] * VREF / 4096.0; sprintf(String, "AD1:%d V:%d.%d%d%d", AD_Value[1], (uint8_t) V1, (uint16_t)(V1 * 10.0) % 10, (uint16_t)(V1 * 100.0) % 100 % 10, (uint16_t)(V1 * 1000.0) % 1000 % 100 % 10); // 格式化字符串输出到字符串变量 u8g2_DrawStr(&u8g2, 0, 31, String); float V2 = AD_Value[2] * VREF / 4096.0; sprintf(String, "AD2:%d V:%d.%d%d%d", AD_Value[2], (uint8_t) V2, (uint16_t)(V2 * 10.0) % 10, (uint16_t)(V2 * 100.0) % 100 % 10, (uint16_t)(V2 * 1000.0) % 1000 % 100 % 10); // 格式化字符串输出到字符串变量 u8g2_DrawStr(&u8g2, 0, 47, String); float V3 = AD_Value[3] * VREF / 4096.0; sprintf(String, "AD3:%d V:%d.%d%d%d", AD_Value[3], (uint8_t) V3, (uint16_t)(V3 * 10.0) % 10, (uint16_t)(V3 * 100.0) % 100 % 10, (uint16_t)(V3 * 1000.0) % 1000 % 100 % 10); // 格式化字符串输出到字符串变量 u8g2_DrawStr(&u8g2, 0, 63, String); u8g2_SendBuffer(&u8g2); // 发送缓冲区数据 rt_thread_mdelay(100); // 延时100毫秒 } } /* 线程 3 的入口函数,ADC数据处理 */ static void thread3_ADC_entry(void *parameter) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); //使能GPIOA时钟和ADC RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //启用DMA1时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC时钟分配配置，6分频（72Mhz/6=12Mhz），ADC时钟频率不能大于14Mhz GPIO_InitTypeDef GPIO_InitStructure = { 0 }; //定义结构体配置GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //设置GPIO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO模式为模拟输入 GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); //配置ADC规则组，在规则组的序列1写入通道0，采样时间55.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5); //配置ADC规则组，在规则组的序列2写入通道1，采样时间55.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5); //配置ADC规则组，在规则组的序列3写入通道2，采样时间55.5个周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5); //配置ADC规则组，在规则组的序列4写入通道3，采样时间55.5个周期 ADC_InitTypeDef ADC_InitStructure = { 0 }; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //配置ADC为独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //多通道模式下开启扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //设置开启连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //设置转换不是由外部触发启动，软件触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //设置ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 4; //规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); //使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器。 while (ADC_GetResetCalibrationStatus(ADC1)) ; //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准 while (ADC_GetCalibrationStatus(ADC1)) ; //等待校准结束 DMA_DeInit(DMA1_Channel1); //复位DMA控制器 DMA_InitTypeDef DMA_InitStructure; //定义结构体配置DMA DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) &ADC1->RDATAR; //配置外设地址为ADC数据寄存器地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32) AD_Value; //配置存储器地址为读取ADC值地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //配置数据源为外设，即DMA传输方式为外设到存储器 DMA_InitStructure.DMA_BufferSize = 4; //设置DMA数据缓冲区大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA外设递增模式关闭 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA存储器递增模式开启 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //设置外设数据大小为半字，即两个字节 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //设置存储器数据大小为半字，即两个字节 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //设置DMA模式为循环传输模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA传输通道优先级为高，当使用一 DMA通道时，优先级设置不影响 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //因为此DMA传输方式为外设到存储器，因此禁用存储器到存储器传输方式 DMA_Init(DMA1_Channel1, &DMA_InitStructure); //初始化DMA1的通道1，ADC1的硬件触发接在DMA1的通道1上，所以必须使用DMA1通道1 DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA1通道1 ADC_DMACmd(ADC1, ENABLE); // 使能ADC DMA 请求 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 由于没有采用外部触发，所以使用软件触发ADC转换 qpid_init(&qpid_CC); // 初始化PID控制数据 qpid_set_lmt(&qpid_CC, 0, 10); // 設置PID限值 qpid_set_ratio(&qpid_CC, 1, 0.001, 0.1); // 设置控制比率系数 qpid_init(&qpid_CV); // 初始化PID控制数据 qpid_set_lmt(&qpid_CV, 31.0, 100); // 設置PID限值 qpid_set_ratio(&qpid_CV, 0.35, 0.005, 0.001); // 设置控制比率系数 qpid_init(&qpid_CW); // 初始化PID控制数据 qpid_set_lmt(&qpid_CW, 0.1, 200); // 設置PID限值 qpid_set_ratio(&qpid_CW, 0.5, 0.003, 0.001); // 设置控制比率系数 qpid_init(&qpid_CR); // 初始化PID控制数据 qpid_set_lmt(&qpid_CR, 0.1, 1000); // 設置PID限值 qpid_set_ratio(&qpid_CR, 0.35, 0.003, 0.001); // 设置控制比率系数 while (1) { /*rt_kprintf("AD0:%d V:%f\n", AD_Value[0], AD_Value[0] / 4095.0 * VREF); rt_kprintf("AD1:%d V:%4.3f\n", AD_Value[1], (float) AD_Value[1] / 4095.0 * VREF); rt_kprintf("AD2:%d V:%4.3f\n", AD_Value[2], AD_Value[2] / 4095.0 * VREF);*/ if (voltage_dw == 0) // 电压采样档位为0.0325倍时 { if (YVF_AVG_count < ADC_count) // 小于15时采样值累加 { YVF_SUM += AD_Value[0]; YVF_AVG_count++; } if (YVF_AVG_count == ADC_count) { YVF = YVF_SUM / YVF_AVG_count * VREF / 4096.0 / 0.0325 * V0_COMP; // 计算电压值 YVF_AVG_count = 0; YVF_SUM = 0; } if (YVF <= 31.0) // 电压小于31V时，切换档位 { rt_pin_write(MCU_G0, PIN_LOW); rt_pin_write(MCU_G1, PIN_HIGH); // 电压采样挡0.0947倍 if (Eload_Out == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } voltage_dw = 1; YVF_AVG_count = 0; YVF_SUM = 0; qpid_set_lmt(&qpid_CV, 4.6, 33.5); // 設置PID限值 qpid_set_ratio(&qpid_CV, 0.38, 0.0035, 0.0005); // 设置控制比率系数 } } else if (voltage_dw == 1) // 电压档位为0.0947倍时 { if (YVF_AVG_count < ADC_count) { YVF_SUM += AD_Value[0]; YVF_AVG_count++; } if (YVF_AVG_count == ADC_count) { YVF = YVF_SUM / YVF_AVG_count * VREF / 4096.0 / 0.0947 * V1_COMP; YVF_AVG_count = 0; YVF_SUM = 0; } if (YVF >= 33.5) // 电压大于33.5V切换到0.0325倍档位 { rt_pin_write(MCU_G0, PIN_LOW); rt_pin_write(MCU_G1, PIN_LOW); if (Eload_Out == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0325 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } voltage_dw = 0; YVF_AVG_count = 0; YVF_SUM = 0; qpid_set_lmt(&qpid_CV, 31.0, 100); // 設置PID限值 qpid_set_ratio(&qpid_CV, 0.5, 0.005, 0.0005); // 设置控制比率系数 } else if (YVF <= 4.6) // 电压小于4.6V时切换档位 { rt_pin_write(MCU_G0, PIN_HIGH); rt_pin_write(MCU_G1, PIN_LOW); if (Eload_Out == 1) { uint16_t vset_pwm = (uint16_t)(VSET * 0.6175 * 4096 / VREF * DAC1_COMP + 0.5); if (vset_pwm > 4065) vset_pwm = 4095; DAC_SetChannel1Data(DAC_Align_12b_R, vset_pwm); // 设置DAC1输出值，控制恒压 } voltage_dw = 2; YVF_AVG_count = 0; YVF_SUM = 0; qpid_set_lmt(&qpid_CV, 0.01, 5.1); // 設置PID限值 qpid_set_ratio(&qpid_CV, 0.26, 0.0025, 0.0005); // 设置控制比率系数 } } else if (voltage_dw == 2) // 电压档位为0.6175倍时 { if (YVF_AVG_count < ADC_count) { YVF_SUM += AD_Value[0]; YVF_AVG_count++; } if (YVF_AVG_count == ADC_count) { YVF = YVF_SUM / YVF_AVG_count * VREF / 4096.0 / 0.6175 * V2_COMP; if (YVF < 0.15) YVF = 0; YVF_AVG_count = 0; YVF_SUM = 0; } if (YVF >= 5.1) // 电压大于5.1V时，切换档位 { rt_pin_write(MCU_G0, PIN_LOW); rt_pin_write(MCU_G1, PIN_HIGH); if (Eload_Out == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } voltage_dw = 1; YVF_AVG_count = 0; YVF_SUM = 0; qpid_set_lmt(&qpid_CV, 4.6, 33.5); // 設置PID限值 qpid_set_ratio(&qpid_CV, 0.38, 0.0035, 0.0005); // 设置控制比率系数 } } if (AVG_count < ADC_count) { YIF1_SUM += AD_Value[1]; // MOS管1电流累加 YIF2_SUM += AD_Value[2]; // MOS管2电流累加 AVG_count++; } if (AVG_count == ADC_count) { YIF1 = YIF1_SUM / AVG_count * VREF / 4096.0 / 50 / 0.01 * YIF1_COMP - 0.007; YIF2 = YIF2_SUM / AVG_count * VREF / 4096.0 / 50 / 0.01 * YIF2_COMP - 0.007; YIF = YIF1 + YIF2; if (YIF < 0.008) YIF = 0; AVG_count = 0; YIF1_SUM = 0; YIF2_SUM = 0; PID(); } if (VBAT_count < 5) { VBAT_SUM += lowV4(AD_Value[3]); // 电池电压采样值累加 VBAT_count++; } if (VBAT_count == 5) { VBAT = VBAT_SUM / VBAT_count * VREF / 4096.0 / 0.3535; VBAT_count = 0; VBAT_SUM = 0; } rt_thread_mdelay(5); } } // https://blog.zeruns.com /* 线程 4 的入口函数，对串口屏发来的数据进行处理 */ static void thread4_HMI_GetDate_entry(void *parameter) { HMILCD_Send("CC.x0.val=0"); // 屏幕显示的电流设定值清零 HMILCD_Send("CV.x0.val=0"); // 屏幕显示的电压设定值清零 HMILCD_Send("CR.x0.val=0"); // 屏幕显示的电阻设定值清零 HMILCD_Send("CW.x0.val=0"); // 屏幕显示的功率设定值清零 while (1) { if (Serial3_RxFlag == 1) { if (Serial3_RxPacket[0] == 0x01) // 当前是主菜单页面 { if (Serial3_RxPacket[1] == 0x10) // 恒流按钮按下 { HMILCD_Send("page CC"); // 切换到恒流模式页面 mode = CC; // 设置当前模式恒流模式 } else if (Serial3_RxPacket[1] == 0x11) // 恒压按钮按下 { HMILCD_Send("page CV"); // 切换到恒压页面 mode = CV; // 设置当前模式为恒压模式 } else if (Serial3_RxPacket[1] == 0x12) // 恒阻按钮按下 { HMILCD_Send("page CR"); // 切换到恒阻页面 mode = CR; // 设置当前模式为恒阻模式 } else if (Serial3_RxPacket[1] == 0x13) // 恒功率按钮按下 { HMILCD_Send("page CW"); // 切换到恒功率页面 mode = CW; // 设置当前模式为恒功率模式 } } else if (Serial3_RxPacket[0] == 0x02) // 当前是恒流模式页面 { if (Serial3_RxPacket[1] == 0x10) // 菜单按钮按下 { HMILCD_Send("CC.t1.txt=\"OFF\""); // 屏幕右上角标题框显示OFF HMILCD_Send("CC.b1.txt=\"开启\""); // 屏幕右下角按钮显示开启 Eload_Out = 0; // 负载输出状态设置为关闭 DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); // 切换到菜单页面 mode = menu; } else if (Serial3_RxPacket[1] == 0x11) // 开启按钮按下并且当前负载输出状态为关闭 { Key_ONOFF = 1; } } else if (Serial3_RxPacket[0] == 0x03) // 当前是恒压模式页面 { if (Serial3_RxPacket[1] == 0x10) // 菜单按钮按下 { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } if (Serial3_RxPacket[1] == 0x11) // 开启按钮按下并且当前负载输出状态为关闭 { Key_ONOFF = 1; } } else if (Serial3_RxPacket[0] == 0x04) // 当前是恒阻模式页面 { if (Serial3_RxPacket[1] == 0x10) // 菜单按钮按下 { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } if (Serial3_RxPacket[1] == 0x11) // 开启按钮按下并且当前负载输出状态为关闭 { Key_ONOFF = 1; } } else if (Serial3_RxPacket[0] == 0x05) // 当前是恒功率模式页面 { if (Serial3_RxPacket[1] == 0x10) // 菜单按钮按下 { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } if (Serial3_RxPacket[1] == 0x11) // 开启按钮按下并且当前负载输出状态为关闭 { Key_ONOFF = 1; } } else if (Serial3_RxPacket[0] == 0xAA) // 当前为数字键盘页面 { char *temp = Serial3_RxPacket; temp++; // 地址自增1 uint16_t temp2 = atoi(temp); // 字符串转整形 if (mode == CC) { if (temp2 > 1000) temp2 = 1000; ISET = temp2 / 100.0; HMILCD_Send("CC.x0.val=%d", temp2); if (Eload_Out == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, 0); if (ISET <= 2.5) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4(0); // 设置IREF2 } else { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(ISET / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } } } else if (mode == CV) { VSET = temp2 / 100.0; HMILCD_Send("CV.x0.val=%d", temp2); if (Eload_Out == 1) { DAC_SetChannel2Data(DAC_Align_12b_R, 4095); // 设置IREF1 PWM_SetCCR4(50000); // 设置IREF2 if (voltage_dw == 0) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0325 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 2) { uint16_t vset_pwm = (uint16_t)(VSET * 0.6175 * 4096 / VREF * DAC1_COMP + 0.5); if (vset_pwm > 4065) vset_pwm = 4095; DAC_SetChannel1Data(DAC_Align_12b_R, vset_pwm); // 设置DAC1输出值，控制恒压 } } } else if (mode == CR) { RSET = temp2 / 100.0; HMILCD_Send("CR.x0.val=%d", temp2); //CR_mode(); } else if (mode == CW) { PSET = temp2 / 100.0; HMILCD_Send("CW.x0.val=%d", temp2); //CW_mode(); } } Serial3_RxFlag = 0; } key123(); rt_thread_mdelay(35); } } /*恒功率模式*/ void CW_mode(void) { double Ptemp = PSET / YVF; if (Ptemp > 10) Ptemp = 10; if (Eload_Out == 1) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(Ptemp / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(Ptemp / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } else { DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } /*恒阻模式*/ void CR_mode(void) { double Rtemp = YVF / RSET; if (Rtemp > 10) Rtemp = 10; if (Eload_Out == 1) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(Rtemp / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(Rtemp / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } else { DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } /* PID控制 */ void PID(void) { double Ptemp, Rtemp; if (mode == CC && Eload_Out == 1) { qpid_set_dst(&qpid_CC, ISET); // 設置PID目標值 I_SET = qpid_cal_pos(&qpid_CC, YIF); // PID計算 if (ISET <= 2.5) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(I_SET * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); } else { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(I_SET / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(I_SET / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } } if (mode == CV && Eload_Out == 1) { qpid_set_dst(&qpid_CV, VSET); // 設置PID目標值 V_SET = qpid_cal_pos(&qpid_CV, YVF); // PID計算 if (voltage_dw == 0) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(V_SET * 0.0325 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(V_SET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 2) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(V_SET * 0.6175 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } } if (mode == CW && Eload_Out == 1) { qpid_set_dst(&qpid_CW, PSET); // 設置PID目標值 P_SET = qpid_cal_pos(&qpid_CW, YIF * YVF); // PID計算 Ptemp = P_SET / YVF; if (Ptemp > 10) Ptemp = 10; // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(Ptemp / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(Ptemp / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } if (mode == CR && Eload_Out == 1) { qpid_set_dst(&qpid_CR, RSET); // 設置PID目標值 R_SET = qpid_cal_pos(&qpid_CR, YVF / YIF); // PID計算 Rtemp = YVF / R_SET; if (Rtemp > 10) Rtemp = 10; // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(Rtemp / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(Rtemp / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } } /* 按键处理函数 */ void key123(void) { if (key[2] == 1) // 按键2，切换键 { if (mode == menu) { HMILCD_Send("page CC"); // 切换到恒流模式页面 mode = CC; // 设置当前模式恒流模式 } else if (mode == CC) { if (Eload_Out == 1) { HMILCD_Send("CC.t1.txt=\"OFF\""); HMILCD_Send("CC.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } HMILCD_Send("page CV"); // 切换到恒压模式页面 mode = CV; // 设置当前模式恒压模式 } else if (mode == CV) { if (Eload_Out == 1) { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } HMILCD_Send("page CR"); // 切换到恒阻模式页面 mode = CR; // 设置当前模式恒阻模式 } else if (mode == CR) { if (Eload_Out == 1) { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } HMILCD_Send("page CW"); // 切换到恒功率模式页面 mode = CW; // 设置当前模式恒功率模式 } else if (mode == CW) { if (Eload_Out == 1) { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } HMILCD_Send("page menu"); // 切换到菜单页面 mode = menu; // 设置当前模式菜单模式 } key[2] = 0; } if (key[3] == 1) // 按键3，菜单键 { if (Eload_Out == 1) Key_ONOFF = 1; rt_thread_mdelay(15); HMILCD_Send("page menu"); // 切换到菜单页面 mode = menu; // 设置当前模式菜单模式 key[3] = 0; } } /* 线程 5 的入口函数，电子负载开启关闭按键处理 */ static void thread5_ONOFF_entry(void *parameter) { /* LED2引脚为输出模式 */ rt_pin_mode(LED2, PIN_MODE_OUTPUT); /* 默认高电平 */ rt_pin_write(LED2, PIN_HIGH); while (1) { if (Key_ONOFF == 1 | key[1] == 1) // 开启按钮按下 { if (mode == CC) // 恒流模式 { if (Eload_Out == 0) // 当前负载输出状态为关闭时 { HMILCD_Send("CC.t1.txt=\"ON\""); // 屏幕右上角标题框显示ON HMILCD_Send("CC.b1.txt=\"关闭\""); // 屏幕右下角按钮显示关闭 Eload_Out = 1; // 负载输出状态设置为开启 DAC_SetChannel1Data(DAC_Align_12b_R, 0); if (ISET <= 2.5) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4(0); // 设置IREF2 } else { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(ISET / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } } else if (Eload_Out == 1) // 当前负载输出状态为开启时 { HMILCD_Send("CC.t1.txt=\"OFF\""); HMILCD_Send("CC.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } else if (mode == CV) // 恒压模式 { if (Eload_Out == 0) // 当前负载输出状态为关闭时 { HMILCD_Send("CV.t1.txt=\"ON\""); HMILCD_Send("CV.b1.txt=\"关闭\""); Eload_Out = 1; DAC_SetChannel2Data(DAC_Align_12b_R, 4095); // 设置IREF1 PWM_SetCCR4(50000); // 设置IREF2 if (voltage_dw == 0) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0325 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 2) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.6175 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } } else if (Eload_Out == 1) // 当前负载输出状态为开启时 { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } else if (mode == CR) // 恒阻模式 { if (Eload_Out == 0) // 当前负载输出状态为关闭时 { HMILCD_Send("CR.t1.txt=\"ON\""); HMILCD_Send("CR.b1.txt=\"关闭\""); Eload_Out = 1; DAC_SetChannel1Data(DAC_Align_12b_R, 0); CR_mode(); } else if (Eload_Out == 1) // 当前负载输出状态为开启时 { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } else if (mode == CW) // 恒功率模式 { if (Eload_Out == 0) // 当前负载输出状态为关闭时 { HMILCD_Send("CW.t1.txt=\"ON\""); HMILCD_Send("CW.b1.txt=\"关闭\""); Eload_Out = 1; DAC_SetChannel1Data(DAC_Align_12b_R, 0); CW_mode(); } else if (Eload_Out == 1) // 当前负载输出状态为开启时 { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 } } Key_ONOFF = 0; key[1] = 0; } if (Eload_Out == 0) { rt_pin_write(LED2, SET); } else if (Eload_Out == 1) { rt_pin_write(LED2, RESET); } rt_thread_mdelay(35); } } /* 线程 7 的入口函数，串口屏显示参数 */ static void thread7_HMI_Display_entry(void *parameter) { while (1) { if (mode != menu) { double V = lowV1(YVF); double I = lowV2(YIF); HMILCD_Send("x1.val=%d", (uint16_t)(V * 100)); // 显示电压 HMILCD_Send("x2.val=%d", (uint16_t)(I * 1000)); // 显示电流 HMILCD_Send("x3.val=%d", (uint32_t)(I * V * 100)); // 显示功率 HMILCD_Send("x4.val=%d", (uint32_t)(V / I * 100)); // 显示电阻 HMILCD_Send("x5.val=%d", (uint32_t)(VBAT * 100)); // 显示电阻 } rt_thread_mdelay(50); } } /* 线程 8 的入口函数，散热风扇控制 */ static void thread8_FAN_entry(void *parameter) { while (1) { uint16_t P = (uint16_t)(YIF * YVF + 0.5); if (P >= 13) // 功率大于13W时启动风扇 { FAN_PWM_ON(); if (P < 20) { FAN_PWM_SetCCR(20); // 风扇控制占空比20% } else if (P >= 20 && P < 25) { FAN_PWM_SetCCR(30); } else if (P >= 25 && P < 30) { FAN_PWM_SetCCR(40); } else if (P >= 30 && P < 35) { FAN_PWM_SetCCR(50); } else if (P >= 35 && P < 40) { FAN_PWM_SetCCR(60); } else if (P >= 40 && P < 45) { FAN_PWM_SetCCR(70); } else if (P >= 45 && P < 50) { FAN_PWM_SetCCR(80); } else if (P >= 50 && P < 60) { FAN_PWM_SetCCR(90); } else if (P >= 60) { FAN_PWM_SetCCR(100); } } else if (P <= 8) { FAN_PWM_SetCCR(0); // 关闭风扇的PWM输出,并输出低电平 FAN_PWM_OFF(); } rt_thread_mdelay(200); } } /* 线程 9 的入口函数，恒功率和恒阻模式控制 */ static void thread9_CWCR_entry(void *parameter) { while (1) { if (mode == CW) { CW_mode(); } if (mode == CR) { CR_mode(); } rt_thread_mdelay(50); } } /* 线程 10 的入口函数，对蓝牙发来的数据进行处理 */ static void thread10_BlueTooth_entry(void *parameter) { HMILCD_Send("CC.x0.val=0"); // 屏幕显示的电流设定值清零 HMILCD_Send("CV.x0.val=0"); // 屏幕显示的电压设定值清零 HMILCD_Send("CR.x0.val=0"); // 屏幕显示的电阻设定值清零 HMILCD_Send("CW.x0.val=0"); // 屏幕显示的功率设定值清零 while (1) { if (Serial5_RxFlag == 1) { if (Serial5_RxPacket[0] == 0x01) // 当前是主菜单页面 { if (Serial5_RxPacket[1] == 0x10) // 恒流按钮按下 { if (mode == CV) { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); } else if (mode == CR) { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); } else if (mode == CW) { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); } DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 Eload_Out = 0; HMILCD_Send("page CC"); // 切换到恒流模式页面 mode = CC; // 设置当前模式恒流模式 } else if (Serial5_RxPacket[1] == 0x11) // 恒压按钮按下 { if (mode == CC) { HMILCD_Send("CC.t1.txt=\"OFF\""); HMILCD_Send("CC.b1.txt=\"开启\""); } else if (mode == CR) { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); } else if (mode == CW) { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); } DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 Eload_Out = 0; HMILCD_Send("page CV"); // 切换到恒压页面 mode = CV; // 设置当前模式为恒压模式 } else if (Serial5_RxPacket[1] == 0x12) // 恒阻按钮按下 { if (mode == CC) { HMILCD_Send("CC.t1.txt=\"OFF\""); HMILCD_Send("CC.b1.txt=\"开启\""); } else if (mode == CV) { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); } else if (mode == CW) { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); } DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 Eload_Out = 0; HMILCD_Send("page CR"); // 切换到恒阻页面 mode = CR; // 设置当前模式为恒阻模式 } else if (Serial5_RxPacket[1] == 0x13) // 恒功率按钮按下 { if (mode == CV) { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); } else if (mode == CR) { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); } else if (mode == CC) { HMILCD_Send("CC.t1.txt=\"OFF\""); HMILCD_Send("CC.b1.txt=\"开启\""); } DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 Eload_Out = 0; HMILCD_Send("page CW"); // 切换到恒功率页面 mode = CW; // 设置当前模式为恒功率模式 } } else if (Serial5_RxPacket[0] == 0x08) // 返回菜单 { if (mode == CC) { HMILCD_Send("CC.t1.txt=\"OFF\""); // 屏幕右上角标题框显示OFF HMILCD_Send("CC.b1.txt=\"开启\""); // 屏幕右下角按钮显示开启 Eload_Out = 0; // 负载输出状态设置为关闭 DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); // 切换到菜单页面 mode = menu; } else if (mode == CV) { HMILCD_Send("CV.t1.txt=\"OFF\""); HMILCD_Send("CV.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } else if (mode == CR) { HMILCD_Send("CR.t1.txt=\"OFF\""); HMILCD_Send("CR.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } else if (mode == CW) { HMILCD_Send("CW.t1.txt=\"OFF\""); HMILCD_Send("CW.b1.txt=\"开启\""); Eload_Out = 0; DAC_SetChannel1Data(DAC_Align_12b_R, 4095); // DAC1输出高电平，关闭恒压 DAC_SetChannel2Data(DAC_Align_12b_R, 0); // DAC2输出低电平，关闭恒流 PWM_SetCCR4(0); // 设置IREF2 HMILCD_Send("page menu"); mode = menu; } } else if (Serial5_RxPacket[0] == 0x09) // 开启按钮 { Key_ONOFF = 1; } else if (Serial5_RxPacket[0] == 0xAA) // 当前为数字键盘页面 { char *temp = Serial5_RxPacket; temp++; // 地址自增1 uint16_t temp2 = atoi(temp); // 字符串转整形 if (mode == CC) { if (temp2 > 1000) temp2 = 1000; ISET = temp2 / 100.0; HMILCD_Send("CC.x0.val=%d", temp2); if (Eload_Out == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, 0); if (ISET <= 2.5) { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4(0); // 设置IREF2 } else { // 设置DAC2输出值，控制恒流，+0.5是为了四舍五入 DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(ISET / 2.0 * 0.01 * 50 * 4096 / VREF * DAC2_COMP + 0.5)); PWM_SetCCR4((uint16_t)(ISET / 2.0 * 0.01 * 50 / VCC * 50000 * IREF2_COMP + 0.5)); // 设置IREF2 } } } else if (mode == CV) { VSET = temp2 / 100.0; HMILCD_Send("CV.x0.val=%d", temp2); if (Eload_Out == 1) { DAC_SetChannel2Data(DAC_Align_12b_R, 4095); // 设置IREF1 PWM_SetCCR4(50000); // 设置IREF2 if (voltage_dw == 0) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0325 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 1) { DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(VSET * 0.0947 * 4096 / VREF * DAC1_COMP + 0.5)); // 设置DAC1输出值，控制恒压 } else if (voltage_dw == 2) { uint16_t vset_pwm = (uint16_t)(VSET * 0.6175 * 4096 / VREF * DAC1_COMP + 0.5); if (vset_pwm > 4065) vset_pwm = 4095; DAC_SetChannel1Data(DAC_Align_12b_R, vset_pwm); // 设置DAC1输出值，控制恒压 } } } else if (mode == CR) { RSET = temp2 / 100.0; HMILCD_Send("CR.x0.val=%d", temp2); CR_mode(); } else if (mode == CW) { PSET = temp2 / 100.0; HMILCD_Send("CW.x0.val=%d", temp2); CW_mode(); } } Serial5_RxFlag = 0; } rt_thread_mdelay(40); } } 推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.zeruns.com/archives/383.html我的世界开服教程：https://blog.zeruns.com/tag/mc/免代码搭建博客网站！超详细个人博客搭建教程：https://blog.zeruns.com/archives/783.html内网穿透服务器搭建教程，NPS搭建和使用教程：https://blog.zeruns.com/archives/741.html雨云GPU云服务器搭建SD(Stable Diffusion)的教程，搭建自己的AI绘画网站：https://blog.zeruns.com/archives/768.html2.5G交换机 TL-SE2109简单开箱评测，8个2.5G电口+1个10G光口(SFP+)：https://blog.zeruns.com/archives/780.html