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

制作出来的实物图如下:

image.png

image.png

image.png

image.png

image.png

image.png

image.png
单片机源程序如下:
/*!
  • *     COPYRIGHT NOTICE
  • *     Copyright (c) 2018,CQ
  • *     All rights reserved.
  • *
  • *     
  • *     
  • *
  • * @file                        main.c
  • * @brief                        
  • * @author                CQ
  • * @version                V1.1
  • * @date                        2018-11-4
  • * latest amendment time:2018.12.2
  • */
  • #include"STC8A.h"
  • #include"LCD2004.h"
  • #include"config.h"
  • #include <intrins.h>
  • void main(void)
  • {
  •          GPIOInit();
  •          lcd2004Init();
  •          TimerInit();        
  •    PWMInit();
  •    lcd2004CleanAll();
  •          ADCInit();
  •         lcd2004AddressWriteString(0,0,Menu.NormalInterface.Line[0]);
  •         lcd2004AddressWriteString(1,0,Menu.NormalInterface.Line[1]);
  •         lcd2004AddressWriteString(2,0,Menu.NormalInterface.Line[2]);
  •         lcd2004AddressWriteString(3,0,Menu.NormalInterface.Line[3]);
  •    lcd2004AddressWriteByte(2,19,0xF4) ;//display Ohm  symbol
  • /*         if(MenuDataTable.SysInfo.LoadState==Running)
  •         {
  •     lcd2004AddressWriteString(3,16,"ON");                                       
  •         }
  •         else
  •         {
  •    lcd2004AddressWriteString(3,16,"OFF");                                                
  •         }*/
  •          EA=1;
  •         if(IapRead(IAPUSEDFLAG)==0x56)//check whether there is some data in eeprom
  •         {
  •           MenuDataTable.Current.Coefficient=IapReadF32(CURRENTCOEADDR);
  •           MenuDataTable.Voltage.Coefficient=IapReadF32(VOLTAGECOEADDR);
  •           MenuDataTable.SysInfo.PWMCoe=IapReadF32(PWMCOEADDR);
  •         }
  •          while(1)
  •          {
  •        ;                        
  •          }
  • }
  • 复制代码