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

本文详细描述了一个三端口DC-DC变换器的设计过程,包括硬件的系统拓扑、辅助供电、设计注意事项,以及软件的定时中断和多路ADC控制。着重介绍了光伏电池的最大功率追踪和双向DCDC控制策略。同时,文章讨论了硬件连接规范和软件编程技巧。
摘要由CSDN通过智能技术生成

目录

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;//初始化两个GPIO
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//初始化两个GPIO
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//初始化两个GPIO
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始化两个GPIO
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//初始化两个GPIO
	GPIO_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;//外设到DMA
	DMA_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站看到做智能车的选手们发的寄的视频,配乐忧伤,相当有感

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

小白一个,有错还请指正

资料,立创专业版画的四个大板和电压电流检测的板,显示和主控的stm32工程

链接:https://pan.baidu.com/s/1dR_kIL5WOwhwRmgNJgQxmw?pwd=z9tu 
提取码:z9tu

  • 23
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 67
    评论
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值