简易直流负载
date: 2021-02-05 11:45:50
简介
两轮校电赛已经结束,记录一下我的两件作品,一个直流负载,一个交流恒流源。
直流负载
题目要求
负载R2可以工作在CC、CR、CP模式下。

本题最关键最主要的关系式:I=Vi/R2。即Vi=VR2。
实现思路
电源类题目的灵魂在于AD和DA的合理转换,至少我理解的在这道题目中是这样的。
模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,这一切都是通过A/D转换器(ADC)来实现的,ADC即(Analogue-to-Digital Conversion)它是把连续的模拟信号转变为离散的数字信号的器件;数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件,D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。
题中需要灵活应用采样电阻两端电压值Vi,用DAC压控MOS管实现所需功能。
放设计报告里的流程图什么的太麻烦了,直接放上主函数的代码吧,懂的都懂。
int main(void)
{
u16 adcx;
float temp; //U
int xiaoshu; //用来显示电压小数部分
int i=0;
int r=0;
int p=0;
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
BEEP_Init(); //BEEP初始化
Adc_Init(); //ADC初始化
Dac1_Init(); //DAC初始化
BEEP=0; //关闭蜂鸣器
LED0=0; //先点亮LED1
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowCHinese(0,0,0);//中
OLED_ShowCHinese(18,0,1);//景
OLED_ShowCHinese(36,0,2);//园
OLED_ShowCHinese(54,0,3);//电
OLED_ShowCHinese(72,0,4);//子
OLED_ShowCHinese(90,0,5);//科
OLED_ShowCHinese(108,0,6);//技
OLED_ShowChar(0,2,'>');
OLED_ShowChar(0,4,'>');
OLED_ShowChar(0,6,'>');
OLED_ShowChar(18,2,'C');
OLED_ShowChar(30,2,'C');
OLED_ShowChar(18,4,'C');
OLED_ShowChar(30,4,'R');
OLED_ShowChar(18,6,'C');
OLED_ShowChar(30,6,'P');
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);//读取当前ADC的值
temp=(float)adcx*(3.3/4096)*11.027;//转换为电压值
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case KEY0_PRES: //CC
{
OLED_Clear();
OLED_ShowCHinese(0,0,0);//中
OLED_ShowCHinese(18,0,1);//景
OLED_ShowCHinese(36,0,2);//园
OLED_ShowCHinese(54,0,3);//电
OLED_ShowCHinese(72,0,4);//子
OLED_ShowCHinese(90,0,5);//科
OLED_ShowCHinese(108,0,6);//技
OLED_ShowChar(18,2,'U');
OLED_ShowChar(18,4,'I');
OLED_ShowChar(18,6,'i');
OLED_ShowChar(36,2,'=');//=
OLED_ShowChar(36,4,'=');//=
OLED_ShowChar(36,6,'=');//=
OLED_ShowChar(0,2,'>');
OLED_ShowChar(0,4,'>');
OLED_ShowChar(0,6,'>');
OLED_ShowChar(112,2,'V');
OLED_ShowNum(54,4,i,4,17);
OLED_ShowChar(102,4,'m');
OLED_ShowChar(112,4,'A');
OLED_ShowNum(54,6,i,4,17);
OLED_ShowChar(102,6,'m');
OLED_ShowChar(112,6,'A');
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);//读取当前ADC的值
temp=(float)adcx*(3.3/4096)*11.027;//转换为电压值
OLED_ShowNum(54,2,temp,2,16);//显示整数部分
OLED_ShowChar(70,2,'.');
xiaoshu=temp*1000;
xiaoshu=xiaoshu%1000;
OLED_ShowNum(72,2,xiaoshu,4,16);//显示小数部分
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case KEY0_PRES: //上调
{
//OLED显示电流i
i=i+100;
LED0=!LED0;
OLED_ShowNum(54,6,i,4,17);
}
break;
case KEY1_PRES: //下调
{
//OLED显示电流i
i=i-100;
LED0=!LED0;
OLED_ShowNum(54,6,i,4,17);
}
break;
case KEY2_PRES: //确定键
{
LED0=!LED0;
OLED_ShowNum(54,4,i,4,17); //将屏幕上的"I"数值替换为"i"
DAC_SetChannel1Data(DAC_Align_12b_R, 3.175*i*0.001*(4096/3.3));//改变DAC输出
}
break;
}
}
//过压保护语句
adcx=Get_Adc_Average(ADC_Channel_1,10);//读取当前ADC的值
temp=(float)adcx*(3.3/4096)*11.027;//转换为电压值
if(temp>=19.5 && temp<=20.5)
{
BEEP=1;
}
else
{
BEEP=0;
}
}
}
}
}
}
}
遇到的坑
STM32F103C8T6为小容量芯片,并不集成DAC功能,而大容量的STM32F103ZET6具有两路DA输出,这也就导致了中途不得不去更换芯片,再加上电源题目电压很可能接错,其中一块ZET6就是因为接错电压而夭折。所以在做东西之前一定先做好芯片选型的工作,尤其是电源类题目每一次接入的电压更应该细心检查。
缺陷
针对每一个功能,通过按键只能进入对应的死循环,无法再度切换负载的功能。
改进
待续……
实物图

交流恒流源
实现思路
本题所要实现的功能其实是控制负载以恒定的电流消耗电能,并且保证输出信号基本没有失真,再通过带通滤波器滤波,最终在液晶屏上显示信号幅频特性,一共四级系统。
理论分析与计算

电路设计
参考电路

仿真电路

遇到的坑
电路仿真的时候一模一样的电路,最后示波器上出不来波形,无语。
缺陷
该电路未加三极管放大,电流驱动能力最大为15mA,未满足题目中要求的20mA。
由于对幅频特性曲线理解有误,最后通过带通滤波器出来的信号未做出幅频特性曲线。
改进
待续……
实物图


浙公网安备 33010602011771号