找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机恒流恒阻恒功率电子负载开源设计

  [复制链接]
跳转到指定楼层
楼主
经过数个月的奋斗,恒流恒阻恒功率三种模式的电子负载终于做好了
恒流部分使用了Gandf大侠的PWM模拟DAC方案,在此表示感谢。这种方案虽然不如使用DAC芯片转换迅速,但成本低廉,分辨率也可以做的比较高,对于diy而言已经足够了。主控芯片使用的是最新的STC8A8K64S4A12-LQFP44,带12位ADC,用于检测电压电流很方便。
其实原理很简单,其关键在于程序的编写,网上关于Gandf大侠的电子负载很少开源程序,我在这里开源的程序可以供大家参考,其中LCD2004的驱动程序来自blog.csdnnet/yagnruinihao/article/details/19999551,在此表示感谢!
这其实只是最基础的功能实现,还有许许多多可以改进的地方,比如增加散热风扇,散热器温度检测,蜂鸣器,改差分四线测量等等,但我精力有限,没有时间弄了,所以开源出来大家可以参考着进行改进。

制作出来的实物图如下:


电路原理图如下:



单片机源程序如下:
  1. /*!
  2. *     COPYRIGHT NOTICE
  3. *     Copyright (c) 2018,CQ
  4. *     All rights reserved.
  5. *
  6. *     
  7. *     
  8. *
  9. * @file                        main.c
  10. * @brief                        
  11. * @author                CQ
  12. * @version                V1.1
  13. * @date                        2018-11-4
  14. * latest amendment time:2018.12.2
  15. */
  16. #include"STC8A.h"
  17. #include"LCD2004.h"
  18. #include"config.h"
  19. #include <intrins.h>

  20. void main(void)
  21. {
  22.          GPIOInit();
  23.          lcd2004Init();
  24.          TimerInit();        
  25.    PWMInit();
  26.    lcd2004CleanAll();
  27.          ADCInit();
  28.         lcd2004AddressWriteString(0,0,Menu.NormalInterface.Line[0]);
  29.         lcd2004AddressWriteString(1,0,Menu.NormalInterface.Line[1]);
  30.         lcd2004AddressWriteString(2,0,Menu.NormalInterface.Line[2]);
  31.         lcd2004AddressWriteString(3,0,Menu.NormalInterface.Line[3]);
  32.    lcd2004AddressWriteByte(2,19,0xF4) ;//display Ohm  symbol

  33. /*         if(MenuDataTable.SysInfo.LoadState==Running)
  34.         {
  35.     lcd2004AddressWriteString(3,16,"ON");                                       
  36.         }
  37.         else
  38.         {
  39.    lcd2004AddressWriteString(3,16,"OFF");                                                
  40.         }*/
  41.          EA=1;
  42.         if(IapRead(IAPUSEDFLAG)==0x56)//check whether there is some data in eeprom
  43.         {
  44.           MenuDataTable.Current.Coefficient=IapReadF32(CURRENTCOEADDR);
  45.           MenuDataTable.Voltage.Coefficient=IapReadF32(VOLTAGECOEADDR);
  46.           MenuDataTable.SysInfo.PWMCoe=IapReadF32(PWMCOEADDR);
  47.         }
  48.          while(1)
  49.          {
  50.        ;                        
  51.          }
  52. }
复制代码


所有资料51hei提供下载:
Electronic load.rar (358.83 KB, 下载次数: 775)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-3 01:43 | 只看该作者
好东东,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:454155 发表于 2019-3-27 09:09 | 只看该作者
负载的原理图呢
回复

使用道具 举报

地板
ID:262783 发表于 2019-4-11 01:37 来自手机 | 只看该作者
谢谢分享,学习了
回复

使用道具 举报

5#
ID:531743 发表于 2019-5-9 16:53 | 只看该作者
不错的设计,值得学习
回复

使用道具 举报

6#
ID:614352 发表于 2019-9-21 11:12 | 只看该作者
感谢分享
回复

使用道具 举报

7#
ID:244512 发表于 2019-10-22 17:27 | 只看该作者
MOS管部份没有电路
回复

使用道具 举报

8#
ID:262783 发表于 2019-10-29 00:32 来自手机 | 只看该作者
好厉害,代码看不懂,好多英文,但这个是好东东
回复

使用道具 举报

9#
ID:634466 发表于 2019-11-2 18:07 | 只看该作者
谢谢分享!
回复

使用道具 举报

10#
ID:136502 发表于 2019-12-8 16:52 | 只看该作者
感谢分享
回复

使用道具 举报

11#
ID:298348 发表于 2019-12-15 13:44 | 只看该作者
好资源 谢谢分享
回复

使用道具 举报

12#
ID:634466 发表于 2020-1-21 12:01 | 只看该作者
谢谢分享
回复

使用道具 举报

13#
ID:454211 发表于 2020-1-22 11:37 | 只看该作者
好东西,感谢楼主分享
回复

使用道具 举报

14#
ID:688129 发表于 2020-1-25 16:21 | 只看该作者
好东西,感谢楼主分享
回复

使用道具 举报

15#
ID:160658 发表于 2020-1-26 17:55 | 只看该作者
好资源 谢谢分享
回复

使用道具 举报

16#
ID:375228 发表于 2020-1-29 22:27 | 只看该作者
很NB的设计
回复

使用道具 举报

17#
ID:233015 发表于 2020-2-1 11:40 来自手机 | 只看该作者
楼主有负载部分的电路图吗?
回复

使用道具 举报

18#
ID:704585 发表于 2020-4-2 17:53 | 只看该作者
多谢楼主分享
回复

使用道具 举报

19#
ID:60263 发表于 2020-4-22 10:50 | 只看该作者
下载了,谢谢分享
回复

使用道具 举报

20#
ID:700699 发表于 2020-8-13 10:48 | 只看该作者
功率部分没有,在哪里找得到?
回复

使用道具 举报

21#
ID:276790 发表于 2020-9-18 23:38 来自手机 | 只看该作者
厉害最近在研究这个,谢谢
回复

使用道具 举报

22#
ID:59956 发表于 2021-5-8 10:59 | 只看该作者
樓主你好我想問一下這個ADC换算部分在哪里
回复

使用道具 举报

23#
ID:61192 发表于 2021-8-3 21:59 | 只看该作者
看看照葫芦能不能画出瓢出来
回复

使用道具 举报

24#
ID:596446 发表于 2021-8-28 10:19 | 只看该作者
这程序是缺的
回复

使用道具 举报

25#
ID:585365 发表于 2021-9-5 16:54 | 只看该作者
参考着看看能不能搞一个出来
回复

使用道具 举报

26#
ID:648916 发表于 2021-9-8 07:49 | 只看该作者
感谢!感谢!再感谢!
回复

使用道具 举报

27#
ID:430492 发表于 2021-9-14 16:09 | 只看该作者
楼主厉害呀,大侠级!!强!!
回复

使用道具 举报

28#
ID:506805 发表于 2021-10-12 11:13 | 只看该作者
恒阻恒功率通过软件调节实现?
回复

使用道具 举报

29#
ID:47634 发表于 2021-11-9 21:20 | 只看该作者
很好很好,感谢楼主,学习了
回复

使用道具 举报

30#
ID:47634 发表于 2021-12-9 09:43 | 只看该作者
很好很好,感谢楼主的好资料,正在找资料准备制作
回复

使用道具 举报

31#
ID:284973 发表于 2022-1-14 09:16 | 只看该作者

程序是完整的
回复

使用道具 举报

32#
ID:284973 发表于 2022-1-14 09:17 | 只看该作者
robter 发表于 2021-12-9 09:43
很好很好,感谢楼主的好资料,正在找资料准备制作

这个设计有严重缺陷,今年会重做
回复

使用道具 举报

33#
ID:8222 发表于 2022-1-16 17:43 | 只看该作者
  • /*!
  • *     COPYRIGHT NOTICE
  • *     Copyright (c) 2018,CQ
  • *     All rights reserved.
  • *
  • *
  • *
  • *
  • * @file                        EC11.c
  • * @brief                       
  • * @author                CQ
  • * @version                V1.1
  • * @date                        2018-11-4
  • * latest amendment time :2018.11.4
  • */
  • #include"EC11.h"
  • static bit EC11_SIA_Last;
  • static bit EC11_SIB_Last;
  • sbit EC11_SIA=P3^2;
  • sbit EC11_SIB=P3^4;
  • sbit EC11_SW=P3^3;
  • Ec11StateType                Ec11State=
  • {
  •          KeyFree,
  •         EncoderFree,       
  • };
  • /************************************************************
  • * Function name                :        EC11_Capture
  • * function discription        :        EC11 state capture
  • *
  • * input parameter        :        none
  • * output parameter        :        none
  • *
  • * amendant record  :               
  •    Add this function for the first time    2018-11-4
  • * author                  :        CQ
  • * date                                :        2018-11-4
  • *************************************************************/       
  • void Ec11Capture(void)
  • {
  •           static unsigned char EC11KeyStateTemp = 0,EC11KeyCount=0;
  •     bit EC11KeyPressTemp;
  •           EC11KeyPressTemp =EC11_SW;         
  •   if((EC11_SIA_Last==0)&&(EC11_SIA==1))//        EC11_SIA和上一次状态相比,为上升沿
  •     {
  •        
  •                 if((EC11_SIB_Last == 1)&&(EC11_SIB == 0))   //EC11_B和上一次状态相比,为下降沿
  •                         {
  •                     Ec11State.EncoderState=EncoderSub;                         //反转
  •                         }
  •                 if((EC11_SIB_Last == 0)&&(EC11_SIB == 1))   //EC11_B和上一次状态相比,为上升沿
  •                                 {
  •                    Ec11State.EncoderState=EncoderAdd;                       //正转
  •                                 }
  •                                 //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
  •                 if((EC11_SIB_Last == EC11_SIB)&&(EC11_SIB == 0))  //A上升沿时,采集的B不变且为0
  •                                 {
  •                     Ec11State.EncoderState=EncoderSub;                                //反转
  •                                 }
  •                 if((EC11_SIB_Last == EC11_SIB)&&(EC11_SIB == 1))  //A上升沿时,采集的B不变且为1
  •                                 {
  •                      Ec11State.EncoderState=EncoderAdd;                                //正转
  •                                 }
  •         }
  •    else        if((EC11_SIA_Last==1)&&(EC11_SIA==0))          //EC11_SIA和上一次状态相比,为下降沿
  •    {
  •                          if((EC11_SIB_Last == 1)&&(EC11_SIB == 0))   //EC11_B和上一次状态相比,为下降沿
  •                                 {
  •                      Ec11State.EncoderState=EncoderAdd;                           //正转
  •                                 }
  •                 if((EC11_SIB_Last == 0)&&(EC11_SIB == 1))   //EC11_B和上一次状态相比,为上升沿
  •                                 {
  •                     Ec11State.EncoderState=EncoderSub;                          //反转
  •                                 }
  •                                 //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
  •                 if((EC11_SIB_Last == EC11_SIB)&&(EC11_SIB == 0))  //A上升沿时,采集的B不变且为0
  •                                 {
  •                      Ec11State.EncoderState=EncoderAdd;                          //正转
  •                                 }
  •                 if((EC11_SIB_Last == EC11_SIB)&&(EC11_SIB == 1))  //A上升沿时,采集的B不变且为1
  •                                 {
  •                    Ec11State.EncoderState=EncoderSub;                                  //反转
  •                                 }
  •    }
  •         EC11_SIA_Last = EC11_SIA;   //更新编码器上一个状态暂存变量
  •         EC11_SIB_Last = EC11_SIB;   //更新编码器上一个状态暂存变量
  •        
  •        
  •                  /************************EC11_SW key scan************************************/
  •          switch(EC11KeyStateTemp)
  •          {
  •                  case 0:
  •                          if(EC11KeyPressTemp==0)
  •                                  EC11KeyStateTemp=1;
  •                           break;
  •                  case 1:
  •                           if(EC11KeyPressTemp==0)
  •                                 {
  •                                         EC11KeyStateTemp=2;
  •                                 }
  •                                 else
  •                                         EC11KeyStateTemp=0;
  •                                  break;
  •                  case 2:
  •                           if(EC11KeyPressTemp==1)
  •                                 {
  •                                           if(EC11KeyCount<100)
  •                                                 {
  •                                                     Ec11State.KeyState=KeyDown;
  •                                                 }
  •                                   EC11KeyStateTemp=0;
  •           EC11KeyCount=0;                                        
  •                                 }
  •                                 else
  •                                 {
  •           if(EC11KeyCount<100)
  •                                         {
  •              EC11KeyCount++;
  •                                         }       
  •           else if(EC11KeyCount==100)
  •                                         {
  •              Ec11State.KeyState=KeyHold;
  •                      EC11KeyCount++;                                       
  •                                         }                                                                                
  •                                 }
  •        break;                
  •          }
  •        
  • }
  • Ec11StateType                                Ec11State;

请问26-30行的格式和意义,小白不懂,望大师赐教。谢谢。



回复

使用道具 举报

34#
ID:61140 发表于 2022-2-25 07:39 | 只看该作者
程序有问题,原理图不完整,不能用
回复

使用道具 举报

35#
ID:928284 发表于 2022-3-7 17:29 | 只看该作者
做的很强大,学习您!
回复

使用道具 举报

36#
ID:854496 发表于 2022-5-20 23:19 | 只看该作者
感谢,参考研究研究
回复

使用道具 举报

37#
ID:228452 发表于 2022-9-4 20:01 | 只看该作者
schematic diagram is incomplete ....
This is example only what can be done..
回复

使用道具 举报

38#
ID:128989 发表于 2022-9-11 01:29 | 只看该作者
不错,学习了。51有ADC,DAC吗
回复

使用道具 举报

39#
ID:284433 发表于 2022-11-3 10:02 | 只看该作者
学习下  
恒阻模式是怎么实现的
回复

使用道具 举报

40#
ID:82809 发表于 2022-11-4 09:37 | 只看该作者
可以学习下思路,图不全,程序有问题!

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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