大家好,測試工程師又來了啦。在測試16串BMS的工作中,非常希望有一個各串電壓可方便調節的模擬電池。要求有一定的負載驅動能力。
為此,先做出單節0-5V可調的電壓源進行方案驗證。實驗取得了理想的結果,以后可考慮基于此方案制作16串分別可調的模擬電池。
先上原理圖
原理圖.jpeg (1 MB, 下載次數: 103)
下載附件
2021-3-18 14:33 上傳
本設計使用STC15W408AS單片機,控制12位DAC模塊MCP4725輸出設定的電壓,再經過運放和射極輸出器提高帶載能力。輸出能力約400mA。
支持矩陣鍵盤輸入電壓設定值,支持RS485通訊,可用串口助手下發報文進行電壓設置。
實物照片:
實物 實際值.jpg (273.43 KB, 下載次數: 88)
下載附件
2021-3-18 14:39 上傳
按鍵輸入設置電壓:
實物 按鍵輸入.jpg (271.66 KB, 下載次數: 81)
下載附件
2021-3-18 14:42 上傳
使用串口助手發送報文:(格式,~開頭,!結尾,中間4位ASCII碼,0不可省略)
串口助手.png (46.43 KB, 下載次數: 85)
下載附件
2021-3-18 14:43 上傳
報文發送后立即生效,電壓調整到了設定值:
實物3300mV.jpg (324.73 KB, 下載次數: 88)
下載附件
2021-3-18 14:44 上傳
實測精度足夠高,半程以上的精度在3mV以內。以后可用16位的DAC進一步提高精度,可達1mV。
單片機main.c程序:(其余見附件)
- #include "MAIN.H"
- #include "OLED.H"
- #include "mcp4725.h"
- #include "KEY.H"
- uint set_voltage,set_voltage1; //設定值
- uchar digit4,digit3,digit2,digit1; //設定值千百十個位
- uchar i=0;
- uchar buffer[7]={0,0,0,0,0,0,0}; //485緩存
- bit flag=0; //接收完標志位
- void UartInit(void) //9600bps@11.0592MHz
- {
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x01; //串口1選擇定時器2作為波特率發生器
- AUXR &= 0xFB; //定時器2時鐘FOSC/12,即12T
- T2L = 0xE8; //設定定時器初值
- T2H = 0xFF; //設定定時器初值
- AUXR |= 0x10; //啟動定時器2
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- }
- void init()
- {
- OLED_Init();
- OLED_CLS();
- OLED_hzStr(16,0,2); //數
- OLED_hzStr(32,0,3); //字
- OLED_hzStr(48,0,0); //電
- OLED_hzStr(64,0,1); //壓
- OLED_hzStr(80,0,4); //源
- SDA=0;SCL=0;
- MCP4725_WriteData_Digital(0);
- Display();
- OLED_hzStr(96,6,7); //實
- OLED_hzStr(112,6,8); //際
- UartInit();
- }
- void communication(void)
- {
- if(flag==1) //當接收完報文,開始處理
- {
- flag=0;
- set_digit4=buffer[1]-0x30;
- set_digit3=buffer[2]-0x30;
- set_digit2=buffer[3]-0x30;
- set_digit1=buffer[4]-0x30;
- set_voltage=set_digit1+set_digit2*10+set_digit3*100+set_digit4*1000;
- set_voltage1=set_voltage*0.8192; //轉化為數字量
- if(set_voltage1>=4096) //如輸入值超上限,則輸出最大值
- set_voltage1=4095;
- if(set_voltage>=5000) //如輸入值超上限,則輸出顯示值顯示最大值5000mV
- set_voltage=5000;
- set_digit1=0;set_digit2=0;set_digit3=0;set_digit4=0;
- MCP4725_WriteData_Digital(set_voltage1); //寫入DA模塊
- Display(); //更新顯示
- }
- }
- void main()
- {
- init(); //初始化;
- while(1)
- {
- keyprocess(); //調用按鍵掃描處理
- communication(); //RS485通信處理
- }
- }
- void Usart() interrupt 4 using 1 //串口1中斷處理
- {
- buffer[i]=SBUF;
- if(buffer[i]==0x7E) //接收的報文以~開頭(即0x7E)
- {
- i=0;
- buffer[i]=SBUF;
- }
- RI=0;
- i++;
- if(buffer[i-1]==0x21) //接收的報文以!結尾(即0x21)
- {
- i=0;
- flag=1;
- }
- }
復制代碼
51hei.png (8.98 KB, 下載次數: 105)
下載附件
2021-3-18 21:32 上傳
附原理圖和程序。
全部資料51hei下載地址:
數字電壓源程序 V1.0 20210318.rar
(171.87 KB, 下載次數: 274)
2021-3-18 14:46 上傳
點擊文件名下載附件
原理圖和程序 下載積分: 黑幣 -5
|