
#第五届立创电子#线性预稳压/DCDC双模切换两象限电源
简介
一个功能尽可能全都要的电源
简介:一个功能尽可能全都要的电源开源协议
:GPL 3.0
描述
1、自我介绍
本人是在校学生,STM32稍微入门的水平,想学习多一种单片机,GD32或许是个不错选择。
2、项目简介
想要做一个功能尽可能全都要的电源,见识过IMAXB6充电器,发现了几个缺点,于是在他的基础上进行改造。
3、项目描述
作为数控电源,首先要分成4大模块:功率,数模,模数,人机交互。
授人以鱼不如授人以渔。
我认为硬件开源的项目,比起只是把图丢出来,秀秀功能,发个HEX。还不如把原理讲清,让别人吃透你的设计,才算分享。
硬件细节
说到电源,首先从功率部分讲起
功率回路:
输入-->xl4501(我以前开源的升降压拓扑,点我个人主页查看)-->LM317(进一步稳压)-->ACS712(霍尔电流采样)-->输出
假负载回路:
输出端电流反向流入-->ACS712(霍尔电流采样)-->IRF1404(低导通电阻MOS管)-->R12(取样电阻)-->GND
外设电压产生:
首先是中间电压:
功率5V供电:
-5V产生:
其实降压拓扑的ic都是可以用来产生负压的(包括同步整流的ic),
而现在新的PDF一般不会写出来。你百度出来的图基本都是MC34063,这个芯片很全能,但效率上不去。
话虽如此,但里面的拓扑很值得学习。
简单的电源滤波电路:
RC滤波后,经过三极管放大,从而抑制纹波。
关于电源这图的线性降压为什么不用1117-5,而是用7805呢?
这要从纹波抑制这个参数说起。
下面这图是1117的,作为低压差稳压块(LDO)来说,由于用P管作调整管,这曲线符合预期。
下图是7805的,由于采用N管调整,对输入的干扰不是敏感,所以高频的纹波抑制上去的。
这对于DCDC再线性稳压给精密部分是有好处的。
(功率部分线性稳压采用LM317同理,大电流低压降的型号有LM1084)
反馈调节部分:
预稳压跟随:
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低(前提是带负载,如果空载,电流会从反馈电阻流到输出)。好比一个反相比例放大电路】
DAC驱动放大:
第一个运放组成巴特沃斯滤波器,用作滤波和增加输入电阻
第二个运放组成反相比例放大器,使DAC动态范围在运放电源轨内任意调节,充分发挥DAC位数。
单端转差分电路:
由于想把ADC的分辨率用起来,所以用GS8592(性价比很高的精密轨对轨运放),做了单端转差分电路,
但目前的情况是电流读数不是很稳定,不确定这个电路是可靠的,等排查了问题修改了电路再重新编辑。
人机交互的IO复用:
LCD1602是EN下降沿才加载数据,其他时候数据脚是可以做其他用途的,
这里我引出一个按键使能端,置低后,便能读取按键状态了
软件细节
这是温度采样的原理图,通过三极管电流镜电路产生4mA的恒定电流流过NTC电阻
这是从pdf里复制出的电阻表,经过excel的计算转换,导出数组,推荐大家也这么操作
(末尾给出腾讯文档链接,可以学习下对应函数)
经过二分查表法,便能将adc电压转成对于温度,代码如下:
//输出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<3;i++)//二分查表
{
temp=(min+max)/2;
if(dat>=ntc_code[temp])
max=temp;
else
min=temp;
}
for(i=min;i=ntc_code[i])
break;
}
return i+16;
}
CGRAM作模拟条显示的代码,具体效果看下面视频
通过这个模拟条,节省了1602本来不多的屏幕空间
通过实际值与目标值的百分比,让使用者知道当前是恒流还是恒压模式,预估当前设定的值,
便于查看更快的变化(万用表刷新的速度一般是4HZ,我这里的字符刷新是5HZ,模拟条是10HZ)
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<<3),0);//CGRAM地址
if(dat<=40)//正向百分比显示
{
for(temp=40;temp>dat+4;temp-=5)
lcd_write(0x00,1);//一次填充一行空白
if(dat>0)
{
dat--;
lcd_write(0x1f<<(4-dat%5),1);
temp-=5;
}
temp-=5;//当作渲染了一行
for(;temp<40;temp-=5)//如果还没有负溢出,继续填充
lcd_write(0x1F,1);//一次填充一行黑点
}
else if(dat<80)//反向百分比显示
{
dat-=39;//偏移,然后同理
for(temp=40;temp>dat+4;temp-=5)
lcd_write(0x1f,1);
if(dat>0)
{
dat--;
lcd_write(0x1f>>(dat%5),1);
temp-=5;
}
temp-=5;
for(;temp<40;temp-=5)
lcd_write(0x00,1);
}
}
其他代码就不放出来了,函数间耦合度很高,不是简单展示一两个函数就能表达清楚,等软硬件完善后再公开代码!
核心算法:
该电源的核心算法就是二分查表,在校准的时候,把对应DAC和ADC一并保存到flash里,
跳过的中间值用等比例填充。需要用的时候再查表找出来。
优点:简单快捷,消除了ADC的非线性误差。
缺点:避免不了PT8211的时飘和温飘带来输出的变化。而且仅校准数据占用了64kB的flash空间
(小声BB:ST家的103c8t6是有128kBflash的喔,GD家的还不知道)。
如果后面要修正误差就要加入PID运算了。
元件和遇到的问题:
物料名称 | 遇到的问题 |
---|---|
CS1237(电子秤ADC) | 逻辑电压要求是0.7VDD,然而3.3是5的0.66,所以要经过电平转换才能驱动 |
PT8211(音频DAC) | 可以用SPI兼容I2S总线,但实际输出位数远远少于标出来的16位 |
GS8592(精密运放) | 该项目用的比较多的的元件,低失调电压对于仪表类应用很合适,但不知道是布线还是ACS712问题,电流读数总是在跳。 |
STM32F103C8T6 | PWM的CH2N通道用HAL库死活调不通,刚好就是led背光驱动的IO |
GD32F103C8T6 | 还没开始移植 |
机械设计:
整体采用子母板设计,通过FPC排线连接,方便调整高度或者拔插STM32最小系统板
(粘白色胶带的电位器是校准好的标识)
成品图片:
画大饼:
作为一个全能型选手,怎么可能就这!
已开发的功能: | 待开发的功能: |
---|---|
完整的人机交互操作 | 高效率输出模式 |
温度读取并控制风扇 | 两象限模式 |
可调恒流恒压低噪声输出 | 外接模块达到更多功能 |
假负载模式 | *** |
拓展模块功能:
锂电池平衡放电与单节电池电压检测
T12烙铁接口的温度读取
接到电脑上位机
视频
功能演示视频地址:https://b23.tv/sxZvqv
做视频也是门技术,可惜我没更多精力去专注其他东西,视频很差,没剪辑,没切镜。还请多多包涵。
图纸文档
【腾讯文档】NTC温度电压对照表:https://docs.qq.com/sheet/DVHR0Tk9NRnRDeWZ1
当前电路存在的问题:
恒流输出或负载时纹波较大,该版本PCB是无法解决的了,需要用仿真,修改运放的有源滤波电路,把零点极点调对才能正常使用。
设计图
BOM


评论