近段时间我制造了一个集电流源、电压源、充电和烙铁于一身的“四用”电源,同时还有个显示屏显示。在设计过程中,我用到两个单片机,一个负责变量采集,一个主负责显示。于是我的同事就把这个“怪兽”叫做“双核独显”电源。
核心是控制一个由mos管搭建的一个电压调节板,可以数控电压,因此得到一个电压源;通过电流反馈,调节电压,又得到一个电流源;通过电流电压反馈,得到一个锂电池充电器;通过烙铁温度反馈,得到一个恒温烙铁控制器,思路就是这么来的。单片机是飞思卡尔qd4,两个16bit定时器/pwm ,四通道10bitad。它的主要功能有:1、电压源;2、电流源;3、充电器;4、恒温烙铁控制器。
下面是电路图:
主控电路
调压电路
调压电路中nmos借鉴白光烙铁的电路,不过要做快速开关,图中的r9不能太大,我用500欧的,pwm 2khz可以。上拉电阻r13也很重要,在单片机异常是,保证关断输出。mos后端的电路,可以参考dc芯片资料。
其中具体的焊接过程我就忽略不写了,相信大家根据我给的电路图就可以做出相对应的产品。
以下是一些总体图和测试图:
总体的样子
电源输入是用笔记本电源。输出是一个usb口,我平时用不到大电流,3a足够了,步进10ma。最大输出电压接近输入电压,步进0.01v。显示用的是nokia5110显示屏(上图是用5v供电,屏幕有杂点,下面改为3.7v,完美屏)。
输入由一个电位器,一个按键构成。电位器仿照示波器的用法,可以上下选择,也可以输入设定值。按键短按用来“确定”,长按“返回”这些信息由单片机1采集,单线发送给单片机2,显示。单线通信花了不少精力。采样电阻50m欧,用358放大。电流采集后要校正,消除偏差。
做好了这一大堆东西后,我们要对其进行基本的功能测试。
一、电压源
下图中:9.22v是实时采集的真实电压,s:设定值,i:电流
电压输出相应很快,示波器截图
快速扭动电位器,都可以用示波器作画了
二、电流源
下图中:0.44a是实时采集的真实电流,s:设定值,v:电压
三、充电模式
为了测试,把我移动电源的电池芯拆出来了。当时舍得的横流充阶段电流为300ma,这叫一个等啊
不过能看到这么多输出信息,挺爽的
0264ma是累计充电电量,i:当前充电电流,v:电池电压
四、烙铁模式
炊烟袅袅啊……公司的热成像仪送检了,无法校准温度。我是用公式直接算的,感觉偏低了。不过笔记本电源供电,刚刚的。爱死这个烙铁了
介绍一下这个usb烙铁
烙铁是用白光936烙铁柄改的,接了个usb头,外侧做电源线,usb的数据线接反馈电阻。经过测试,3a电流,usb口毫无问题,而且升温也不错,所以程序了限定3a。太大电流,笔记本电源会保护。
以下是我将产品组装进盒子里面的图示:
壳子是拆了一个12v/2a的电源的塑料壳,把这么大一坨东西,塞进去,可是费了功夫。
终于塞的差不多
进去了!!左面一张
右面一张
上面的是开机图片(怎么跟大哥大似的)……
到此为止所有的制作就已经完成了。
在制作过程中,我想给大家说一下我的一些编程方面的经验。
一、时基函数
我现在觉得这个函数应该是每个工程必须的,但回想我看过的单片机书,好像没有讲到这一点的,相见恨晚。
void timepro()
{
if(!b_8msfg)
return;
b_8msfg = 0;
tim8ms++;
pihtim++;
if(keytim 《 255)
keytim++;
if(pihtim 》 4)
{
tpm2c0sc = 0x48; //开外部中断
}
lcdtim++;
lcdflashtim++;
if(tim1ms 》 124)
{
tim1ms = 0;
tim1s++;
……
……
……
}
}
上面就是一个“时基函数”,当你的程序有几个外围需要同时控制时,再用nop延时,直线执行已经忙不过来了,需要用上面的函数。
b_8msfg在8ms定时中断中置为1。timepro()在主函数中调用。这样keytim、lcdtim这些计时变量就在一直计时。例如调用键盘程序,判断一下keytim是否到时间,到了执行,keytim清零,不到返回,再去调用别的函数体。这样分时复用cpu,避免了nop来浪费系统资源,当几个外围执行周期不同时,更是这样 。
二、ad采样(数字滤波)
这个程序是公司的标准模块。大学时,ad采出来,我就直接用了。工作了才发现这样不好,采完后还要做一下数字滤波。数字滤波,不知谁起的这么好听的名字,唬住不少人。其实很简单,但很实用。在这里,实际操作就是:采六次,去掉最大最小值,剩四个求平均。以前对它的作用体会不深,当有一个单片机直接测交流真有效值的项目,一个不堪入目的波形进入单片机,数字滤波后,一下数值稳定不乱跳了,顿生感慨。
下面是程序:
void adpro()
{
uchar n,i;
if(adtim 《10) return;
adtim = 0;
for(n=0;n《6;n++)
{
adchannel = channelin; //通道选择;
while(!adc1sc1_coco) nop();//等待转换完成
adc1sc1_coco = 0;
adnum = adc1r; //取得ad值
// adnum = 298;
if(0==n)
{
m_adcsum = 0;
m_adcmax = adnum;
m_adcmin = adnum;
}
if(adnum《m_adcmin)
{
m_adcmin = adnum;
}
else if(adnum》m_adcmax)
{
m_adcmax = adnum;
}
m_adcsum += adnum;
adnum = 0;
}
m_adcsum=m_adcsum-m_adcmax;
m_adcsum=m_adcsum-m_adcmin; //减去最大最小值
m_adcsum = m_adcsum》》2; //取均值
switch (channelin)
{
case 0 :
adset = m_adcsum;
break;
case 1 :
adi = m_adcsum;
break;
case 2 :
adtemp = m_adcsum;
break;
case 3 :
adv = m_adcsum;
break;
default:
break;
}
channelin ++; //切换通道
if(channelin 》 3)
channelin = 0;
}
若是用ad来控制输出,更需要这样做。避免临界值时的误动作 。
三、键盘程序
//---------------------------------
//按键程序
//---------------------------------
void keypro()
{
if(keyscantim 《200) //20ms scan时基函数中计时
return;
keyscantim =0 ;
//keyset
if(!pi_keyset)
{
if(b_keysetbac)
{
if(keysetcount《255)
keysetcount ++;
}
else
b_keysetbac =1;
if(keysetcount 》6)
{
b_keysetlong = 1; //长按键,不需放手既可产生
keynum = 0;
keysetcount =0;
b_keysetbac =0;
longkeyexittim = 0;
}
}
else
{
if(b_keysetbac && longkeyexittim 》 2)//防止长按后,产生一个多余的短按键
{
b_keyset = 1; //短按键,放手后产生
keynum = 0;
}
b_keysetbac =0;
keysetcount = 0;
}
}
一个按键,既可响应长按,也可响应短按 。
曝国内手机厂商将与哈苏合作
共射放大电路参数确定方案解析
魅族Flyme6:就一个字“美”
NVIDIA重磅发布专门的矿卡—CMP HX系列
Amazon 跨足智能电视机,与中国厂商携手推出 4K 电视
集合四种功能,我的“双核独显”电源制作过程
STM8S时钟系统的时钟初始化函数实现
机器视觉在制造业的应用
外夹式超声波流量计的设计选型、实际应用及注意事项
人工智能时代怎样避免成为“透明人”
热像仪助力材料科学与工程研究(四)
“碳”秘博世等离子涂层技术
电动汽车推动动力电池飞速发展 中日韩竞争日趋激烈!
无人机市场进入“白热化”状态,大疆稳扎稳打占据主动
阿里的物联网核心yunos为什么选择HP入局笔记本
4G-Zigbee智能网关产品方案介绍
承德科胜组合秤包装机|水饺自动包装机|河北包装机
基于混合云计算服务的一站式解决方案
无锡建成自动驾驶专用封闭高速公路测试环境
四月份芯片市场涨价厂商一览