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