本人為初學(xué)者,內(nèi)容十分貧乏,歡迎各位指點(diǎn)。
電路原理圖如下:
恒流模式
用設(shè)定電流乘R2,得到電壓值,根據(jù)這個(gè)電壓調(diào)節(jié)基準(zhǔn)電壓,使電流穩(wěn)定在設(shè)定值
恒阻模式
在P4處采到電壓,得到待測(cè)電壓值,根據(jù)設(shè)定阻值得到MOS管和R2處的電流,算出R2的電壓,在調(diào)節(jié)基準(zhǔn)電壓使得阻值穩(wěn)定
Altium Designer畫的程控電子負(fù)載原理圖和PCB圖如下:(51hei附件中可下載工程文件)
stm32單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "adc.h"
- #include "oled.h"
- #include "DAC.h"
- #include "key.h"
- #include "usart.h"
- #include "24cxx.h"
- void oled_show(int a);
- int main(void)
- {
-
- float adc1,u1;
- float set_I = 100,u,I,R = 2.71,set_R = 100,set_P = 1.00,temp;
- u16 key, i =0,j=0;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- uart_init(115200); //串口初始化為115200
- Adc1_Init();
- Dac1_Init();
- delay_init(); //延時(shí)函數(shù)初始化
- KEY_Init();
- OLED_Init();
- OLED_Clear();
- delay_init();
- AT24CXX_Init();
- while(1)
- {
- oled_show(0);
- key =KEY_Scan(0);
- if (key ==KEY0_PRES)//恒流模式
- {
- OLED_Clear();
- oled_show(1);
- while(1)
- {
- adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
- u1 = adc1/4096*3.3/0.99*10.993;
-
- key =KEY_Scan(0);
- if (key ==WKUP_PRES)
- {
- set_I = set_I+10;
- if (set_I>1000) set_I =1000;
- }
- if (key ==KEY1_PRES)
- {
- set_I = set_I-10;
- if (set_I<100) set_I =100;
- }
- u =set_I/1000*R;
- Dac1_Set_Vol(u*1000);
- if (key ==KEY2_PRES)
- {
- temp =u*100;
- AT24CXX_WriteLenByte(0+4*i,temp,4);
- i++;if (i == 10) i = 0;
- }
- if (key ==KEY0_PRES)
- {
- temp = AT24CXX_ReadLenByte(0+4*j,4);
- temp = temp/100;
- OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);
- j++;if (j == 10) j = 0;
- }
- I = u/R*1000;
- OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);
- OLED_ShowUnNum(40, 4, set_I, 4,12);
- OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
- OLED_ShowUnNum(40, 7, I, 4, 12);
- }
- }
- if (key ==KEY1_PRES)//恒阻模式
- {
- OLED_Clear();
- oled_show(2);
- while(1)
- {
- adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
- u1 = adc1/4096*3.3/0.99*10.993;
- key =KEY_Scan(0);
- if (key ==WKUP_PRES)
- {
- set_R = set_R+1000;
- if (set_R >10000) set_R =10000;
- }
- if (key ==KEY1_PRES)
- {
- set_R = set_R-1000;
- if (set_R <15) set_R = 15;
- }
- if (key ==KEY2_PRES)
- {
- temp =u*100;
- AT24CXX_WriteLenByte(0+4*i,temp,4);
- i++;if (i == 10) i = 0;
- }
- if (key ==KEY0_PRES)
- {
- temp = AT24CXX_ReadLenByte(0+4*j,4);
- temp = temp/100;
- OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);
- j++;if (j == 10) j = 0;
- }
- u = u1/set_R*R;
- Dac1_Set_Vol(u*1000);
- I = u/R*1000;
- OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);
- OLED_ShowUnNum(40, 4, set_R, 5,12);
- OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
- OLED_ShowUnNum(40, 7, I, 4, 12);
- }
- }
- if (key ==KEY2_PRES)//恒功率模式
- {
- OLED_Clear();
- oled_show(3);
- while(1)
- {
- adc1 = Get_Adc1_Average(ADC_Channel_1, 10);
- u1 = adc1/4096*3.3/0.99*10.993;
- key =KEY_Scan(0);
- if (key ==WKUP_PRES)
- {
- set_P = set_P+1.00;
- if (set_P > 30.00) set_P = 30.00;
- }
- if (key ==KEY1_PRES)
- {
- set_P = set_P-1.00;
- if (set_P < 1.00) set_P = 1.00;
- }
- if (key ==KEY2_PRES)
- {
- temp =u*100;
- AT24CXX_WriteLenByte(0+4*i,temp,4);
- i++;if (i == 10) i = 0;
- }
- if (key ==KEY0_PRES)
- {
- temp = AT24CXX_ReadLenByte(0+4*j,4);
- temp = temp/100;
- OLED_ShowUnFloat(90, 6, temp, 2, 2, 12);
- j++;if (j == 10) j = 0;
- }
-
- u = set_P/u1*R;
- Dac1_Set_Vol(u*1000);
- I = u/R*1000;
- OLED_ShowUnFloat(30, 2, u1, 2, 4, 12);
- OLED_ShowUnFloat(40, 4, set_P,2,2,12);
- OLED_ShowUnFloat(40, 6, u, 2, 2, 12);
- OLED_ShowUnNum(40, 7, I, 4, 12);
- }
- }
- }
- }
- void oled_show(int a)
- {
- if (a == 0)
- {
- OLED_ShowCHinese(17,0,0);
- OLED_ShowCHinese(34,0,1);
- OLED_ShowCHinese(50,0,2);
- OLED_ShowCHinese(67,0,3);
- OLED_ShowCHinese(17,3,0);
- OLED_ShowCHinese(34,3,4);
- OLED_ShowCHinese(50,3,2);
- OLED_ShowCHinese(67,3,3);
- OLED_ShowCHinese(17,6,0);
- OLED_ShowCHinese(34,6,5);
- OLED_ShowCHinese(50,6,6);
- OLED_ShowCHinese(67,6,2);
- OLED_ShowCHinese(84,6,3);
- }
- if (a == 1)
- {
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(17,0,1);
- OLED_ShowCHinese(34,0,2);
- OLED_ShowCHinese(50,0,3);
- OLED_ShowString(0,2, "Uin= V",12);
- OLED_ShowString(0,4, "Iset= mA",12);
- OLED_ShowString(0,6, "Uout= V",12);
- OLED_ShowString(0,7, " I = mA",12);
- }
- if (a == 2)
- {
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(17,0,4);
- OLED_ShowCHinese(34,0,2);
- OLED_ShowCHinese(50,0,3);
- OLED_ShowString(0,2, "Uin= V",12);
- OLED_ShowString(0,4, "Rset= R",12);
- OLED_ShowString(0,6, "Uout= V",12);
- OLED_ShowString(0,7, " I = mA",12);
- }
- if (a == 3)
- {
- OLED_ShowCHinese(0,0,0);
- OLED_ShowCHinese(17,0,5);
- OLED_ShowCHinese(34,0,6);
- OLED_ShowCHinese(50,0,2);
- OLED_ShowCHinese(67,0,3);
- OLED_ShowString(0,2, "Uin= V",12);
- OLED_ShowString(0,4, "Pset= W",12);
- OLED_ShowString(0,6, "Uout= V",12);
- OLED_ShowString(0,7, " I = mA",12);
-
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
電子負(fù)載(自制).rar
(1.56 MB, 下載次數(shù): 154)
2018-7-19 16:32 上傳
點(diǎn)擊文件名下載附件
|