实验用0一20V数控电源
刚学习AVR时,我就想从作一件实用的设备开始,这样即学习了单片机,又得到一件作品,电源是每一个实验都离不开的设备,所以就从电源作起。LM317是一个各项指标都优秀的线性稳压电路,用它制作的稳压电源电压调整率、负载调率都很高,另外它的保护功能均很完善。用M8去控制它可得到一个电压从0一20V,最大电流1.5A的稳压电源。
基本原理,用M8的PWM作数模转换,经过两级RC滤波后得到0一5V的控制电压,PWM是用M8的定时器1来实现的,有10位的分辨能力,控制电压从0一5V分1024步进行,这个控制电压经过运放U3A放大后得到-1.25V一18.75V的控制电压到LM317的调整端,实现电压的调整,输出电压
Uout=Uu3a十1.25V
Uout 电源输出电压,Uu3a运放U3A的输出电压
为了降低功耗电源的输入电压由继电器K1切换,当输出电压<=9V时K1切换到12V ,输出电压>9V时切换到24V。
这种线性稳压电源损耗比较大,LM317的散热用了一个P3 CPU散热器和风扇,由M8计算当LM317上的功耗大于4W时启动风扇工作,这样可降低噪声和延长风扇的使用寿命,我作过测试,采用这种散热方式,在各电压范围内均可连续满负荷工作。
电源设置有一个截止型电流保护,由软件控制,调节范围0一1.5A ,我们可跟据自已实验内容来设置这个保护值,当输出电流大于这个设定保护值时,电源关闭输出电压为0V ,并产生声音报警。为了使用方便,初始值为最大输出电流1.500A 。
电源的的工作状态如图所示
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261202.jpg
(原文件名:lcd-1.jpg)
电源的启动工作状态
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261203.jpg
(原文件名:lcd-2.jpg)
电源的停止关闭状态
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261242.jpg
(原文件名:lcd-3.jpg)
电源的过电流保护状态
按键S1作为电源输出的启动、停止开关,按一下开,再按一下关。S2、S3调节输出电压的加减,S4、S5调节输出电流的保护值,这四个按键开关均有步进调节、连续调节和按下一定时间后快速调节功能。
电源的调整,调节R16使LCD显示电压与电源输出电压一致。调节R20使LCD显示电流与输出电流一致。
电路板上还有一个通讯接口,要加电平转换的,有时间我会作一个上位机软件来实现电源更多功能。
程序是用BASCCOM-AVR写的,我把原程序放上,是为了大家能把它作的更好。
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261205.jpg
(原文件名:D2-2.jpg)
PCB板被设计成单面并适合用热转印方法来制作。
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261206.jpg
(原文件名:D2-1.jpg)
这是安装完成后的样子
这是制作资料和原程序
点击此处下载 ourdev_261207.rar(文件大小:538K) (原文件名:实验用0一20V数控电源.rar) 实验用0一20V数控电源,程序升级,具体看源程序注释.
注意下载时把EEPROM存储器文件DC04.EEP也下载到单片机.
点击此处下载 ourdev_441307.rar(文件大小:4K) (原文件名:程序04.rar)
'///////////////////////////////////////////////////////////////////////////////
'/ /
'/ 这是一个M8控制LM317的直流稳压电源 /
'/ 输出电压 0-20V 连续调节 /
'/ 最大输出电流 1.5A /
'/ 截止型过电流保护 0-1.5A 连续调节 /
'/ /
'/ 这次更新作出以下改进: /
'/ 1.修正了电源启动/停止按键容易翻转的问题,增加了按键音 /
'/ 2.增加了EEPROM存储器数据保存功能,上电后直接到保存的电压、电流值。 /
'/ /
'/ junsheng427@126.com200712-20090501 /
'/ 吕军省天津大港 /
'/ /
'///////////////////////////////////////////////////////////////////////////////
'//当前电源用这个20090501///
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.0 , Rs = Portd.2
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Internal
'定义ADC为单次运行模式,转换时钟-自动,内部参考电压
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
'PWM1A配置,用于数模转换,
Ddrb.1 = 1 'PWM1A输出端子
'/////定义所需要变量 ///////////////////////////////////////////////////////////
Dim V_dc As Long , A_dc As Long , W As Long
Dim V1_dc As Word , A1_dc As Word , A As Word , C As Word , A1 As Word
Dim V1 As String * 5
Dim V2 As String * 5
Dim C1 As String * 5
Dim Vdeep As String * 5
Dim Veep As Word
Dim Aeep As Word
Dim N As Byte , B2 As Byte , B3 As Byte , B4 As Byte , B5 As Byte , K As Byte
'/////初始化设置////////////////////////////////////////////////////////////////
Ddrd.3 = 0 '定义PD.3~PD.7为输入,上拉电阻有效 .按键初始化
Ddrd.4 = 0
Ddrd.5 = 0
Ddrd.6 = 0
Ddrd.7 = 0
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
Start Timer1
Start Adc
Readeeprom Veep , 2 '上电时读取存贮的电压值
Readeeprom Aeep , 5 '上电时读取存贮的电流值
A1 = Veep
C = Aeep
Veep = Veep * 2
Vdeep = Str(veep)
Vdeep = Format(vdeep , " 0.00")
A = 0
W = 0
Ddrc.4 = 1 '初始化风扇控制
Portc.4 = 0
Ddrc.3 = 1 '初始化继电器控制
Portc.3 = 0
Ddrc.2 = 1
Portc.2 = 0
Cls
Cursor Off
Locate 1 , 10
Lcd "[" ; Vdeep ; "V"
'/////主程序////////////////////////////////////////////////////////////////////
Do
Pwm1a = A
N = 1
V1_dc = 0
A1_dc = 0
V_dc = 0
A_dc = 0
For N = 1 To 30 'ADC采样30次
V1_dc = Getadc(0)
V_dc = V_dc + V1_dc 'ADC的原始值累加
A1_dc = Getadc(1)
A_dc = A_dc + A1_dc
Next
V_dc = V_dc / 30
A_dc = A_dc / 30
V_dc = 2600 * V_dc
V_dc = V_dc / 1023
A_dc = 2600 * A_dc
A_dc = A_dc / 1430
If A >= 451 Then Portc.3 = 1 Else Portc.3 = 0 '继电器控制
If A < 451 Then W = 1400 Else W = 2800 '风扇控制
W = W - V_dc
W = W * A_dc
If W > 400000 Then Portc.4 = 1 Else Portc.4 = 0
Gosub Lp_lcd
Gosub Lp_key
If A_dc >= C Then '截止型电流保护
Waitms 500
If A_dc >= C Then
A1 = A
A = 0
Locate 1 , 10
Lcd " OC"
Gosub Mu
End If
End If
Loop
End
'/////显示处理//////////////////////////////////////////////////////////////////
Lp_lcd:
V1 = Str(v_dc)
V1 = Format(v1 , " 0.00") '数字转换为字符串,确定小数点
V2 = Str(a_dc)
V2 = Format(v2 , "0.000")
C1 = Str(c)
C1 = Format(c1 , "0.000")
Locate 1 , 1
Lcd "U=" ; V1 ; "V"
Lowerline
Lcd "I=" ; V2 ; "A <"
Locate 2 , 11
Lcd C1 ; "A"
Return
'/////按键处理//////////////////////////////////////////////////////////////////
Lp_key:
If Pind.3 = 0 And A = 0 Then '启动
Waitms 50
If Pind.3 = 0 And A = 0 Then
A = A1
Locate 1 , 10
Lcd " ON"
Sound Portc.5 , 100 , 1000
K = 1 '加入这个变量是为了是为了在电源关闭时禁止电压调节
Bitwait Pind.3 , Set '等待直到位设置为 set(1)
End If
End If
If Pind.3 = 0 And A > 1 Then '停止
Waitms 50
If Pind.3 = 0 And A > 1 Then
A1 = A
A = 0
Locate 1 , 10
Lcd "OFF"
Sound Portc.5 , 100 , 1000
Waitms 20
Sound Portc.5 , 100 , 1000
K = 0
Bitwait Pind.3 , Set
End If
End If
'/////保存掉电数据///////////////////////////////////////////////////////////
'当电源停止时,按下“电压+”按键,存贮当前电压、电流设置。
If Pind.4 = 0 And K = 0 Then
Waitms 50
If Pind.4 = 0 And K = 0 Then
Writeeeprom A1 , 2 '存电压
Writeeeprom C , 5 '存电流
Sound Portc.5 , 100 , 1000
End If
End If
'////////////////////////////////////////////////////////////////////////////
If Pind.4 = 1 Then B2 = 0 '电压+
If Pind.4 = 0 And K = 1 Then
Waitms 50
If Pind.4 = 0 And K = 1 Then
If A < 1023 Then
A = A + 1
B2 = B2 + 1
If B2 > 20 And A < 1013 Then
A = A + 10
End If
End If
End If
End If
If Pind.5 = 1 Then B3 = 0 '电压-
If Pind.5 = 0 And K = 1 Then
Waitms 50
If Pind.5 = 0 And K = 1 Then
If A > 1 Then
A = A - 1
B3 = B3 + 1
If B3 > 20 And A > 10 Then
A = A - 10
End If
End If
End If
End If
If Pind.6 = 1 Then B4 = 0 '电流+
If Pind.6 = 0 Then
Waitms 50
If Pind.6 = 0 Then
If C < 1500 Then
C = C + 1
B4 = B4 + 1
If B4 > 20 And C < 1480 Then
C = C + 20
End If
End If
End If
End If
If Pind.7 = 1 Then B5 = 0 '电流-
If Pind.7 = 0 Then
Waitms 50
If Pind.7 = 0 Then
If C > 1 Then
C = C - 1
B5 = B5 + 1
If B5 > 20 And C > 20 Then
C = C - 20
End If
End If
End If
End If
Return
'报警声音///////////////////////////////////////////////////////////////////////
Mu:
Sound Portc.5 , 100 , 1000
Waitms 20
Sound Portc.5 , 100 , 1000
Waitms 20
Sound Portc.5 , 100 , 1000
Return
'///////////////////////////////////////////////////////////////////////////////
$eeprom
$eepromhex
Shuzu:
Data 0 , 0 , 0 , 0 , 0 , 232 , 3 顶,好东西,请问楼主是用什么软件画的呢?我用Protel DXP不能打开 不错,顶一下 好东西!
有没有条件测试一下纹波.最简单的办法,将电压调到最高,串个1000u电容(注意正负),接上耳机,听听有无声音. h572
你的建议不错!开眼了 用这个作的 Altium.Designer.v6.6 酷呆了,照片拍得很好,特别是LCD的 效果超好
当然,硬件的做工也是非常的好! 很不错啊 楼主多做几个拿出来卖吧 挺漂亮的 找不到 Altium.Designer.v6.6 ,大家谁能放个PDF版本上来吗? 好东西要顶 楼主的动手能力比我强多了
./emotion/em014.gif 请介绍一下这个电源的电压电流精度能够达到多少?特别是电流的测试精度。最小测量电流是多少,漂移多少? 等楼主的好消息!!! 不错 那位高人用Altium.Designer.v6.6 打开,然后将SCH,PCB导出为protel99格式,谢谢。由于我的机器是2002年的二手机,根本没有办法运行那人软件。 谢谢楼主的分享...... 谢谢楼主的分享...... protel 99 的文件
点击此处下载 ourdev_261436.rar(文件大小:15K) (原文件名:dc-PCB1.rar) 14楼的朋友,看这个能不能打开
点击此处下载 ourdev_261437.rar(文件大小:29K) (原文件名:sch.rar) 谢谢admvip,jun427.可以打开的 我打算也做一个,但是我将会省掉许多电容,呵呵!喇叭那里的三极管,R3,R4也将要省掉。 谢谢楼主的分享...... L 不错, 也来顶一下! 文字清晰、资料完整、图片清楚,这样的好贴不置cool 就没有天理了。 水平够之后,也COPY一个,谢谢 有点太酷了,楼主是个高手!深藏不露! 看了之后流口水 楼主是否可以这样改进一下,加锂电充电电路,做成一个可充可移动的电源。
现在锂电电池容量可以做的较大,这样在现场调试方便多了! http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_261625.jpg
(原文件名:未命名.jpg)
LZ请问下这个运放怎么工作的?能不能给出个计算式啊?如果PWM作DA输出的电压为0V运放怎么工作的?电流回路是怎样的呢?谢谢~~~~ 如果提高输入电压能否输出更高的输出电压比如0-24V可调,毕竟24V也是我们经常用到的一个电源 记号 回28楼的,
看看这个能不能说明问题,
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_262165.jpg
(原文件名:ourdev_261625.jpg)
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_262164.jpg
(原文件名:gs.jpg)
当V1=0时,Vo=-1.25V,这时LM317输出为0
回29楼的,
可以输出更高的电压到24V
VR2换成7824,
把D9短路
调整R19使电源输出到最高电压24V
原则是当你还想进一步提高输出电压时,要注意LM324最高电源电压与LM317最高输入电压。 楼主高手呀 有空也搞一个 下一步搞一个试试、 模电用得很好呀
这个我顶了 我算了下,Vo=Vi(R19/R18+1) - (5*G17+Vi*G18)/(G17+G18+G21) G为电导 很简单的说,你们都不喜欢动脑筋。该电源只能玩玩啊,不能够用于产品啊。 谁把转换后的代码贴上来楼主的那个语法不熟悉 谁把转换后的代码贴上来楼主的那个语法不熟悉 很好啊 做个记号呵呵 顶! 东西做的不错,但是按照原理图来讲,317能输出0V~1.25V么?? 好厉害!!!有时间也搞个试试 感谢楼主! 顶下. 赞~ 东西做的不错,但是按照原理图来讲,317能输出0V~1.25V么??
回复43楼
这个可以
只要的是基准源电压小于-1.25V就可以 我想问一下楼主
下面是用来测量输出电压的吗?
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_266162.jpg
adc (原文件名:adc.jpg)
adc1和adc0是用来测电压的吗? 回hggl
adc0 通过R13、R16分压,测电源的输出电压的。
adc1 通过运放U3B放大取样电阻R23上的电压,测量电源的输出电流。 先顶下
什么时候也搞个试试 楼主可以更详细的讲一下PWM用做数模转换的原理吗?
正在分析楼主的电路,楼主的运放用得好巧!
PWM中是不是用波形输出,然后调节高低电平的占空比
来实现PWM口输出电压的变化?
那如果是这样的话,是不是在电压+/电压- 时通过调整PWM的输出占空比
从而达到控制LM317的基准源电压?
多谢楼主 楼主做的不错,我这有一个国外的数字电源,支持多路输出,有参考价值,不过就是太大了16M,要不就传上来给大家共享了 16M不算大,楼主辛苦一下,传上来共享一下啦。THANKS!!! 收下,好东东。 在电源设计实验阶段,曾用多种负载作测试,电阻性的,感性的,容性的等,当用一个录音机电机做实验时发现,当电压从0开始上调到150mV电压时,就可正常启动运转,这是原来没有看到的现象,这可能就是数字化的威力。(测试用的电机取掉了原来的稳速板,原设计是6V供电还是9V供电记不清了,台湾产的。)
这个是测试视频
ourdev_273222.rar(文件大小:1.23M) (原文件名:80509-134329.rar) 数控电源有什麽用途? 是否电机实验才会用到? 怎么我打不开有PDF的那个压缩文件,还有楼主可不可以提供原程序,我的邮箱是sea18c@163.com 好啊,支持BASCOM 2008 Mark and up. 记号 顶,准备做一个,但只是没有用过M8,只会51。 顶,一定做一个!
多谢共享! 好东西,支持!! 楼主:帮我看看我做的这个电源怎么在电压《2.3V时,不能调节?请各位帮忙分析一下,谢谢!
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_290122.JPG
(原文件名:原理2.JPG) 建议你取掉RP,给LM358采用正负电源供电,就会调到1.23V的 电压测量是在LM317输出与GND之间,但负载回路中还串有两个并联的0.15电流取样电阻,当电流达到2A的时候,2A*0.075R=0.15V,这时负载上的电压与测量到的电压之间会不会有0.15V的差异?有没有解决方法? 电压测量是在LM317输出与GND之间,但负载回路中还串有两个并联的0.15电流取样电阻,当电流达到2A的时候,2A*0.075R=0.15V,这时负载上的电压与测量到的电压之间会不会有0.15V的差异?哪位解答一下? 不错不错,记号下. 個人慘痛經驗 :5V 及3.3V電源一定用固定的,而且都加了超壓保護電路(crow bar circuit). MARK 请问有那位网友做了这款pcb出来或者成品出来,最近没时间自己动手做这个,但楼主这个电源实在太吸引了,最近也急需用,我可以想网友购买一个吗? 支持BASCOM ,好东西,哈哈! 都不错的东西 ,可惜本地买不到8啊,没得玩了。 好东西,顶一个 好东东记号 真的很NB啊…… 楼主的电源属于淘汰产品:
LM317在ADJ悬空的时候会输出电源电压,如果电压太高这样就会倒灌如运放,所以该电路不可能做到20-30V(当然你的运放可以超频到30V)
,还有在运放输出落后LM317输出的时候,相当于LM317的ADJ悬空,LM317也会输出电源电压,这个电压属于大电流的,运放输出电压不能拉低该电压,造成LM317电压不可以调节。当然你也许会说我没有遇见该种情况。不过提醒你,没有遇见不等于不存在。就像AVR超频一样,有的超频可以,有的不可以。
LM317输出0时候还要加负电压,需要运放双电源,太麻烦。
当然LM317还是很好的,不过看见楼主做的这样麻烦,所以说两句,不要见怪 谢谢网友的提醒
看LM317手册是怎么讲的,就不会有这个问题,这个Iadj是恒流的100uA,不会产生大电流(器件损坏有可能)。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_299934.jpg
(原文件名:lm317.jpg)
该电路能作到25V确实作不到30V,还是看器件手册,我实际制作的是最高输出电压20V,从实验板到现在用了有一年多,没有发现什
么大问题。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_299935.jpg
(原文件名:lm324.jpg)
我不明白为什么会发生运放输出落后LM317输出的时候,这个电路中运放就是给LM317一个参考电压,本身并没有参与LM317的反馈调整,请网友有时间给分析一下,咱们共同学习。
至于该电源属于淘汰产品的问题我不知道是指的什么,据我多年的经验,如果你作新电路实验,最好用这类线性稳压电源,尽管它损耗比较大,会助你排除很多不确定判断。 好东西,顶一个!佩服! 这是个经典电路,79楼chenjianlin 怎么说淘汰.(谢谢你上次帮忙)
运放324双电源可以做到0-15V呀,317调节也可以输出到16.25V呀,也不明白楼主怎么调节到20V的。
单电源当然可以做到1.25V-32.25V.
楼主的线路板做的真好看。 最最强烈的感谢楼主 所謂的數控電源是忽悠人的, lm317本來就是模擬線性電路芯片. 顶 挺好的,哈哈 我也想做个实验电源 在明纬开关电源的基础上改
LM317 LM337 LM2575 LDO 都上
不过还是想用电位器调 单片机就用来显示实时电压和电流得了
现在就是找不到好一点的电位器 为什么我用楼主的程序下进去之后电压显示一直为零?实际可以调大小,就显示不对 我做了一个,有以下问题:
1。电压值可以调的和万用表一样。但电流值不会和万用表一样成比例变化,比如5V100欧的负载可以调到50MA ,但到了10V 就不对了。
2。电源按键没有去抖处理,很不方便。
请原作者指教,我是做一个自己用! 请楼主,解答一下上面的问题,谢谢! 我也整了一个用M16的,电压可以做到0~24V输出,但电流怎么也搞不准,望高手们指教 我想问楼上的,你是用原文的印刷板作的吗,如果是自己设计的电路板,看看走线路径是不是有问题.
电源按键有去抖动处理,是按一般微动开关设计的. 嗯,好! 做个记号! aini
积分:165
派别:
等级:------
来自:
很简单的说,你们都不喜欢动脑筋。该电源只能玩玩啊,不能够用于产品啊。
sourceForge 不恥上問
积分:262
派别:
等级:------
来自:開源世界
所謂的數控電源是忽悠人的, lm317本來就是模擬線性電路芯片.
这里数控是指调节按键输出时是数控,那你的开关电源面不是也有模拟吗?有的人老是觉得别人不行,可自己只会撇嘴,卖嘴,啥也不干,我强烈鄙视!感谢楼主,辛苦了! 支持97楼,如果谁觉得这些都是小儿科,那就拿出你很牛的证明给大家看 谢谢楼主的回复,我是用你的PCB文件打的样板,就是电流值不对,那个取样电子我更换了很多种规格也不行,我怀疑是324的参数不同,对于电源键,按键时,很容易翻转,对于电源开关(ON/OFF)最好不能出现上面的现象,我现在用硬件去抖。
强烈感谢楼主的辛勤劳动!!!!! 顶!!楼主强!!
谢谢分享! 顶,谢谢楼主!