enddel 发表于 2009-10-20 02:24:57

4-30V/5A 可调稳压电源 带断电记忆功能

用PIC16F676单片机控制KIC-125稳压电源模块。
KIC-125最大输入可以达到40V,由于KIC-125的限制,最低只能够输出4V。
元件FMG8是内部带电阻的双三极管。

特点:输出范围是4-30V;输出电压存入EEPROM,具备断电记忆功能;
每步调整约0.1V,连续按键不放的调整速率是约1V/S;
超过5A电流保护,关断输出;开关调压,损耗小。

汇编语言的程序,希望对大家有用。

;※※※※※※ PIC16F676 控制的开关稳压电源 ※※※※※※
         LIST       P=16F676
         #INCLUDE<P16F676.INC>
         __CONFIG 002CH                           ;F676配置
         ERRORLEVEL -302,-305                     ;不要提示302、305警告

#define      JIA                PORTA,4              ;加
#define      JIAN                PORTA,5               ;减

W_TEMP       EQU    21H                        ;
STATUS_TEMPEQU    22H                        ;         
         
YANSHI1      EQU    25H                        ;延时1
YANSHI2      EQU    26H                        ;延时2
JISHI      EQU    27H                        ;计时
SHUCHU       EQU    28H                        ;输出
BIAOZHI      EQU    29H                        ;标志
JISUAN       EQU    30H                        ;计算
COUNTER      EQU    31H                        ;读写EEPROM地址单元

         
         ORG    0000H                        ;
         NOP
         GOTO   MAIN                           ;
         
         
;※※※※※※※ 中断程序 ※※※※※※
         ORG    04H                            ;
         MOVWFW_TEMP
         SWAPFSTATUS,W
         BCF    STATUS,RP0
         MOVWFSTATUS_TEMP                  ;
         
         BTFSCJIA                            ;
         GOTO   RET1                           ;
         MOVLW0X55                           ;
         MOVWFBIAOZHI                         ;
         GOTO   RET                            ;

RET1
         BTFSCJIAN                           ;
         GOTO   RET                            ;
         MOVLW0XAA                           ;
         MOVWFBIAOZHI                         ;         
         
RET
         BCF    INTCON,RAIF                  ;
         BSF    INTCON,GIE                     ;
         SWAPFSTATUS_TEMP,W
         MOVWFSTATUS
         SWAPFW_TEMP,F
         SWAPFW_TEMP,W      
         RETFIE
         
;※※※※※※※ 中断程序 ※※※※※※
         
;※※※※※※※ 主程序 ※※※※※※      
MAIN
         CLRF   SHUCHU                         ;
         CLRF   PORTA                        ;
         CLRF   PORTC                        ;
         BCF    STATUS,RP0                     ;         
         MOVLWB'10001000'                  ;使能所有中断,使能PORTA电平变化中断
         MOVWFINTCON                         ;         
         MOVLWB'11111111'                  ;
         MOVWFCMCON                        ;关闭比较器器               
         BSF    STATUS,RP0                     ;
         CLRF   ANSEL                        ;全部配置为数字端口
         MOVLWB'00111000'                  ;
         MOVWFTRISA                        ;设定A端口
         MOVLWB'00000000'                  ;
         MOVWFTRISC                        ;设定B端口
         MOVLWB'00110000'                  ;
         MOVWFWPUA                           ;输入RA4,RA5端口弱上拉
         MOVLWB'00110000'                  ;
         MOVWFIOCA                           ;输入RA4,RA5端口使能电平变化中断
         MOVLWB'00001010'                  ;WDT预分频1:4
         MOVWFOPTION_REG                     ;

;※※※※※ 以上初始化程序段 ※※※※※

MAIN1
         CALL   DU_EEPROM                      ;
         CALL   DIANYUAN                     ;
         MOVLW0X00                           ;
         SUBWFBIAOZHI,W                      ;
         BTFSSSTATUS,Z                     ;
         GOTO   CHULI                        ;转到处理程序
         CLRWDT                              ;
         GOTO   $-4                            ;

;※※※※※电源输出※※※※※                                 
DIANYUAN                                       ;电源输出
         MOVF   SHUCHU,W                     ;
         MOVWFJISUAN                         ;
         MOVLWB'00000011'                  ;
         ANDWFJISUAN,F                     ;
         BCF    STATUS,C                     ;
         RLF    JISUAN,F                     ;
         BCF    STATUS,RP0                     ;
         MOVF   JISUAN,W                     ;
         MOVWFPORTA                        ;这段输出低2位
         
         MOVF   SHUCHU,W                     ;
         MOVWFJISUAN                         ;
         MOVLWB'11111100'                  ;
         ANDWFJISUAN,F                     ;
         BCF    STATUS,C                     ;
         RRF    JISUAN,F                     ;
         BCF    STATUS,C                     ;
         RRF    JISUAN,F                     ;
         BCF    STATUS,RP0                     ;
         MOVF   JISUAN,W                     ;
         MOVWFPORTC                        ;这段输出高6位         
         RETURN                              ;
;※※※※※电源输出※※※※※

CHULI
         MOVLW0X55                           ;0X55代表”加“,这里是”加“处理程序
         SUBWFBIAOZHI,W                      ;
         BTFSSSTATUS,Z                     ;判断是否有”加“标志
         GOTO   CHULI1                         ;转到”减“处理段
         CALL   DELAY2                         ;
         BTFSCJIA                            ;
         GOTO   CHULI2                         ;”加“无效,干扰信号
         CALL   ANJIAN1                        ;调用按键处理程序
         GOTO   CHULI2                         ;         
CHULI1
         MOVLW0XAA                           ;0XAA代表”减“,这里是”减“处理程序
         SUBWFBIAOZHI,W                      ;
         BTFSSSTATUS,Z                     ;判断是否有”减“标志
         GOTO   CHULI2                         ;
         CALL   DELAY2                         ;
         BTFSCJIAN                           ;
         GOTO   CHULI2                         ;”减“无效,干扰信号
         CALL   ANJIAN2                        ;调用按键处理程序         
CHULI2      
         GOTO   MAIN1                        ;
         
;※※※※※”加“按键处理程序※※※※※         
ANJIAN1                                          ;”加“按键处理程序
         MOVLWD'25'                        ;
         MOVWFJISHI                        ;
ANJIAN3                                                
         BTFSCJIA                            ;
         GOTO   ANJIAN5                        ;按键放开
         CALL   DELAY2                         ;
         DECFSZ JISHI,F                        ;
         GOTO   ANJIAN3                        ;
         MOVLWB'11111111'                  ;            
         SUBWFSHUCHU,W                     ;
         BTFSSSTATUS,Z                     ;判断是否到达最高电压,达到最高电压停止
         INCF   SHUCHU,F                     ;
         CALL   DIANYUAN                     ;
         CALL   DELAY                        ;
         BTFSCJIA                            ;
         GOTO   ANJIAN7                        ;
         GOTO   $-8                            ;                              
ANJIAN5
         MOVLWB'11111111'                  ;            
         SUBWFSHUCHU,W                     ;
         BTFSSSTATUS,Z                     ;判断是否到达最高电压,达到最高电压停止
         INCF   SHUCHU,F                     ;
         CALL   DIANYUAN                     ;
ANJIAN7                     
         CALL   XIE_EEPROM                     ;记录输出数据
         CLRF   BIAOZHI                        ;清除标志                                 
         RETURN                              ;
;※※※※※”加“按键处理程序※※※※※

;※※※※※”减“按键处理程序 ※※※※※         
ANJIAN2                                          ;”减“按键处理程序
         MOVLWD'25'                        ;
         MOVWFJISHI                        ;
ANJIAN4         
         BTFSCJIAN                           ;
         GOTO   ANJIAN6                        ;
         CALL   DELAY2                         ;
         DECFSZ JISHI,F                        ;
         GOTO   ANJIAN4                        ;
         MOVLW0X00                           ;            
         SUBWFSHUCHU,W                     ;
         BTFSSSTATUS,Z                     ;判断是否到达最低电压,达到最低电压停止
         DECF   SHUCHU,F                     ;
         CALL   DIANYUAN                     ;
         CALL   DELAY                        ;
         BTFSCJIAN                           ;
         GOTO   ANJIAN8                        ;
         GOTO   $-8                            ;
ANJIAN6
         MOVLW0X00                           ;            
         SUBWFSHUCHU,W                     ;
         BTFSSSTATUS,Z                     ;判断是否到达最低电压,达到最低电压停止
         DECF   SHUCHU,F                     ;
         CALL   DIANYUAN                     ;
ANJIAN8
         CALL   XIE_EEPROM                     ;记录输出数据
         CLRF   BIAOZHI                        ;清除标志
         RETURN                              ;
;※※※※※”减“按键处理程序 ※※※※※
;※※※※※读取EEPROM数据※※※※※         
DU_EEPROM                                        ;读取EEPROM数据
         CLRWDT
         BCF    INTCON,GIE                     ;关闭中断
         BSF    STATUS,RP0                     ;存储体1
         MOVLW0X01                           ;
         MOVWFEEADR                        ;读取EEPROM地址1
         BSF    EECON1,RD                      ;
         MOVF   EEDATA,W                     ;
         MOVWFSHUCHU                         ;将数据记入SHUCHU单元
         BSF    INTCON,GIE                     ;恢复中断
         RETURN
;※※※※※读取EEPROM数据※※※※※

;※※※※※写EEPROM,记录数据※※※※※         
XIE_EEPROM                                       ;写EEPROM,记录数据
         CLRWDT                              ;
         BCF    INTCON,GIE                     ;         
         BSF    STATUS,RP0                     ;
         MOVLW0X01                           ;
         MOVWFEEADR                        ;写入数据的地址
         MOVF   SHUCHU,W                     ;
         MOVWFEEDATA                         ;数据转入EEDATA
         BSF    EECON1,WREN                  ;
         BSF    STATUS,RP0                     ;
         BSF    STATUS,RP1                     ;存储体4,使用Proteus无法仿真
         MOVLW0X55                           ;
         MOVWFEECON2                         ;
         MOVLW0XAA                           ;
         MOVWFEECON2                         ;
         BSF    EECON1,WR                      ;
         BTFSC         EECON1,WR                      ;
         GOTO         $-1                            ;      
         BCF    EECON1,WREN                  ;禁止写操作
         BSF    INTCON,GIE                     ;
         RETURN                              ;                           
;※※※※※写EEPROM,记录数据※※※※※
         
;×××××××× 延时程序1 ××××××××      
DELAY
         MOVLWD'100'                        ;100mS
         MOVWFYANSHI1                         ;
DEL1
         MOVLWD'255'                        ;
         MOVWFYANSHI2                         ;
DEL2
         NOP
         DECFSZ YANSHI2,1                     ;
         GOTO   DEL2                            ;
         CLRWDT                                 ;
         DECFSZ YANSHI1,1                     ;
         GOTO   DEL1                            ;
         RETURN                                 ;
;×××××××× 延时程序1 ××××××××

;×××××××× 延时程序2 ××××××××      
DELAY2
         MOVLWD'20'                           ;20mS
         MOVWFYANSHI1                         ;
DEL3
         MOVLWD'255'                        ;
         MOVWFYANSHI2                         ;
DEL4
         NOP
         DECFSZ YANSHI2,1                     ;
         GOTO   DEL4                            ;
         CLRWDT                                 ;
         DECFSZ YANSHI1,1                     ;
         GOTO   DEL3                            ;
         RETURN                                 ;
;×××××××× 延时程序2 ××××××××
         
         END                                 ;

enddel 发表于 2009-10-20 02:25:26

http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_493657.JPG
用16F676控制的KIC-125稳压电路图 (原文件名:PIC16F676控制的可调电源.JPG)

http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_494043.JPG
需要将KIC-125内部的两个反馈电阻去掉,然后R1用10K电阻代替。 (原文件名:KIC-125内部电阻修改.JPG)

shichen717 发表于 2009-10-20 11:21:49

好像DCDC,输出加大电容可能会有点问题。

flyerhacker 发表于 2009-10-20 12:35:49

呵呵,似乎有用PWM调压的

enddel 发表于 2009-10-21 01:44:38

【3楼】 fHimemhacker F.H.

呵呵,似乎有用PWM调压的
-------------------------------------------------
呵呵,没那么复杂。PIC16F676+FMG8+(R1~R8)= 一个电位器而已。

ly7123 发表于 2009-10-26 12:19:56

看起来不错,不知能否提供一个编辑好的hex文件,关照一下像我们这些不懂单片机而又想玩玩的人。谢谢了。

enddel 发表于 2009-10-26 23:25:22

D1非常关键,没有D1,如果发生停电,输出电压比输入电压高,很容易损坏KIC-125,特别是用于充电时。
不使用电位器是因为:电位器调整不均匀,会有一段可调输出变化快,一段可调输出没有变化,不好操弄。
如果PIC16F676异常,只会将输出电压降到最低,不会输出非常高电压,损坏用电设备。
如果将KIC-125的电流保护采样电阻引出,分接多个不同的采样电阻,使用继电器切换,能够实现多个不同的电流保护。

HEX文件ourdev_496295.rar(文件大小:565字节) (原文件名:PIC16F676 +KIC-125.rar)

kingmacth 发表于 2010-2-3 14:53:56

好东西正要找的。存下了!

小黑鱼1148 发表于 2012-6-24 15:50:12

不错 mark

maxims 发表于 2012-8-26 01:22:45

不错,简单易行

enddel 发表于 2012-9-4 16:16:25

本帖最后由 enddel 于 2012-9-4 16:22 编辑

对maxims 的回复:编程没有特别要求,直接用发布的HEX文件即可。这种情况说明单片机确实没有正常工作。飙升到28V,说明单片机控制端口全部输出高电位,然后又变低电位了,电压慢慢下降是因为电容蓄能的原因。我一般采用在板编程,编程器连接GND端、MCLR端、ICSPCLK端、ICSPDAT端,电源由板上提供。同时,配置字:__CONFIG 002CH使用了内部RC振荡器,你看看是否在编程时,修改了这个配置,造成时钟没有工作,和复位端口配置改变。

随风过15 发表于 2012-9-15 12:02:05

来看看   学习学习
页: [1]
查看完整版本: 4-30V/5A 可调稳压电源 带断电记忆功能