大家好,测试工程师又来了啦。在测试16串BMS的工作中,非常希望有一个各串电压可方便调节的模拟电池。要求有一定的负载驱动能力。
为此,先做出单节0-5V可调的电压源进行方案验证。实验取得了理想的结果,以后可考虑基于此方案制作16串分别可调的模拟电池。
先上原理图
本设计使用STC15W408AS单片机,控制12位DAC模块MCP4725输出设定的电压,再经过运放和射极输出器提高带载能力。输出能力约400mA。
支持矩阵键盘输入电压设定值,支持RS485通讯,可用串口助手下发报文进行电压设置。
实物照片:
按键输入设置电压:
使用串口助手发送报文:(格式,~开头,!结尾,中间4位ASCII码,0不可省略)
报文发送后立即生效,电压调整到了设定值:
实测精度足够高,半程以上的精度在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下载地址:
数字电压源程序 V1.0 20210318.rar
(171.87 KB, 下载次数: 274)
|