| ![[Photo of the Author]](../../common/images/Guido-S.gif)  by  Guido Socher (homepage)
 
 关于作者:
 
 Guido喜欢Linux不仅因为通过它可以挖掘系统的潜力而且任何人都可以参与其中。 目录:
 | 
 
单片机可控的直流电源
 ![[Illustration]](../../common/images/article251/dcpower-logo.gif) 
摘要:
    这篇文章是我的第四篇有关AT90S4433单片机的文章发表在
    LinuxFocus上。我建议你阅读下面的过去的关于ATMEL单片机编程的文章:
    
- 如何建立安装和使用AVR开发环境及其制作它的固件编程器:
 2002年3月,
      使用GCC编译AVR单片机程序
- 如何制作你自己的印制板:
 2002年5月, 一个Linux服务器的Lcd控制面板
- 如何制作一个直流电源控制箱:
 2002年9月,
      一个带有Lcd显示和RS232接口的1Hz-100Mhz频率计
在你的工作室里一个重要的冬冬是一个稳定可靠的直流电源。
    在这篇文章里我们要做一个这样的直流电源。
    它是单片机可控的。它有一个Lcd显示,你可以从你的Linux服务器通过RS232串口发送命令给它。
    它设计的很棒。
    这篇文章会显示单片机是如何的多才多艺。它可不是简单的一个电路。
    
    如何你想找一个简单的直流电源那么你可以看一下
    “简单的直流电源”
    。这个简单的直流电源在LinuxFocus
    中提到的电子试验已经够用了。但是,它与Linux和软件都不沾边。
    
    即使你想制作一个“简单的直流电源”就可以了,你也要看一下文章,你可以读到单片机许多有趣的方面。
    
     
介绍
    这个单片机可控的直流电源不是一个简单的电路。但是我能保证你用到它时,
    你没有,你会后悔的。它很稳定可靠,而且在技术上它也是很有趣的,
    因为你会学到如何在没有一个模/数转换芯片的情况下如何产生一个模拟直流电源。
    
    
    你需要很多的元器件但是它们都不贵。这个东西花费不多。
     
你需要什么?
    下面是元件清单
    它列出了所有你需要的元器件。你也可以在下面原理图中找到元器件和它的值。
    
    我们的电源有3个版本。除了变压器和一个电阻不一样外,软件上还有一点变化。
    除了这点外,别的都一样:
    
      - 0-16V 最大电流2.2A
 买一个15V 2.5A变压器
- 0-24V 最大电流2.2A
 买一个24V 2.5A变压器
- 0-30V 最大电流3A
 买一个30V 3A变压器
注意:在这三种情况中电路板都需要另外一个9V, 100mA变压器。电路图和印制板
    我使用eagle
    的Linux版本来设计原理图和印制板的。eagle文件也包含在tar.gz的软件包里了。
    你可以在文章后面指明的地方下载它。
    
     
    电路分为2部分。一个主要的部分和另一部分靠近电源整流器。
    下面你可以看到两个独立的电路原理图,它们通过连线连接到一起。
    
     
     主电路图(点击可放大):
     ![[main schematic]](../../common/images/article251/schematic_th.gif) 
 
     
     接近高电压部分的电路图(点击可放大):
     ![[power part schematic]](../../common/images/article251/schematic_powerpart_th.gif) 
 
    如何在矩阵中连接一个按键(点击可放大):
     ![[push buttons schematic]](../../common/images/article251/push_buttons_schematic_th.gif) 
    
     
     主电路板,顶视图(点击可放大):
     ![[board]](../../common/images/article251/linuxDCpower_board_white_th.jpg) 
 
     
     
    这个板子很适合业余电子爱好者。蓝色的层是要被腐蚀掉的。红色的表示连线。
    这个单面板的制作很容易,不需要太精确的。你可以在板上布线最短的线(红色的)。
    但是我在eagle上可不成。
    
    
    在高压电路中只有很少的元器件,它可以用一个面包板来做(这种板子有很多的过孔)。
    主板和电源板通过JP2和JP3插头的连线连接。
    你会注意到主板的地线连接到了直流电源的输出。
    这也是我们需要2个变压器的原因(一个是在电源板上,一个是和单片机和运放在一起)。
     
工作原理
    看一下主板的原理图你可以看到它从逻辑上分为2个部分,一个部分在电路图中标有
    “电流控制”,另一个部分标有“电压控制”。它们是2个独立的控制回路。
    一个回路控制输出电压另一路电流流过0.275欧姆的电阻上,压降等于电流。
    这2个部分通过二极管D2和D3“联系”到一起。这些二级管在电路中的作用就象数字电路中的或门一样。
    如果电流过大那么电流控制电路会降低电压直到某个限定值,否则(在电流不大的情况下)
    电压控制部分会控制整流输出的直流电压。
    
    
    这个或逻辑是成立的,因为三极管T3通过R19连到了+5V。
    如果这里没有D2和D3后面的运放电路存在,你可以得到最大的输出。
    控制电路是通过减小T3基极电压(最小可接地)来控制输出电压的。
    
    
    电压控制回路通过调整IC6B的5脚的电平来实现调压。换句话来讲,
    脚5的电压等于由R15,R10和R16决定的放大系数乘电压输出。
    电流控制也是一样,不同的是在R30上的压降等于最大的输出电流。
    
    
    为了把输出电压或者电流调整到某个的值,我们需要控制2个点的电压
    (IC6B脚5和R30上的压降)。这就是单片机要做的事....
    但是,单片机怎么产生和整流一个直流电源呢?看下图:
    
    
      ![[pwm]](../../common/images/article251/lowpass.gif) 
    
    
    你会看到一个脉冲信号如何变成一个直流信号的。
    你做到这点,需要把(脉冲)信号通过一个截止频率是信号频率1/100
    (或者比100更大)的低通滤波器。
    由于我们的单片机运行在4Mhz,它做到这么一个低通滤波器不成问题的。
    即使我们使用软件成生信号,我们仍可以得到很小的khz的信号并且滤波器会依旧很小。
    
    
    在图片上方和下方中间的电路图部分叫做脉冲宽度调制。
    通过改变脉冲的长度我们可以控制滤波器后的直流电压。
    
    
    酷吗?我们可以使用数字信号产生额外的直流电压。
    
    
    AT90S4433单片机有2个内部的计数器。一个16位宽,一个8位宽。
    16位的计数器有PWM(脉冲宽度调制)的能力,
    它在单片机内部由硬件实现了10bit精度脉冲宽度调制。
    8位的没有但是我们可以使用软件模拟实现。它的速度还是够快。
    我们使用16位的计数器来实现电压调制,可以实现10位精度,1023等分输入电压。
    8位计数器负责控制电流,它是8位精度,可以255等分1-3000mA的电流,
    就是说可以得到12mA(或者更少)的电流。这对于电流控制来说是足够了。
    
    
    电流剩下的部分是电源供应部分,参考电压部分(7805的输出是我们参考点)
    还有保证当开关电源时,电源保持不跳动部分。
     
软件
    单片机的软件涉及到很多方面,你可以从原先的文章中得到这些信息(比如rs232串口,
    lcd显示,中断模式的计数器)。你可以看看下面页面:
    
    linuxdcp.c.
    
    
    这里我们关注的是软件的PWM(脉冲宽度调制)。
    在软件PWM中,用到了变量ipwm_phase和变量ipwm_h。
    我们使8位的计数器运行在中断模式下,每当中断溢出,中断处理程序
    “SIGNAL(SIG_OVERFLOW0)”会被调用。在中断处理程序里,我们检查变量ipwm_phase
    来决定是产生1还是0。之后,重启动计数器。很简单。
    
    
    软件不复杂但是如果你想搞懂这些东西,你需要阅读4433的手册(看下面的参考)。
    
    
    4433是8位的单片机并且它的计算能力有限。决定用户给定电压大小的精确的脉冲宽度
    需要24位的除法和乘法。
    
    我们的电源有7个按键。6个按键步进电流和电压大小,另一个按键是“待命”。
    使用待命按键时,你可以以暂时停掉电源的同时调节电压和电流的上限。
    这些按键的状态在主程序中被”上拉“了。变量ignorebutton用于按键去抖。
    你用手指按动按键时,它会上下跳动的。人是感觉不到的,但是单片机运行很快,
    它会读到到开,关,开,关...这些状态的,
    变量ignorebutton计数到一定值再去读,这样就去抖动了。
     
制作印制板
    
      
        | 主板: 
 ![[main board]](../../common/images/article251/dcpower-mainbrd_th.jpg)  | 
      
        | 电源供应部分。木边,底部和上方和前面使用了薄金属片。 
 ![[box]](../../common/images/article251/dcpower-box_th.jpg)  | 
      
        | 前面板 
 ![[front]](../../common/images/article251/dcpower-frontpanel_th.jpg)  | 
    
    软件包里有一个postscript文件linuxDCpower.ps,是做电路板用的。
    我个人感觉它的焊盘有点小,所以我强烈推荐你再做之前把焊盘弄大。
    制作过程你可以在以前的文章中找到:
    2002年5月,
    linux服务器的Lcd前面板。 
    怎么制作一个便宜但是好看的电源盒子你可以看:
    "2002年9月,
    带有LCD显示和RS232接口的1Hz-100Mhz频率计"。
    你可以看到我做的盒子和前面板的图片,点击可放大。
     
测试
    象任何的电路一样你把它焊好后,不要直接连接电源而是应该一步一步的测试它,
    这样做才好。这样你可以找到你做电路时的错误。
    
    
      - 把主电路板的所有元器件装齐但是不要把IC芯片装到插座上。
      
- 拿一个9伏的电池,正极连接电路图中标注“AC_POWER”接头的脚2和负极连接脚1。
      用一个电压表检查在max232的脚8和脚16之间的和单片机脚7和脚8的电压。
      在运放上你会发现它的正电源达到9伏。
      
- 把9伏电池1脚接正,脚2接负。检查一下运放的负电源你会发现是负9伏的样子。
      
- 如果前面的测试通过了,电源检测就通过了。这样,
      就可以把max232和单片机芯片插到插座里了。
      
- 再次使用9伏电池连接。这样,正5伏电源就有供应了。
      连接编程线一连接端计算机并口,一端连接电流板上的编程插座。
      
 更新软件包(下载地址见参考)。
      进入解包的目录并且键入:
 make avr_led_lcd_test.hex
 make testload
 make ttydevinit
 
 这样测试软件在板子上运行了。lcd上会显示“hello”。红色的led会闪烁。
      如果你连接了串口到你的计算机上,你可以看到“ok”打印在屏幕上。
      (使用ttydevinit初始化串口,如果用串口1,
      键入cat /dev/ttyS0;如果使用串口2,键入cat /dev/ttyS1)。
- 现在组装电源部分但是不要装主变压器。
      把9伏电池连接到变压器连的地方。
      无论连接的极性,在4700uF的电容总会被稳压到9伏。
      用电压表量一下。
      
- 所有的测试都通过后,最后检查一下连线。
      然后,连接变压器,上电。
      因为运放没有插到插座里,所以你会得到电源的最大的输出电压。
      量一下它,但是要注意不要短路否则会烧电路板的,
      因为没有短路保护。
      
- 断电。把运放插到插座里,连接编程电缆,上电,键入:
      
 make
 make load
 
- 这样电源供应就有了所有的功能。注意的是编程电缆连接的时候,
      输出电压有一点下降。如果你想得到精确的输出电流和电压的话,
      不要连接它。
      
这就是我们自己的电源模块
    你会看到上面我们提到的3个可选项依赖于我们所用的变压器。
    默认的是16V, 2.2A的。
    如果想变化,需要编辑文件linuxdcp.c
    并查找:
    MAX_U,IMINSTEP,MAX_I,
    如果你想有最大3A电流的输出,在函数set_i中你可以改变刻度。
    代码有很好的注释你可以看到那些部分应该修改。
    
    
    最后还有一些我做的电源模块的图片。做它是有点费劲但是很有用。
    这些时间很值得投资,因为试验用的电源可是很常用的。
    
    
    
      ![[front view]](../../common/images/article251/dcpower-final_frontview_th.jpg)
      
      ![[top view]](../../common/images/article251/dcpower-final_topview_th.jpg) 
    
     
如何使用它?
    操作这个直流电源是很简单的。它有4个按键来调节电压,
    其中2个是每按一下上调/下调1伏,另2个是每按一下上调/下调0.1伏。
    电流的上限也可以使用2个按键来调节。但是电流调节不是线性的。
    对于小的电流值,每按一下可以调节50mA。大于200mA时候,
    每按一下可以调节100mA。大于1A是200mA。
    这样子,你可以使用2个按键调节整个的量程。
    
    待命按键用来暂时关掉电源时候,下次启动时不用把设定值再设定一遍。
    
    红色的led在直流电源达到上限时会点亮,在待命时会闪烁。
    
    使用rs232串口ascii命令可以完全控制这个电源。
    下面的命令时有效的:
    u=X 设置电压 (比如: u=105 设置电压为
    10.5伏)
    i=Xmax 设置最大电流 (比如:i=500 设置电流最大是500mA)
    s=1 or s=0 设置待命。
    u=? or i=? or s=? 打印当前设置。
    这个命令会使电源通过串口返回象下面的字符串:
    u: 50 s:0 i: 100 l:0
    u: 50,表示输出5伏特电压, s:0 表示没有待命, i: 100 是100mA,
    l:0,表示电压上限没有达到。
    使用ascii字符串你可以为电源写一个图形界面了。
    为了使用rs232你用首先使用软件包里的ttydevinit初始化它。
    这点在
    2002年,频率计的文章中描述过的。
    
    如你所见,在原理图中有2个变压器并且逻辑电平的地线连接到正的直流输出上。
    这种设置是没有问题的,因为2个变压器隔离了电压。
    我们需要这样连接因为运放的反馈回路极性要求是这样的。
敬请注意:
这意味着你的RS232的地线是连接到直流的输出上的!
换句话说,当你给其他部分供电时候,
你不可以使用RS232连线连接到别的地方,比如你的计算机的地线。
在电源上贴一个“RS232地线连接到直流输出的正极”是个好主意。
如果你使用的是电池供电的笔记本或者电源部分和RS232部分没有连接时,
这是不会造成短路的。
不要被这个警告吓坏。如果达到250mA直流电源的输出上限,
红色的led会告诉你你犯错了。
即使你犯了错,也搞不坏你的计算机的。
     
人身安全
这个电路有个变压器连接到交流电源上(230伏或者110伏,这要看你在那个国家)。
请主要要保证一定的绝缘。如果你没有和交流电源的电路打过交道,
那么就要请教一个有经验的人在你第一次插电之前来检查你的电路的绝缘和安全。
     
硬件和软件的调整
    为电源写的软件已经为测量电压和电流校准过了。
    你几乎不用做任何的改动就可以了。硬件的调整也就是涉及到
    7805,R15,R10,R16和R38,R30,R26。
    也只有这些部分可以影响电压和电流的输出。
    如果你想校正的更好一点,你可以修改软件或者改变电阻值。
    你要注意并口的编程器会影响输出,所以在你测量时要把它去掉。
    在软件中你可以在函数set_u和set_i设定:程序有很好的注释linuxdcp.c
     
参考
    
    
  
 
对这篇文章发表评论
每篇文章都有各自的反馈页面。在这个页面里,您可以提交评论,也可以查看其他读者的评论:
2003-04-06, generated by lfparser version 2.25