距离2013电子竞赛结束已经有多天了,,9月16号再重大进行完综合测评之后,,我们得知自己进入国赛了,心情别提有多激动了,感觉暑假这两个月的付出都是值得的。。今天,在这个举国欢度中秋之际,不能回家的我只好在实验室好好来总结一下这个项目。
我们这次做的是A题,也就是电源那道题。至于题目的要求,我相信大家在网上都可以百度得到。。我们设计的总体思路如下:
该系统主要由变压器和AC-DC变换电路组合而成,市电由变压器降压后经整流桥输出直流电压,DC-DC变换器则将电压稳定输出到36V,通过调整负载,得到功率因数表和万用表测试的相关参数,进行题目要求的验证。在整个系统中单片机可通过设定按键在TFT触摸屏上进行模式切换显示测试的实际值与理论值,并且在整个电路中装有过流保护电路,霍尔电流传感器实时检测最大电流,一旦处理器检测到电路中电流达到动作电流,立刻切除电源,达到了过流保护的效果。
变压器设计方案如下:
使用市场上买的自耦变压器和隔离变压器来使得交流电稳到20V-30V交流电压,除了能够稳定的输出交流电及起到安全隔离作用外,并且可以保证足够的功率使得在测量功率、效率和使电路更加稳定,达到测试的可行性和准确性。由于需要稳定输出直流电压36V,且电路中过流保护的动作电流为2.5A,所以整个电路所需要的最小功率为90W左右,因此需要自耦变压器的输出功率要大于等于90W,而市场上的自耦变压器变到交流24V时的功率只有50VA,因此隔离变压器采用220/24/36的BK-200型号的隔离变压器,这样自耦变压器在满足输出电压的前提下就能够输出所要求的功率。
我们DCDC开关电源设计方案如下:
采用高性能、低功耗的DC/DC开关升降压型稳压芯片LTC3789设计稳压控制器(电源),该器件运用了恒定频率、电流模式架构,故可提供一个高达600kHz 的可锁相频率,而且采用同步整流,使得效率高达98%,使得开关电源电路更加可行及科学。
因为我负责的是软件部分,,因此硬件电路图我就不献上了,,接下来就说说软件部分所做的工作。软件部分的工作简单说来就是四部分:1、利用霍尔传感器得到输出端的电流值。。 2、控制继电器在电流值大于2.5A的情况下断开一段时间。。 3、利用4*4矩阵按键修改功率因数。。 4、在STM32的TFT触摸屏上面显示电流、功率因数并且可以动态显示电流变化波形。总体流程图如下所示::
霍尔传感器用的是ACS712,,利用AD转换得到输出端的电流值。。代码如下
temp = (double)(ADValue[0]*(3.3/4096));
temp1 = (double)(ADValue[1]*(3.3/4096));
current = fabs(temp1-temp)*1000/185;
然后每转换十次得到一个平均值显示到TFT屏上面。。当输出电流达到2.5A时,置低IO口关断继电器,以此达到过流保护的功能。。延时十秒之后将继电器闭合。。代码如下:
if(current0 > 2.5)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);
delay_ms(10000);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}
接下来是如何操作矩阵按键,,原理大致如下:首先进行GPIO配置,将四个行线作为输出端,将四个列线作为输入端。然后逐行扫描看哪个按键被按下了。。具体代码如下所示:
int KeyVal=0; //keyVal为最后返回的键值。
GPIO_Write(GPIOA,(GPIOA->ODR & 0x00ff | 0x0f00)); //先让PA8到PA11全部输出高。
if((GPIOB->IDR & 0xf000)==0x0000 || flag == 1) //如果,PB12到PB15全为0,则,没有键按下。此时,返回值为-1.
return -1;
else
{
delay_ms(40); //延时100ms去抖动。
if((GPIOB->IDR & 0xf000)==0x0000) //如果,延时5ms PB12到PB15又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff | 0x0100)); //让PA8到PA11输出二进制的0001.
switch(GPIOB->IDR & 0xf000) //对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=1; break;
case 0x2000: KeyVal=2; break;
case 0x4000: KeyVal=3; break;
case 0x8000: KeyVal=10;
//flag0++;
//CLR_Screen(Black); //用背景色清屏
//if(flag0 == 4)
// flag0 = 0;
break; //'A'
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff | 0x0200)); //让PA3到PA0输出二进制的0010.
switch(GPIOB->IDR & 0xf000) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=4; break;
case 0x2000: KeyVal=5; break;
case 0x4000: KeyVal=6; break;
case 0x8000: KeyVal=11; break; //'B'
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff | 0x0400)); //让PA3到PA0输出二进制的0100.
switch(GPIOB->IDR & 0xf000) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=7; break;
case 0x2000: KeyVal=8; break;
case 0x4000: KeyVal=9; break;
case 0x8000: KeyVal=12; break; //'C'
}
GPIO_Write(GPIOA,(GPIOA->ODR & 0xf0ff | 0x0800)); //让PA3到PA0输出二进制的1000.
switch(GPIOB->IDR & 0xf000) //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=15; flag = 0; break; //'*重设键'
case 0x2000: KeyVal=0; break;
case 0x4000: KeyVal=14; flag = 1; break; //'#确认键'
case 0x8000: KeyVal=13; break; //'D'
}
return KeyVal;
最后是触摸屏的设置,这个可以参考光盘例程里面的函数。。然后利用取字模的工具取出字模即可在屏幕上输出汉字。。
好的,,今天就写到这里吧,希望几天之后的决赛给力一点。。加油,,Fighting!!!