找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7042|回复: 12
打印 上一主题 下一主题
收起左侧

自制0-5V数字可调精密电压源 基于12位DAC模块MCP4725 支持键盘输入和上位机设置电压

  [复制链接]
跳转到指定楼层
楼主
大家好,测试工程师又来了啦。在测试16串BMS的工作中,非常希望有一个各串电压可方便调节的模拟电池。要求有一定的负载驱动能力。
为此,先做出单节0-5V可调的电压源进行方案验证。实验取得了理想的结果,以后可考虑基于此方案制作16串分别可调的模拟电池。

先上原理图


本设计使用STC15W408AS单片机,控制12位DAC模块MCP4725输出设定的电压,再经过运放和射极输出器提高带载能力。输出能力约400mA。
支持矩阵键盘输入电压设定值,支持RS485通讯,可用串口助手下发报文进行电压设置。

实物照片:



按键输入设置电压:



使用串口助手发送报文:(格式,~开头,!结尾,中间4位ASCII码,0不可省略)



报文发送后立即生效,电压调整到了设定值:


实测精度足够高,半程以上的精度在3mV以内。以后可用16位的DAC进一步提高精度,可达1mV。

单片机main.c程序:(其余见附件)
  1. #include "MAIN.H"
  2. #include "OLED.H"
  3. #include "mcp4725.h"
  4. #include "KEY.H"


  5. uint set_voltage,set_voltage1;                //设定值
  6. uchar digit4,digit3,digit2,digit1;        //设定值千百十个位
  7. uchar i=0;
  8. uchar buffer[7]={0,0,0,0,0,0,0};        //485缓存
  9. bit flag=0;                                                        //接收完标志位


  10. void UartInit(void)        //9600bps@11.0592MHz
  11. {
  12.         SCON = 0x50;        //8位数据,可变波特率
  13.         AUXR |= 0x01;        //串口1选择定时器2作为波特率发生器
  14.         AUXR &= 0xFB;        //定时器2时钟FOSC/12,即12T
  15.         T2L = 0xE8;                //设定定时器初值
  16.         T2H = 0xFF;                //设定定时器初值
  17.         AUXR |= 0x10;        //启动定时器2
  18.         ES=1;                        //打开接收中断
  19.         EA=1;                        //打开总中断
  20. }


  21. void init()
  22. {
  23.         OLED_Init();
  24.         OLED_CLS();
  25.         OLED_hzStr(16,0,2); //数
  26.         OLED_hzStr(32,0,3); //字
  27.         OLED_hzStr(48,0,0); //电
  28.         OLED_hzStr(64,0,1); //压
  29.         OLED_hzStr(80,0,4); //源
  30.         SDA=0;SCL=0;
  31.         MCP4725_WriteData_Digital(0);
  32.         Display();
  33.         OLED_hzStr(96,6,7);  //实
  34.         OLED_hzStr(112,6,8); //际
  35.         UartInit();
  36. }

  37. void communication(void)
  38. {
  39.         if(flag==1)                        //当接收完报文,开始处理
  40.         {
  41.                 flag=0;
  42.                 set_digit4=buffer[1]-0x30;
  43.                 set_digit3=buffer[2]-0x30;
  44.                 set_digit2=buffer[3]-0x30;
  45.                 set_digit1=buffer[4]-0x30;
  46.                 set_voltage=set_digit1+set_digit2*10+set_digit3*100+set_digit4*1000;
  47.                 set_voltage1=set_voltage*0.8192;  //转化为数字量
  48.                 if(set_voltage1>=4096)        //如输入值超上限,则输出最大值
  49.                         set_voltage1=4095;
  50.                 if(set_voltage>=5000)        //如输入值超上限,则输出显示值显示最大值5000mV
  51.                         set_voltage=5000;
  52.                 set_digit1=0;set_digit2=0;set_digit3=0;set_digit4=0;
  53.                 MCP4725_WriteData_Digital(set_voltage1);  //写入DA模块
  54.                 Display();        //更新显示

  55.         }
  56. }

  57. void main()
  58. {
  59.         init();        //初始化;
  60.         while(1)
  61.         {
  62.                 keyprocess(); //调用按键扫描处理
  63.                 communication(); //RS485通信处理
  64.         }
  65. }


  66. void Usart() interrupt 4 using 1        //串口1中断处理
  67. {
  68.         buffer[i]=SBUF;
  69.         if(buffer[i]==0x7E)          //接收的报文以~开头(即0x7E)
  70.                 {
  71.                         i=0;
  72.                         buffer[i]=SBUF;
  73.                 }
  74.         RI=0;                  
  75.         i++;
  76.         if(buffer[i-1]==0x21) //接收的报文以!结尾(即0x21)
  77.         {
  78.                 i=0;
  79.                 flag=1;
  80.         }
  81. }
复制代码

附原理图和程序。

全部资料51hei下载地址:
数字电压源程序 V1.0 20210318.rar (171.87 KB, 下载次数: 256)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:219787 发表于 2021-4-9 10:35 | 只看该作者
你好,你这有没有MCP4725的中文资料
回复

使用道具 举报

板凳
ID:507641 发表于 2022-9-15 08:00 | 只看该作者
屏型号是?
回复

使用道具 举报

地板
ID:1048397 发表于 2022-10-26 10:20 | 只看该作者
好创意,,,收藏了慢慢学。
回复

使用道具 举报

5#
ID:155507 发表于 2023-4-2 08:35 | 只看该作者

我认为屏型号是OLED1306 SSD1306 四针脚oled
回复

使用道具 举报

6#
ID:712493 发表于 2023-4-2 09:28 | 只看该作者
怎么模拟电池充电电流 充饱电流?
回复

使用道具 举报

7#
ID:1073197 发表于 2023-4-26 14:18 | 只看该作者
最近刚好想做一个数控电源,楼主资料给了我很大帮助
回复

使用道具 举报

8#
ID:27536 发表于 2023-4-28 17:00 | 只看该作者
这个不错,尤其学习一下串口程序
回复

使用道具 举报

9#
ID:1034262 发表于 2023-4-30 11:51 | 只看该作者
我用的MCP4822,双通道12位DAC,控制输出电压和限流设置。TM7705检测电压电流,4+4数码管同时显示电压和电流。
回复

使用道具 举报

10#
ID:72088 发表于 2023-5-1 09:05 | 只看该作者
MCP4725太贵了,用不起啊
回复

使用道具 举报

11#
ID:1075161 发表于 2023-5-3 21:16 | 只看该作者
你好,你这有没有MCP4725的中文资料
回复

使用道具 举报

12#
ID:489645 发表于 2023-6-12 16:39 | 只看该作者
感谢老师!很好的学习例子!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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