找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14028|回复: 6
打印 上一主题 下一主题
收起左侧

根据论坛图纸制作的LM358+单片机可调电源 附源程序

  [复制链接]
跳转到指定楼层
楼主
根据51hei论坛上的图纸原理做的可调电源实测0.2v-11.5v可调,步进0.1v。本程序没有用查表方式给tlc5615输入AD值(费时间,懒。。。),所以输入电压与输出电压有误差。
源图纸用的是89c51单片机,本人用的15w408as单片机,自带AD功能,可以将输出的电压返回单片机处理。显示部分没有用数码管,感觉没有OLED连线方便(IIC接口)
原理图用的OPA2107运放,我买了两个这个运放不能用,不知道我买的是坏的还是本身这个电路有问题,后面改用LM358可以正常使用。此电路我用两个LM358,其中一个用来放大检测电流电阻上的电压,再输入到单片机的AD脚进行计算处理。
此电路有电流检测功能,但是程序里没有设置短路保护功能。
实际做下来也不费劲,但是这个图纸经我验证有以下缺点:
1,电流只能达到600ma,再高场效应管发热严重,输入功率能达到40w而输出功率只有5-8w。
2,效率不高,感觉效率能有50%就很不错了,而且电流过大造成场馆有异响。
3,调电压的时候测量TL431的基准电压2.5v,这个电压数值会随着电压的调节略微变动,造成输出误差增大。给单片机的基准电压我用的是ASM1117的          3.3v做基准电压,感觉这个芯片的稳压要比TL431好。

本人也就是普通的爱好者,一些东西还是靠论坛来实现的。有什么不对的地方希望指点一下。

制作出来的实物图如下:


电路原理图如下:


单片机源程序如下:
  1. #include <STC15F2K60S2.H>
  2. #include "OLED.h"

  3. #include "TLC5615.h"
  4. #include "EC11.h"
  5. #define ADC_POWER     0x80
  6. #define ADC_FLAG      0x10
  7. #define ADC_START     0x08
  8. #define ADC_SPEEDLL   0x00
  9. #define ADC_SPEEDL    0x20
  10. #define ADC_SPEEDH    0x40
  11. #define ADC_SPEEDHH   0x60

  12. unsigned int EC11_Value1;
  13. unsigned char ch=2;   //定义通道0位P1^0;1为P1^1;2为P1^2;
  14. float voltage=0, voltage1=0; //??????
  15. unsigned int Power1,ElectricC,RefAd=0,vin=0,PowerA=0,Wat=0;//P1^0,Power为电压值,P1^2,refad为参考电压3.3v的ad值.P1^1为采样AD值
  16. /******************显示函数**********************/
  17. void OLEDDisplay()
  18. {
  19.                         //设定电压值
  20.          
  21.                 OLED_DisplayCharacter(1, 9, (PowerSet+1)/100+'0', OLED_NOT_INVERT_COLOR);
  22.                 OLED_DisplayCharacter(1, 10, (PowerSet+1)%100/10+'0', OLED_NOT_INVERT_COLOR);
  23.                 OLED_DisplayCharacter(1, 12, (PowerSet+1)%10+'0', OLED_NOT_INVERT_COLOR);
  24.                 //显示电压值
  25.                 OLED_DisplayCharacter(2, 9, Power1/1000+'0', OLED_NOT_INVERT_COLOR);
  26.                 OLED_DisplayCharacter(2, 10, Power1%1000/100+'0', OLED_NOT_INVERT_COLOR);
  27.                 OLED_DisplayCharacter(2, 12, Power1%100/10+'0', OLED_NOT_INVERT_COLOR);
  28.                 OLED_DisplayCharacter(2, 13, Power1%100%10+'0', OLED_NOT_INVERT_COLOR);
  29.                 //显示电流值
  30.                 OLED_DisplayCharacter(3, 10, ElectricC/1000+'0', OLED_NOT_INVERT_COLOR);
  31.                 OLED_DisplayCharacter(3, 12, ElectricC%1000/100+'0', OLED_NOT_INVERT_COLOR);
  32.                 OLED_DisplayCharacter(3, 13, ElectricC%100/10+'0', OLED_NOT_INVERT_COLOR);
  33. //                //显示编码器值
  34. //                OLED_DisplayCharacter(3, 6, EC11_Value/1000+'0', OLED_NOT_INVERT_COLOR);
  35. //                OLED_DisplayCharacter(3, 7, EC11_Value%1000/100+'0', OLED_NOT_INVERT_COLOR);
  36. //                OLED_DisplayCharacter(3, 8, EC11_Value%100/10+'0', OLED_NOT_INVERT_COLOR);
  37. //                OLED_DisplayCharacter(3, 9, EC11_Value%10+'0', OLED_NOT_INVERT_COLOR);
  38. //                OLED_DisplayCharacter(3, 11, KeyNumber+'0', OLED_NOT_INVERT_COLOR);
  39. }
  40. /**********************主函数*******************************/
  41. void main()
  42. {
  43.         unsigned int i;
  44.         OLED_Init();//初始化OLED        
  45.   P1ASF=0x07;//0x70=00000111,用P1^0,1^1,1^2三个IO口当ADC口
  46.         ADC_RES=0;
  47.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL | ADC_START | ch;
  48.         for(i=0;i<1000;i++);
  49.         IE=0xA0;
  50.         EC11_Value1=EC11_Value;
  51.         while(1)
  52.         {
  53.                 OLEDDisplay(); //扫描显示函数
  54.         
  55.                 if(KeyNumber==1)
  56.                 {
  57.                         OLED_DisplayText(0, 6, "开", OLED_NOT_INVERT_COLOR);
  58.                         if(EC11_Value!=EC11_Value1)
  59.                         TLC5615DateOut(EC11_Value);
  60.                    EC11_Value1=EC11_Value;
  61.                         }
  62.                 else
  63.                 {
  64.                         OLED_DisplayText(0, 6, "关", OLED_NOT_INVERT_COLOR);
  65.                         TLC5615DateOut(0);
  66.                 }
  67.           }
  68.                
  69.         
  70. }

  71. /****************************ADC中断函数***********************/
  72. void adc_int() interrupt 5   //ADC中断
  73. {
  74.         static unsigned char i;
  75.         unsigned int j=0;
  76.         EC11_Display();  //扫描编码器函数
  77.         ADC_CONTR &=!ADC_FLAG;//清除中断
  78.         if(ch==0)
  79.         {
  80.            RefAd=(ADC_RES*4+ADC_RESL);   //P1^2的参考AD值保存到RefAD中,这里用ASM1117的3.3v稳压做参考AD值
  81.         }
  82.         if(ch==1)
  83.         {
  84.                  vin=(ADC_RES*4+ADC_RESL);                //读取P1^1的值保存在vin中,这里读到的是输出电压经10K电阻分压得到的电压值。
  85.                 voltage1=(3.318*vin)/RefAd;        
  86.      Power1=voltage1*1000;               
  87.         }
  88.         if(ch==2)                //读取P1^0的AD值保存在PowerAD中,计算经运放过来的放大电压,算出电流
  89.         {
  90.            PowerA=(ADC_RES*4+ADC_RESL);
  91.      voltage=(3.318*PowerA)/RefAd;        
  92.      ElectricC=voltage*200;               
  93.         }

  94.         ch=i;
  95.   i++;
  96.         if(i==10)i=0;//防止AD值过快有跳动

  97.         ADC_RES=0;
  98.         ADC_RESL=0; //AD数据位清零
  99.         ADC_CONTR=ADC_POWER |ADC_SPEEDLL | ADC_START | ch;        //启动ADC中断
  100.         

  101. }
复制代码

所有代码51hei提供下载:
OLED显示数字电压.zip (90.92 KB, 下载次数: 135)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:169891 发表于 2021-6-15 08:54 | 只看该作者
一直想搞一个可调电源,这下有机会了
回复

使用道具 举报

板凳
ID:588737 发表于 2022-11-9 14:13 | 只看该作者
你好楼主 这个原理图在哪找的,方便分享吗
回复

使用道具 举报

地板
ID:703081 发表于 2023-2-16 10:03 | 只看该作者

非常感谢楼主的无私奉献!
回复

使用道具 举报

5#
ID:1075398 发表于 2023-5-9 08:47 | 只看该作者
实物图片和原理图和程序都不一致,对于新手小白还是有一定的障碍呀
回复

使用道具 举报

6#
ID:102702 发表于 2023-5-9 20:39 | 只看该作者
原理图是数码管的,但实物图是OLED的,都不一致啊
回复

使用道具 举报

7#
ID:227484 发表于 2023-9-25 11:01 | 只看该作者
是源程序吗?这个是数码管程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表