# 1、自我介绍
本人是在校学生,STM32稍微入门的水平,想学习多一种单片机,GD32或许是个不错选择。
# 2、项目简介
想要做一个功能尽可能全都要的电源,见识过IMAXB6充电器,发现了几个缺点,于是在他的基础上进行改造。
# 3、项目描述
作为数控电源,首先要分成4大模块:**功率,数模,模数,人机交互**。
授人以鱼不如授人以渔。
我认为硬件开源的项目,比起只是把图丢出来,秀秀功能,发个HEX。还不如把原理讲清,让别人吃透你的设计,才算分享。
## 硬件细节
说到电源,首先从功率部分讲起
**功率回路:**
输入-->xl4501(我以前开源的升降压拓扑,点我个人主页查看)-->LM317(进一步稳压)-->ACS712(霍尔电流采样)-->输出
![image.png](//image.lceda.cn/pullimage/Dddsu0rE7pqJj0dvOW8xP3c3Ky3YyeAzVZVdgPvH.png)
**假负载回路:**
输出端电流反向流入-->ACS712(霍尔电流采样)-->IRF1404(低导通电阻MOS管)-->R12(取样电阻)-->GND
![image.png](//image.lceda.cn/pullimage/6cjYtFcyfq97wU13xtUAr8NKAxlXyiLdsmZ127b6.png)
**外设电压产生:**
首先是中间电压:
![image.png](//image.lceda.cn/pullimage/H0W9HYovQHpGYyGZhCQCieZGO8A41keABe5I1wcW.png)
功率5V供电:
![image.png](//image.lceda.cn/pullimage/hw6K0fTjqddP0cyvkDw0GkGIoXBQN0QfbD0Uzb1t.png)
-5V产生:
![image.png](//image.lceda.cn/pullimage/vp2B5mcP3jhQv9WSYcEOupPCV7pXYlskuBCUFTKn.png)
其实降压拓扑的ic都是可以用来产生负压的(包括同步整流的ic),
而现在新的PDF一般不会写出来。你百度出来的图基本都是MC34063,这个芯片很全能,但效率上不去。
话虽如此,但里面的拓扑很值得学习。
**简单的电源滤波电路:**
RC滤波后,经过三极管放大,从而抑制纹波。
![image.png](//image.lceda.cn/pullimage/u7TD6WCW9EUeKZXVGXyr2K2EG64DGAHzfQX2lDZd.png)
![image.png](//image.lceda.cn/pullimage/nfrbf4oQHs9GwcoGVAifHcMmkxS4VlhECFQk2ZY8.png)
##### 关于电源这图的线性降压为什么不用1117-5,而是用7805呢?
这要从纹波抑制这个参数说起。
下面这图是1117的,作为低压差稳压块(LDO)来说,由于用P管作调整管,这曲线符合预期。
![image.png](//image.lceda.cn/pullimage/xk7tQ70zLMaPu0xEkeTL8uhnXhmNCbaN4H5xIgfc.png)
下图是7805的,由于采用N管调整,对输入的干扰不是敏感,所以高频的纹波抑制上去的。
这对于DCDC再线性稳压给精密部分是有好处的。
(功率部分线性稳压采用LM317同理,大电流低压降的型号有LM1084)
![image.png](//image.lceda.cn/pullimage/UBLuBxIDeg9dowN7z8bGUOPeKkZbspPWAS0rqQhu.png)
**反馈调节部分:**
**预稳压跟随:**
LM317的电压经过R6,R7分压,输入进Q3(PMOS),当Q3的GS电压到达导通阀值时,Q3导通,FB拉高,
使得XL4051输出变低,不通过单片机控制便能电压跟随,按照图上的参数,实测LM317两端电压为3V。
而且R10的下方并不是接GND的,而是接到其中一个DAC的输出,这样便可以0V起调了。
【假设:忽略Q3,DCDC_CTRL的电压为1.25V(FB的内部参考电压也是1.25V),则输出电压也稳定在1.25V,
如果DCDC_CTRL电压比1.25V高,则输出会比1.25V低(前提是带负载,如果空载,电流会从反馈电阻流到输出)。好比一个反相比例放大电路】
![image.png](//image.lceda.cn/pullimage/AKg1nZMOhea3sgMctjJS0RJQBSUjC5D7pf7Z8Ozc.png)
**DAC驱动放大:**
第一个运放组成巴特沃斯滤波器,用作滤波和增加输入电阻
第二个运放组成反相比例放大器,使DAC动态范围在运放电源轨内任意调节,充分发挥DAC位数。
![image.png](//image.lceda.cn/pullimage/vIsI1p1uk11wRWfhZvQTMVa4AehXS5liFyJA3J8P.png)
**单端转差分电路:**
由于想把ADC的分辨率用起来,所以用GS8592(性价比很高的精密轨对轨运放),做了单端转差分电路,
但目前的情况是电流读数不是很稳定,不确定这个电路是可靠的,等排查了问题修改了电路再重新编辑。
![image.png](//image.lceda.cn/pullimage/Hm0EwKI0WMtw6zJMOCVFyLfRSOXCtDu3beo4EQOq.png)
**人机交互的IO复用:**
LCD1602是EN下降沿才加载数据,其他时候数据脚是可以做其他用途的,
这里我引出一个按键使能端,置低后,便能读取按键状态了
![LCD.png](//image.lceda.cn/pullimage/mF59USSWnPo8xWxAPtgWn4Wp8tZpXC2P11eBmLJ6.png)
# 软件细节
这是温度采样的原理图,通过三极管电流镜电路产生4mA的恒定电流流过NTC电阻
![NTC.png](//image.lceda.cn/pullimage/vx3Gy7kSaWLlKyDQV1puR4t9NgoaSEBxipT3O8rG.png)
这是从pdf里复制出的电阻表,经过excel的计算转换,导出数组,推荐大家也这么操作
(末尾给出腾讯文档链接,可以学习下对应函数)
![NTCE.png](//image.lceda.cn/pullimage/gkMxa4ie0NxKMpV7VnuLCnv6L4v2H07lXPuNSZDQ.png)
经过二分查表法,便能将adc电压转成对于温度,代码如下:
``` language
//输出16~99度
uint8_t ntc_decode(uint16_t dat)//以降序排序的二分法查表
{
uint8_t min=0;
uint8_t max=83;//限制最大显示99度
uint8_t temp;
uint8_t i;
for(i=0;i=ntc_code[temp])
max=temp;
else
min=temp;
}
for(i=min;i=ntc_code[i])
break;
}
return i+16;
}
```
CGRAM作模拟条显示的代码,具体效果看下面视频
通过这个模拟条,节省了1602本来不多的屏幕空间
通过实际值与目标值的百分比,让使用者知道当前是恒流还是恒压模式,预估当前设定的值,
便于查看更快的变化(万用表刷新的速度一般是4HZ,我这里的字符刷新是5HZ,模拟条是10HZ)
``` language
void lcd_write(uint8_t dat,uint8_t cmd);//1602写数据,cmd为0为命令,1为数据
void LCD_analog(uint8_t add,uint8_t dat)//模拟条CGRAM加载
{
uint8_t temp;
lcd_write(0x40+(add
30
53
收藏到专辑