找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7331|回复: 11
收起左侧

基于STM32的程控电子负载电路图与源码设计

  [复制链接]
ID:306302 发表于 2018-7-19 10:05 | 显示全部楼层 |阅读模式
本人为初学者,内容十分贫乏,欢迎各位指点。

电路原理图如下:

0.png
恒流模式
用设定电流乘R2,得到电压值,根据这个电压调节基准电压,使电流稳定在设定值

恒阻模式
在P4处采到电压,得到待测电压值,根据设定阻值得到MOS管和R2处的电流,算出R2的电压,在调节基准电压使得阻值稳定

0.png

Altium Designer画的程控电子负载原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

stm32单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "adc.h"
  4. #include "oled.h"
  5. #include "DAC.h"
  6. #include "key.h"
  7. #include "usart.h"        
  8. #include "24cxx.h"
  9. void oled_show(int a);

  10. int main(void)
  11. {        
  12.          
  13.         float adc1,u1;
  14.         float set_I = 100,u,I,R = 2.71,set_R = 100,set_P = 1.00,temp;
  15.         u16 key, i =0,j=0;
  16.         
  17.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  18.         uart_init(115200);                 //串口初始化为115200
  19.         Adc1_Init();
  20.         Dac1_Init();
  21.         delay_init();  //延时函数初始化
  22.         KEY_Init();
  23.         OLED_Init();
  24.         OLED_Clear();
  25.         delay_init();
  26.         AT24CXX_Init();
  27.         while(1)
  28.         {
  29.                 oled_show(0);        
  30.                 key =KEY_Scan(0);
  31.                 if (key ==KEY0_PRES)//恒流模式
  32.                 {
  33.                                 OLED_Clear();
  34.                                 oled_show(1);
  35.                         while(1)
  36.                         {
  37.                                 adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
  38.                                 u1 = adc1/4096*3.3/0.99*10.993;
  39.                                 
  40.                                 key =KEY_Scan(0);
  41.                                 if (key ==WKUP_PRES)
  42.                                 {
  43.                                                 set_I = set_I+10;
  44.                                                 if (set_I>1000) set_I =1000;
  45.                                 }
  46.                                 if (key ==KEY1_PRES)
  47.                                 {
  48.                                                 set_I = set_I-10;
  49.                                                 if (set_I<100) set_I =100;
  50.                                 }
  51.                                 u =set_I/1000*R;
  52.                                 Dac1_Set_Vol(u*1000);
  53.                                 if (key ==KEY2_PRES)
  54.                                 {
  55.                                         temp =u*100;
  56.                                         AT24CXX_WriteLenByte(0+4*i,temp,4);        
  57.                                         i++;if (i == 10) i = 0;
  58.                                 }
  59.                                 if (key ==KEY0_PRES)
  60.                                 {
  61.                                         temp =        AT24CXX_ReadLenByte(0+4*j,4);
  62.                                         temp = temp/100;
  63.                                         OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);        
  64.                                         j++;if (j == 10) j = 0;
  65.                                 }                        
  66.                                 I = u/R*1000;        
  67.                                 OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);               
  68.                                 OLED_ShowUnNum(40, 4, set_I, 4,12);
  69.                                 OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
  70.                                 OLED_ShowUnNum(40, 7, I, 4, 12);               
  71.                         }
  72.                 }
  73.                 if (key ==KEY1_PRES)//恒阻模式
  74.                 {
  75.                                 OLED_Clear();
  76.                                 oled_show(2);
  77.                         while(1)
  78.                         {
  79.                                 adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
  80.                                 u1 = adc1/4096*3.3/0.99*10.993;

  81.                                 key =KEY_Scan(0);
  82.                                 if (key ==WKUP_PRES)
  83.                                 {
  84.                                                 set_R = set_R+1000;
  85.                                                 if (set_R >10000) set_R =10000;
  86.                                 }
  87.                                 if (key ==KEY1_PRES)
  88.                                 {
  89.                                                 set_R = set_R-1000;
  90.                                                 if (set_R <15) set_R = 15;
  91.                                 }
  92.                                 if (key ==KEY2_PRES)
  93.                                 {
  94.                                         temp =u*100;
  95.                                         AT24CXX_WriteLenByte(0+4*i,temp,4);        
  96.                                         i++;if (i == 10) i = 0;
  97.                                 }
  98.                                 if (key ==KEY0_PRES)
  99.                                 {
  100.                                         temp =        AT24CXX_ReadLenByte(0+4*j,4);
  101.                                         temp = temp/100;
  102.                                         OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);        
  103.                                         j++;if (j == 10) j = 0;
  104.                                 }                                
  105.                                 u = u1/set_R*R;
  106.                                 Dac1_Set_Vol(u*1000);
  107.                         I = u/R*1000;
  108.                                 OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);
  109.                                 OLED_ShowUnNum(40, 4, set_R, 5,12);        
  110.                                 OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
  111.                                 OLED_ShowUnNum(40, 7, I, 4, 12);
  112.                         }
  113.                 }
  114.                 if (key ==KEY2_PRES)//恒功率模式
  115.                 {
  116.                                 OLED_Clear();
  117.                                 oled_show(3);
  118.                         while(1)
  119.                         {
  120.                                 adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
  121.                                 u1 = adc1/4096*3.3/0.99*10.993;


  122.                                 key =KEY_Scan(0);
  123.                                 if (key ==WKUP_PRES)
  124.                                 {
  125.                                         set_P = set_P+1.00;
  126.                                         if (set_P > 30.00) set_P = 30.00;
  127.                                 }
  128.                                 if (key ==KEY1_PRES)
  129.                                 {
  130.                                         set_P = set_P-1.00;
  131.                                         if (set_P < 1.00) set_P = 1.00;
  132.                                 }
  133.                                 if (key ==KEY2_PRES)
  134.                                 {
  135.                                         temp =u*100;
  136.                                         AT24CXX_WriteLenByte(0+4*i,temp,4);        
  137.                                         i++;if (i == 10) i = 0;
  138.                                 }
  139.                                 if (key ==KEY0_PRES)
  140.                                 {
  141.                                         temp =        AT24CXX_ReadLenByte(0+4*j,4);
  142.                                         temp = temp/100;
  143.                                         OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);        
  144.                                         j++;if (j == 10) j = 0;
  145.                                 }        
  146.                                                 
  147.                                 u = set_P/u1*R;
  148.                                 Dac1_Set_Vol(u*1000);
  149.                         I = u/R*1000;
  150.                                 OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);
  151.                                 OLED_ShowUnFloat(40, 4, set_P,2,2,12);
  152.                                 OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
  153.                                 OLED_ShowUnNum(40, 7, I, 4, 12);        

  154.                         }
  155.                 }
  156.         }
  157. }


  158. void oled_show(int a)
  159. {
  160.         if (a == 0)
  161.         {
  162.                         OLED_ShowCHinese(17,0,0);
  163.                         OLED_ShowCHinese(34,0,1);
  164.                         OLED_ShowCHinese(50,0,2);        
  165.                         OLED_ShowCHinese(67,0,3);
  166.                         OLED_ShowCHinese(17,3,0);
  167.                         OLED_ShowCHinese(34,3,4);
  168.                         OLED_ShowCHinese(50,3,2);        
  169.                         OLED_ShowCHinese(67,3,3);
  170.                         OLED_ShowCHinese(17,6,0);
  171.                         OLED_ShowCHinese(34,6,5);
  172.                         OLED_ShowCHinese(50,6,6);
  173.                         OLED_ShowCHinese(67,6,2);
  174.                         OLED_ShowCHinese(84,6,3);
  175.         }
  176.         if (a == 1)
  177.         {

  178.                         OLED_ShowCHinese(0,0,0);
  179.                         OLED_ShowCHinese(17,0,1);
  180.                         OLED_ShowCHinese(34,0,2);
  181.                         OLED_ShowCHinese(50,0,3);
  182.                         OLED_ShowString(0,2, "Uin=      V",12);
  183.                         OLED_ShowString(0,4, "Iset=    mA",12);
  184.                         OLED_ShowString(0,6, "Uout=     V",12);
  185.                         OLED_ShowString(0,7, "  I =    mA",12);
  186.         }
  187.         if (a == 2)
  188.         {
  189.                         OLED_ShowCHinese(0,0,0);
  190.                         OLED_ShowCHinese(17,0,4);
  191.                         OLED_ShowCHinese(34,0,2);
  192.                         OLED_ShowCHinese(50,0,3);
  193.                         OLED_ShowString(0,2, "Uin=      V",12);
  194.                         OLED_ShowString(0,4, "Rset=     R",12);
  195.                         OLED_ShowString(0,6, "Uout=     V",12);
  196.                         OLED_ShowString(0,7, "  I =    mA",12);
  197.         }
  198.         if (a == 3)
  199.         {
  200.                         OLED_ShowCHinese(0,0,0);
  201.                         OLED_ShowCHinese(17,0,5);
  202.                         OLED_ShowCHinese(34,0,6);
  203.                         OLED_ShowCHinese(50,0,2);
  204.                         OLED_ShowCHinese(67,0,3);
  205.                         OLED_ShowString(0,2, "Uin=      V",12);
  206.                         OLED_ShowString(0,4, "Pset=     W",12);
  207.                         OLED_ShowString(0,6, "Uout=     V",12);
  208.                         OLED_ShowString(0,7, "  I =    mA",12);
  209.         
  210.         }
  211. }        
复制代码
0.png
所有资料51hei提供下载:
电子负载(自制).rar (1.56 MB, 下载次数: 152)

评分

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

查看全部评分

回复

使用道具 举报

ID:84147 发表于 2018-8-8 20:10 | 显示全部楼层
不知,实物做出来没有,效果如何
回复

使用道具 举报

ID:389836 发表于 2019-5-16 10:26 | 显示全部楼层
楼主实际有做过测试吗?效果如何
回复

使用道具 举报

ID:544237 发表于 2019-7-8 16:49 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:55591 发表于 2019-7-25 14:19 | 显示全部楼层
感谢 楼主分享
回复

使用道具 举报

ID:377519 发表于 2019-8-5 12:23 | 显示全部楼层
学习了,我试着做一下
回复

使用道具 举报

ID:145511 发表于 2020-6-16 10:01 | 显示全部楼层
乱发,运放都是反的.还有上面反馈也没有.你是新手么,电流你采集的负,误导群友,拉出去.
回复

使用道具 举报

ID:128989 发表于 2020-10-19 03:02 | 显示全部楼层
电路试过行不行的?
回复

使用道具 举报

ID:832079 发表于 2020-10-20 09:22 | 显示全部楼层

感谢分享,51有你更精彩!!!!
回复

使用道具 举报

ID:61140 发表于 2022-6-10 00:56 | 显示全部楼层
yangchun 发表于 2020-6-16 10:01
乱发,运放都是反的.还有上面反馈也没有.

这种一看就是上电炸板的DIY,乱发贴子赚黑币的.不理会就是了
回复

使用道具 举报

ID:1048397 发表于 2022-10-24 08:50 | 显示全部楼层
高深,先标记一下慢慢读。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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