2021年电赛C题“三端口DC-DC变换器”丐版复刻

2023-10-12 02:40

本文主要是介绍2021年电赛C题“三端口DC-DC变换器”丐版复刻,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1题目

1.1任务

1.2要求与评分标准

2题目分析

3硬件设计

3.1系统拓扑

 3.2辅助供电

3.3设计注意事项

3.3直流电源DCDC

3.3电池双向DCDC

3.5电压电流检测

3.6主控

4软件设计

4.1定时中断

4.2多路ADC

5结果

 6今日闲话


1题目

“任务”和“要求与评分标准”并非完全照搬21年国赛要求,这是鼠辈的新能源课程实践的要求,在评分细节上和国赛可能略有差异(没细看过),诸位可以点击下方链接找到21年国赛原题

三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题_行走的皮卡丘的博客-CSDN博客

1.1任务

设计并制作三端口DC-DC 变换器,其结构框图如图1所示。变换器有两种工作模式:模式I,模拟光伏电池向负载供电的同时为电池组充电(IB>0);模式II,模拟光伏电池和电池组同时为负载供电(IB<0)。根据模拟光照(US的 大小)和负载情况,变换器可以工作在模式I或模式II,并可实现工作模式的自动转换,在各种情况下均应保证输出电压UO稳定在30V。

1.2要求与评分标准

(1)设计出符合要求的电路,并能够制作出相应的硬件电路,两个功率单元能够单独开环工作(10分)。电流和电压采样电路设计合理,能够正常工作(10分)。

(2)能够单独实现最大功率追踪(20分),能够单独实现储能单元的电流闭环控制,实现充电和放电(20分)。

(3)在US=50V、IO=1.2A 条件下,变换器工作在模式I,UO=30V±0.1V,IB≥0.1A。(5分)

(4)IO=1.2A、US 由45V 增加至55V ,电压调整率 SU ≤ 0.5%。(5分)

(5)US=50V、IO 由1.2A 减小至0.6A,负载调整率 SI ≤ 0.5%。(5分)

(6)US=50V、IO=1.2A 条件下,变换器效率 ≥90%。(5分)

(7)IO=1.2A、US由55V减小至25V,要求:变换器能够从模式I 自动转换到模式II;在US全范围实现最大功率点跟踪,偏差<0.1V,电压调整率 SU≤0.1%。(5分)

(8)报告。每组交一份报告,应包括系统的总体框图、电路原图图、程序流程图、测试结果、总结(要详细写出组内各成员的分工、心得体会等)(10分)

(9)考勤和平时表现。(5分)

(10)其他功能与更高指标的性能(10分)

2题目分析

光伏电池输入的电压在25-55V之间,根据负载和内阻的分压计算,因为题中要求最大功率追踪,就是直流稳压电源后面跟着的10Ω是用来模拟光伏电池的内阻的,要实现最大功率跟踪,或者说实现最大功率跟踪后的效果就是,系统的内阻应该与10Ω保持一致,因为最大功率传输定理。。。吧啦吧啦。。。

所以实际上输入系统的电压范围在12.5-27.5V之间,负载端输出电压要求稳定在30V,所以输入一直进行升压。模式2要求光伏电池与电池组共同为负载供电,电池的电压最大也不会超过17V,所以我们想要得到30V的电压就必须也要把电池的电压升上去,需要升压电路。题目要求电池组既要充电又要放电,故系统选用双向DC-DC进行控制。

在大功率输入时光伏给电池充电,给负载供电,在小功率输入时光伏和电池给负载供电。

重要结论:光伏DCDC一直处于升压状态

3硬件设计

3.1系统拓扑

整个系统的架构其实是最费脑筋的,就是这个东西做出来最后到底用几个板子,这几个板子的位置怎么摆放,每个板子的功能是什么,电路板的功能如何分配决定了最后电路板连线的复杂度,合理的功能划分一定可以减少外接的连线

这个所谓的架构包括一些细节在动手画板子前一定要明确下来

学长遗留下的拓扑(膜拜。。。) 

我最终确定用四个板子(<狗头>立创能piao的也就10×10大小)

手画的图中有每个板子之间弱电的接线关系,一路PWM控制MPPT,一路控制电池DCDC,PWM旁边的是relay,是继电器的意思,我在直流输入和电池的端口放了两个继电器用来保护

 3.2辅助供电

因为要采集电池端口的电压电流,也就是说要从第二个板子上接两根线到第三个板子上,所以16V就能引过去,16V引过去之后5V就也有了

16V:辅助供电模块(16V转5V)、MOS管驱动

5V:MOS管驱动、继电器、电压电流采样、运放、主控

16V转5V买的现成的2596的模块

3.3设计注意事项

先说采样为什么单独放在第三个板上,当时老师给的采样模块是可以单独插在板上的,类似于这样

然后我就也想做一个插接的小板子,刚好做成模块,2.54的双排弯针,以后还能直接插在洞洞板上。问题是立在电路板上的话就要考虑电感的干扰,不管BUCK还是BOOST里面都有大电感,我买的还是立式的那种不是卧式的,所以如果把电压电流采样以立起来的方式放到立式电感附近,我感觉此举极为不妥

所以最后干脆单独弄一个电压电流采样和辅助供电放一块的板子

系统中凡是要走大电流的引线统一采用

KF7.62-2P的端子、SV1.25-4的预绝缘冷压端子、16AWG的线

红线为正(或者进),黑线为负(或者出)

除了自己设计的ADC采样模块,还要给万用表留下六路ADC测量的接口,因为有三路电流,所以采样的接线方式也不能太随意,我用的

KF2EDGK-2P插拔式端子、4mm全护套香蕉头、16AWG的线

 还有一点,因为我们是搞课程设计,在验收阶段大家都要用,万用表挺紧张的,我担心验收的时候凑不到6个万用表,所以在设计的时候带上了钮子开关可以短路测电流的那个表,电流表是串进去的,必须要加开关才能短路,电压表并进去不接不影响正常工作

 

弱电的接口统一使用XH2.5的端子和排线(以前攒的不用了白瞎)

在两个功率单元的接口处都设置了船型开关方便单独调试

要考虑MOS管散热片的空间

大功率电阻用的是制动电阻,某宝上可以搜到,千万别贪便宜买功率小一点的,我但是调试上电一会就很烫了

!!!!!!!丝印很重要,丝印很重要,丝印很重要!!!!!!!!!

3.3直流电源DCDC

这是第一个板的图,接直流稳压电源的

直流电源进去先过一个继电器,然后是一个KF7.62的端子接200W10Ω的电阻,再后面两个端子一个电流表一个电压表,然后是自己设计的采样,再后面就是BOOST

3.3电池双向DCDC

接电池和负载的第二个板

鼠辈我第一次看这个双向DCDC也有点懵,就是不理解为什么改占空比能改变功率的流动方向

这个双向DCDC我看学长是用BUCK电路实现的,BUCK的反拓扑就是BOOST,在这个题里面,从电池的角度往系统里看是BOOST,其实很好想

假如电池电压15V,题中要求负载两端电压30V,先不说实际情况,如果一个BOOST的输入15V,占空比0.4,根据理论计算,升压结果是15/(1-0.4)=25V,如果此时BOOST的输出接着一个30V的电压,那么功率一定是从输出流向输入的,同理,如果BOOST的占空比0.6,理论升压结果15/(1-0.6)=37.5V,输出还是30V的话,那功率一定是从输入流向输出的

所以这里的双向DCDC就很好弄了,写代码的时候从电池往里看,闭环负载端的电压30V,电压低了加占空比,电压高了减占空比,间接完成了模式一二的切换

3.5电压电流检测

电流检测用的CC6900,后面用运放同向比例放大然后一个电压跟随器,电压检测用的电位器分压然后运放同向比例放大然后一个电压跟随器,第一次(以前都自己找个小角落贴)用立创的贴片有点肉疼

当时害怕运放的线性区不够所以用了双电源正负5V供电{狗头}

直接5片全贴(话说不用动风枪是真的爽啊)

3.6主控

主控用了两个C8T6,一个跑主控,一个跑保护和显示,两个之间不通信

还加了一个矩阵键盘,可以手动调整占空比

需要注意的是两路PWM从主控出来后最好过一个隔离再送到MOS管驱动,光耦或者数字隔离器啥的都行,C8T6烧了还能接受要是DSP那。。。。最好加上

最好留个串口出来方便调试

4软件设计

流程图

比较粗暴大Lao勿喷 

4.1定时中断

这里要说一句

问:进入定时器中断后,定时器是继续计数吗还是等中断执行完才开始下一轮的计数?

答:定时器计数到你设置的溢出值后,会产生中断,并开始下一轮计数,并不是等中断执行完

害怕中断时间太长导致这个中断没执行完下一个已经来了所以进入中断后先把定时器关了最后再打开重新赋值

//TIM3中断
void TIM3_IRQHandler(void){float *p;float adc_value[6];u8 i;if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){TIM_Cmd(TIM3, DISABLE);  //使能TIMx外设p = get_adc_value();//获取第一次ADC值for(i=0;i<=5;i++){adc_value[i] = p[i];}delay_us(1000);p = get_adc_value();//获取第二次ADC值并求平均值for(i=0;i<=5;i++){adc_value[i] = (adc_value[i] + p[i])/2;}//更新成员参数battery.present_voltage = adc_value[0];battery.present_current = adc_value[1];
//		printf("电池电流%f\r\n",battery.present_current);
//		printf("电池电压%f\r\n",battery.present_voltage);load.present_voltage = adc_value[2];load.present_current = adc_value[3];solar_input.present_voltage = adc_value[4];solar_input.present_current = adc_value[5];
//		printf("电池电压%f\r\n",solar_input.present_voltage);
//		printf("电池电流%f\r\n",solar_input.present_current);
//		printf("\r\n");//更新占空比mppt_clc();battery_clc();mppt_result_execute();battery_result_execute();TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源 TIM_SetCounter(TIM3,0);}
}

4.2多路ADC

stm32多路ADC就要开DMA了,这里面需要六路ADC,但是DMA采到的ADC不好取平均值所以实际上我还是单路转换转换了六路

这是之前尝试成功的六路ADC带DMA初始化代码

u16 adc_original_data[6] = {0,0,0,0,0,0};
//要找一个数组存放DMA的数据void  adc_init(void){GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitInstructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );	//使能 ADC1通道时钟//PA1 作为模拟通道输入引脚                         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//初始化两个GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//初始化两个GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//初始化两个GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始化两个GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//初始化两个GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_DeInit(DMA1_Channel1);//复位DMA_InitInstructure.DMA_PeripheralBaseAddr =(u32)(&(ADC1->DR));//配置外设的基址,取adc 数据寄存器的地址DMA_InitInstructure.DMA_MemoryBaseAddr = (u32)adc_original_data;//把DMA的数据存入数组DMA_InitInstructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设到DMADMA_InitInstructure.DMA_BufferSize = 6;//2个通道DMA_InitInstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//DMA_InitInstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitInstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitInstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitInstructure.DMA_Mode = DMA_Mode_Circular;//不断地传输,有数据就传输DMA_InitInstructure.DMA_Priority = DMA_Priority_High;//DMA优先级DMA_InitInstructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1,&DMA_InitInstructure);DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA请求ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;	//模数转换工作在多通道模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;	//模数转换工作在连续转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是 外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄 存器   RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_1,1, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道1,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2,2, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道2,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2,3, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道2,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2,4, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道2,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2,5, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道2,采样时间为239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2,6, ADC_SampleTime_239Cycles5 );	 //ADC1,ADC1通道2,采样时间为239.5周期ADC_DMACmd(ADC1,ENABLE);	ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);	//使能复位校准  while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束ADC_StartCalibration(ADC1);	 //开启AD校准while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	//while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束}

5结果

四个板子拧的M3的螺丝和铜柱,固定在下面的亚克力板上

 

三个立起来的采样模块(丝印画反了。。。难绷)

 主控板,显示六路电压电流

 测试图(挑了一张精度还行的,这个30V还行)

 

菜鸡最后的感受

32ADC的精度不是很理想,做了各种补偿,MPPT环在电压上升后有点闭不住的感觉

弱电的接口统一使用的排线,杜邦线临时用用还行,要调试这种系统弱电的控制线如果全部用杜邦线出问题很难查,用排线我从来没考虑过接触不良断线之类的问题,而且还能过一定的电流

标准化接线的规格,端子

保护自己想想设计一下,这种过电流的系统如果不设保护等闻到味了再断电我估计

 6今日闲话

最近几天上B站看到做智能车的选手们发的寄的视频,配乐忧伤,相当有感

鼠辈今年大三,也寄了几个准备了很久的比赛,也属于是几十分钟决定了几个月的努力,对于热爱竞赛的来讲有时候结果很现实,然后现在大三的选手们,明年就该走了,没什么机会了,很多事情没法讲

小白一个,有错还请指正

这篇关于2021年电赛C题“三端口DC-DC变换器”丐版复刻的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192647

相关文章

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

Keysight U8031A DC power supply

Keysight U8031A DC power supply 文章目录 Keysight U8031A DC power supply前言电容充电⽰意图一、恒定电压操作二、恒定电流操作三、5v操作四、跟踪模式操作五、存储器操作六、对过电压保护编程七、对过电流保护编程八、锁键操作 前言 U8031A Power Supply 是一款具备前面板编程能力的三路输出电源。通过使

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

docker 重启容器且修改服务映射端口

要重启 Docker 容器并修改服务的映射端口,可以按照以下步骤进行操作: 1. 停止当前运行的容器 如果你想重新配置端口,通常需要先停止当前运行的容器。你可以使用以下命令停止容器: docker stop <container_name_or_id> 2. 删除现有容器 为了修改端口映射,你需要删除旧的容器并重新创建一个新的容器。首先运行以下命令删除停止的容器: docker rm

tomcat 开放远程调试端口

1、开启远程调试端口 WIN系统,在catalina.bat里:   SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8899     Linux系统,在catalina.sh里

使用TLS解决Docker API暴露2375端口的问题

问题起因 由于本人开发环境是在 Windows,开发完成后需要使用 Dockerfile 打包镜像,这个过程需要有一个 Docker 服务完成,Windows 安装 Docker 会影响到很多环境,我又不想本地开虚拟机使用 Docker,于是我就索性使用服务器上的 Docker,并放开了 2375 端口,这个是 Docker 默认 API 的端口,于是就可以很愉快的打包发布了。 但是没过几天,

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间,但是后面还可以加上类型: [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type  ·  absolute    Absolute time 绝对老化  ·  inactivity  Inactivity time相对老化 默认