久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5409|回復: 4
打印 上一主題 下一主題
收起左側

基于proteus的電子負載仿真與Arduino源程序

[復制鏈接]
跳轉到指定樓層
樓主
附件是基于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, 下載次數: 62)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩高清三区 | 国产视频福利在线观看 | 日本不卡一区 | 国产欧美一级二级三级在线视频 | 国产成人免费视频网站视频社区 | 国产偷自视频区视频 | 日韩在线精品 | 日本福利在线观看 | 在线欧美亚洲 | 中文字幕精品视频 | 在线不卡视频 | 爱爱视频网 | 日韩欧美国产一区二区 | 欧洲av在线 | 日韩欧美精品在线 | 久久九九色 | 日韩精品在线一区 | 日韩成人精品一区 | 久久久在线视频 | 久久久久久99| 国产亚洲成av人片在线观看桃 | 自拍第1页| 精品国产一区二区三区日日嗨 | 日韩中文字幕2019 | 99精品视频在线观看免费播放 | 成年女人免费v片 | 亚洲色在线视频 | 日本精品一区二区三区在线观看视频 | 亚洲国产精品91 | 午夜精品在线观看 | 午夜免费电影 | 日日操日日舔 | 中文字幕一区二区三区四区 | 午夜在线视频 | 日日干干 | 视频二区在线观看 | 精品国产一区二区三区日日嗨 | 黄色在线| 久久精品二区亚洲w码 | 亚洲成人精品 | 一级黄色毛片 |