2013全国电子设计竞赛进入国赛的项目总结

       距离2013电子竞赛结束已经有多天了,,9月16号再重大进行完综合测评之后,,我们得知自己进入国赛了,心情别提有多激动了,感觉暑假这两个月的付出都是值得的。。今天,在这个举国欢度中秋之际,不能回家的我只好在实验室好好来总结一下这个项目。

    我们这次做的是A题,也就是电源那道题。至于题目的要求,我相信大家在网上都可以百度得到。。我们设计的总体思路如下:

        

        该系统主要由变压器和ACDC变换电路组合而成,市电由变压器降压后经整流桥输出直流电压,DCDC变换器则将电压稳定输出到36V,通过调整负载,得到功率因数表和万用表测试的相关参数,进行题目要求的验证。在整个系统中单片机可通过设定按键在TFT触摸屏上进行模式切换显示测试的实际值与理论值,并且在整个电路中装有过流保护电路,霍尔电流传感器实时检测最大电流,一旦处理器检测到电路中电流达到动作电流,立刻切除电源,达到了过流保护的效果。

        变压器设计方案如下:

        使用市场上买的自耦变压器和隔离变压器来使得交流电稳到20V-30V交流电压,除了能够稳定的输出交流电及起到安全隔离作用外,并且可以保证足够的功率使得在测量功率、效率和使电路更加稳定,达到测试的可行性和准确性。由于需要稳定输出直流电压36V,且电路中过流保护的动作电流为2.5A,所以整个电路所需要的最小功率为90W左右,因此需要自耦变压器的输出功率要大于等于90W,而市场上的自耦变压器变到交流24V时的功率只有50VA,因此隔离变压器采用220/24/36BK-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!!!

 

 

 

原文地址:https://www.cnblogs.com/pangblog/p/3331164.html