单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4984|回复:4
打印上一主题下一主题

基于proteus的电子负载仿真与Arduino源程序

[复制链接]
跳转到指定楼层
楼主
ID:141133发表于 2018-1-1 08:23|只看该作者|只看大图回帖奖励
附件是基于proteus的电子负载仿真,主控芯片是AVR。
ElectronicLoad-master
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



Arduino单片机源程序如下:
  1. #define DEBUG

  2. #include< LiquidCrystal.h>
  3. #include< Encoder.h>
  4. #include "variables.h"
  5. #include "lcd.h"
  6. #include "pwm16Bit.h"
  7. #include "iSet.h"
  8. #include "timer2.h"
  9. #include "misc.h"
  10. #include "voltageAndCurrentSensors.h"


  11. void setup() {

  12.   #ifdef DEBUG
  13.    Serial.begin(115200);
  14.   #endif

  15.   //ILOAD_PIN as PWM output
  16.   setupPWM16();

  17.   //Configure TIMER2 so that it calls ISR(TIMER2_COMPA_vect) @ 500Hz (every 2mS)
  18.   //ISR(TIMER2_COMPA_vect) is used to update CC waveforms
  19.   setupTimer2();

  20.   //LCD Setup
  21.   lcd.begin(16, 2);
  22.   lcd.print("ElectronicLoad");
  23.   lcd.setCursor(0,1);
  24.   lcd.print("  [Version 1.07]");
  25.   lcd.createChar(0, ohm);
  26.   lcd.createChar(1, vLoad);
  27.   lcd.createChar(2, iLoad);
  28.   lcd.createChar(3, hi);
  29.   lcd.createChar(4, lo);

  30.   delay(1500);

  31.   //Button and Led pinmode setup
  32.   pinMode(OUTPUT, outputEnabledLed);
  33.   pinMode(INPUT, encBtn);
  34.   digitalWrite(encBtn, HIGH);             //Enable internal pullup
  35.   pinMode(INPUT, modeSelectorBtn);
  36.   digitalWrite(modeSelectorBtn, HIGH);       //Enable internal pullup
  37.   pinMode(INPUT, outputEnableBtn);
  38.   digitalWrite(outputEnableBtn, HIGH);       //Enable internal pullup

  39.   //ISet calibration (Finds a proper ISetOneAmp value where IL=1A)
  40.   //calibrateISet();
  41.   ISetOneAmp=14280;

  42.   resetLcdToDefault();
  43.   lcd.setCursor(0, 0);
  44.   lcd.write("C.Cur:");
  45. }


  46. void loop() {

  47. if(mode == CONSTANT_CURRENT) {
  48.    int encoderPos = getEncoderMovement();     //getEncoderMovement() returns either -1, 0 or 1
  49.    if(encoderPos > 0&& ISetVal< ISET_CC_MAX)   //Encoder incremented
  50.      ISetVal+=ISET_CC_STEP;
  51.    else if (encoderPos< 0&& ISetVal >= ISET_CC_STEP)   //Encoder decremented
  52.      ISetVal-=ISET_CC_STEP;

  53.    lcd.setCursor(0, 1);
  54.    lcdPrintIntWhitespace(ISetVal, 4);
  55.    lcd.print(ISetVal);
  56.    lcd.write("mA");
  57.   }

  58.   
  59. if(mode == CONSTANT_RESISTANCE) {
  60.    byte encoderPos = getEncoderMovement();     //getEncoderMovement() returns either -1, 0 or 1
  61.    if(encoderPos > 0&& ISetVal< ISET_CR_MAX)   //Encoder incremented
  62.      ISetVal+=ISET_CR_STEP;
  63.    else if (encoderPos< 0&& ISetVal >= ISET_CR_MIN)   //Encoder decremented
  64.      ISetVal-=ISET_CR_STEP;
  65.   
  66.    lcd.setCursor(0, 1);
  67.    lcdPrintIntWhitespace(ISetVal, 4);
  68.    lcd.print(ISetVal);
  69.    lcd.write(byte(0)); //ohm char
  70.   }

  71.   
  72. if(mode == CONSTANT_POWER) {
  73.    byte encoderPos = getEncoderMovement();     //getEncoderMovement() returns either -1, 0 or 1
  74.    if(encoderPos > 0&& ISetVal< ISET_CP_MAX)   //Encoder incremented
  75.      ISetVal+=ISET_CP_STEP;
  76.    else if (encoderPos< 0&& ISetVal >= ISET_CP_STEP)   //Encoder decremented
  77.      ISetVal-=ISET_CP_STEP;
  78.   
  79.    lcd.setCursor(0, 1);
  80.    lcdPrintIntWhitespace(ISetVal, 4);
  81.    lcd.print(ISetVal);
  82.    lcd.write("mW");
  83.   }

  84.    if(mode == SQUARE_CURRENT) {
  85.    int encoderPos = getEncoderMovement();     //encoderPos is either -1, 0 or 1
  86.    if(encoderPos != 0) {                 //Encoder changed
  87.      switch(SCCurrentParam) {
  88.      case SC_PARAM_IHI:
  89.        if(encoderPos > 0&& ISetSCIHi< ISET_SC_IMAX)  
  90.        ISetSCIHi += ISET_SC_I_STEP;
  91.        else if(encoderPos< 0&& ISetSCIHi >= ISET_SC_I_STEP&& ISetSCIHi > ISetSCILo)        
  92.        ISetSCIHi -= ISET_SC_I_STEP;  
  93.        break;
  94.      case SC_PARAM_ILO:
  95.        if(encoderPos > 0&& ISetSCILo< ISET_SC_IMAX&& ISetSCILo< ISetSCIHi)  
  96.        ISetSCILo += ISET_SC_I_STEP;
  97.        else if(encoderPos< 0&& ISetSCILo >= ISET_SC_I_STEP)        
  98.        ISetSCILo -= ISET_SC_I_STEP;  
  99.        break;
  100.      case SC_PARAM_THI:
  101.        if(encoderPos > 0&& ISetSCTHi< ISET_SC_TMAX)  
  102.        ISetSCTHi += ISET_SC_T_STEP;
  103.        else if(encoderPos< 0&& ISetSCTHi >= ISET_SC_T_STEP)        
  104.        ISetSCTHi -= ISET_SC_T_STEP;  
  105.        break;
  106.      case SC_PARAM_TLO:
  107.      if(encoderPos > 0&& ISetSCTLo< ISET_SC_TMAX)  
  108.        ISetSCTLo += ISET_SC_T_STEP;
  109.        else if(encoderPos< 0&& ISetSCTLo >= ISET_SC_T_STEP)        
  110.        ISetSCTLo -= ISET_SC_T_STEP;  
  111.        break;
  112.      }
  113.    }

  114.    lcd.setCursor(0, 1);
  115.    switch(SCCurrentParam) {
  116.      case SC_PARAM_IHI:
  117.        lcd.write("I");
  118.        lcd.write(byte(3));
  119.        lcdPrintIntWhitespace(ISetSCIHi, 4);
  120.        lcd.print(ISetSCIHi);
  121.        lcd.write("mA");
  122.        break;
  123.       
  124.      case SC_PARAM_ILO:
  125.        lcd.write("I");
  126.        lcd.write(byte(4));
  127.        lcdPrintIntWhitespace(ISetSCILo, 4);
  128.        lcd.print(ISetSCILo);
  129.        lcd.write("mA");
  130.        break;
  131.       
  132.      case SC_PARAM_THI:
  133.        lcd.write("T");
  134.        lcd.write(byte(3));
  135.        lcdPrintIntWhitespace(ISetSCTHi, 4);
  136.        lcd.print(ISetSCTHi);
  137.        lcd.write("mS");  
  138.        break;
  139.         
  140.      case SC_PARAM_TLO:
  141.        lcd.write("T");
  142.        lcd.write(byte(4));
  143.        lcdPrintIntWhitespace(ISetSCTLo, 4);
  144.        lcd.print(ISetSCTLo);
  145.        lcd.write("mS");
  146.        break;
  147.    }
  148.   }

  149.    if(mode == TRIANGLE_CURRENT) {
  150.    int encoderPos = getEncoderMovement();     //encoderPos is either -1, 0 or 1
  151.    if(encoderPos != 0) {                 //Encoder changed
  152.      switch(TCCurrentParam) {
  153.      case TC_PARAM_IHI:
  154.        if(encoderPos > 0&& ISetTCIHi< ISET_TC_IMAX)  
  155.        ISetTCIHi += ISET_TC_I_STEP;
  156.        else if(encoderPos< 0&& ISetTCIHi >= ISET_SC_I_STEP&& ISetTCIHi > ISetTCILo)        
  157.        ISetTCIHi -= ISET_TC_I_STEP;  
  158.        break;
  159.      case TC_PARAM_ILO:
  160.        if(encoderPos > 0&& ISetTCILo< ISET_TC_IMAX&& ISetTCILo< ISetTCIHi)  
  161.        ISetTCILo += ISET_TC_I_STEP;
  162.        else if(encoderPos< 0&& ISetTCILo >= ISET_TC_I_STEP)        
  163.        ISetTCILo -= ISET_TC_I_STEP;  
  164.        break;
  165.      case TC_PARAM_THI:
  166.        if(encoderPos > 0&& ISetTCTHi< ISET_TC_TMAX)  
  167.        ISetTCTHi += ISET_TC_T_STEP;
  168.        else if(encoderPos< 0&& ISetTCTHi >= ISET_TC_T_STEP)        
  169.        ISetTCTHi -= ISET_TC_T_STEP;  
  170.        break;
  171.      case TC_PARAM_TLO:
  172.      if(encoderPos > 0&& ISetTCTLo< ISET_TC_TMAX)  
  173.        ISetTCTLo += ISET_TC_T_STEP;
  174.        else if(encoderPos< 0&& ISetTCTLo >= ISET_TC_T_STEP)        
  175.        ISetTCTLo -= ISET_TC_T_STEP;  
  176.        break;
  177.      }
  178.    }

  179.    lcd.setCursor(0, 1);
  180.    switch(TCCurrentParam) {
  181.      case TC_PARAM_IHI:
  182.        lcd.write("I");
  183.        lcd.write(byte(3));
  184.        lcdPrintIntWhitespace(ISetTCIHi, 4);
  185.        lcd.print(ISetTCIHi);
  186.        lcd.write("mA");
  187.        break;
  188.       
  189.      case TC_PARAM_ILO:
  190.        lcd.write("I");
  191.        lcd.write(byte(4));
  192.        lcdPrintIntWhitespace(ISetTCILo, 4);
  193.        lcd.print(ISetTCILo);
  194.        lcd.write("mA");
  195.        break;
  196.       
  197.      case TC_PARAM_THI:
  198.        lcd.write("T");
  199.        lcd.write(byte(3));
  200.        lcdPrintIntWhitespace(ISetTCTHi, 4);
  201.        lcd.print(ISetTCTHi);
  202.        lcd.write("mS");  
  203.        break;
  204.         
  205.      case TC_PARAM_TLO:
  206.        lcd.write("T");
  207.        lcd.write(byte(4));
  208.        lcdPrintIntWhitespace(ISetTCTLo, 4);
  209.        lcd.print(ISetTCTLo);
  210.        lcd.write("mS");
  211.        break;
  212.    }

  213.   
  214.   }

  215.    if(mode == SINE_CURRENT) {
  216.   int encoderPos = getEncoderMovement();       //encoderPos is either -1, 0 or 1
  217.    if(encoderPos != 0) {                 //Encoder changed
  218.      switch(SNCCurrentParam) {
  219.      case SNC_PARAM_IHI:
  220.        if(encoderPos > 0&& ISetSNCIHi< ISET_SNC_IMAX)  
  221.        ISetSNCIHi += ISET_SNC_I_STEP;
  222.        else if(encoderPos< 0&& ISetSNCIHi >= ISET_SNC_I_STEP&& ISetSNCIHi > ISetSNCILo)        
  223.        ISetSNCIHi -= ISET_SNC_I_STEP;  
  224.        break;
  225.      case SNC_PARAM_ILO:
  226.        if(encoderPos > 0&& ISetSNCILo< ISET_SNC_IMAX&& ISetSNCILo< ISetSNCIHi)  
  227.        ISetSNCILo += ISET_SNC_I_STEP;
  228.        else if(encoderPos< 0&& ISetSNCILo >= ISET_SNC_I_STEP)        
  229.        ISetSNCILo -= ISET_SNC_I_STEP;  
  230.        break;
  231.      case SNC_PARAM_T:
  232.        if(encoderPos > 0&& ISetSNCT< ISET_SNC_TMAX)  
  233.        ISetSNCT += ISET_SNC_T_STEP;
  234.        else if(encoderPos< 0&& ISetSNCT >= ISET_SNC_T_STEP)        
  235.        ISetSNCT -= ISET_SNC_T_STEP;  
  236.        break;
  237.      }
  238.    }

  239.    lcd.setCursor(0, 1);
  240.    switch(SNCCurrentParam) {
  241.      case SNC_PARAM_IHI:
  242.        lcd.write("I");
  243.        lcd.write(byte(3));
  244.        lcdPrintIntWhitespace(ISetSNCIHi, 4);
  245.        lcd.print(ISetSNCIHi);
  246.        lcd.write("mA");
  247.        break;
  248.       
  249.      case SNC_PARAM_ILO:
  250.        lcd.write("I");
  251.        lcd.write(byte(4));
  252.        lcdPrintIntWhitespace(ISetSNCILo, 4);
  253.        lcd.print(ISetSNCILo);
  254.        lcd.write("mA");
  255.        break;
  256.       
  257.      case SNC_PARAM_T:
  258.        lcd.write("T:");
  259.        lcdPrintIntWhitespace(ISetSNCT, 4);
  260.        lcd.print(ISetSNCT);
  261.        lcd.write("mS");  
  262.        break;

  263.    }

  264.   

  265.   
  266.   }



  267.   //Always update and print VLoad and ILoad
  268.   updateVLoad();
  269.   updateILoad();
  270.   printVLoadAndILoad();



  271.   //Handle Mode change button press
  272.   if(digitalRead(modeSelectorBtn) == LOW)  {
  273.    handleModeSelection();

  274.    //Prevent double triggering?
  275.    delay(400);
  276.   }


  277.   //Handle Output Enable/Disable button press
  278.   if(digitalRead(outputEnableBtn) == LOW)  {
  279.   
  280.    outputEnabled = !outputEnabled;
  281.    if(outputEnabled) {
  282.      digitalWrite(outputEnabledLed, HIGH);
  283.      enableTimer2();
  284.    } else {
  285.      digitalWrite(outputEnabledLed, LOW);
  286.      disableTimer2();
  287.      writeISet(0);
  288.    }
  289.   
  290.    //Prevent double triggering?
  291.    delay(400);
  292.   }


  293.   //Handle Encoder button press (toggle parameter change)
  294.   if(digitalRead(encBtn) == LOW)  {
  295.      if(mode == SQUARE_CURRENT) {
  296.        switch(SCCurrentParam) {
  297.          case SC_PARAM_IHI:
  298.            SCCurrentParam = SC_PARAM_ILO;  break;
  299.          case SC_PARAM_ILO:
  300.            SCCurrentParam = SC_PARAM_THI;  break;
  301.          case SC_PARAM_THI:
  302.            SCCurrentParam = SC_PARAM_TLO;  break;
  303.          case SC_PARAM_TLO:
  304.            SCCurrentParam = SC_PARAM_IHI;  break;
  305.        }
  306.      } else if(mode == TRIANGLE_CURRENT) {
  307.        switch(TCCurrentParam) {
  308.          case TC_PARAM_IHI:
  309.            TCCurrentParam = TC_PARAM_ILO;  break;
  310.          case TC_PARAM_ILO:
  311.            TCCurrentParam = TC_PARAM_THI;  break;
  312.          case TC_PARAM_THI:
  313.            TCCurrentParam = TC_PARAM_TLO;  break;
  314.          case TC_PARAM_TLO:
  315.            TCCurrentParam = TC_PARAM_IHI;  break;
  316.        }
  317.      } else if(mode == SINE_CURRENT) {
  318.        switch(SNCCurrentParam) {
  319.          case SNC_PARAM_IHI:
  320.            SNCCurrentParam = SNC_PARAM_ILO;  break;
  321.          case SNC_PARAM_ILO:
  322.            SNCCurrentParam = SNC_PARAM_T;  break;
  323.          case SNC_PARAM_T:
  324.            SNCCurrentParam = SNC_PARAM_IHI;  break;
  325.        }    
  326.      }

  327.    //Prevent double triggering?
  328.    delay(200);
  329.   }


  330. //A little delay for good luck
  331. delay(100);

  332. }

复制代码

所有资料51hei提供下载:
ElectronicLoad-master.zip(154.42 KB, 下载次数: 61)




评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:61724发表于 2020-3-10 17:06|只看该作者
谢谢分享  学习一下
板凳
ID:742301发表于 2020-5-19 00:50来自手机|只看该作者
楼主,可以教我一下嘛
地板
ID:250384发表于 2023-5-1 20:46|只看该作者
学习下,在准备DIY个电子负载。
5#
ID:138707发表于 2023-7-29 17:43|只看该作者
楼主,可以教我一下嘛

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

Powered by 单片机教程网