查看: 5000|回复: 5

基于GD32F2的光伏升压MPPT控制器

[复制链接]
  • TA的每日心情
    开心
    2020-1-23 13:44
  • 签到天数: 243 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-1-25 20:29:21 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 Paderboy 于 2016-1-25 20:34 编辑

    一、方案名称:  

    基于GD32F207ZE的光伏升压MPPT控制器

    二、方案介绍
    此方案是采用GD32F207ZE作为主控制器的太阳能光伏充电控制器,可对以下主要的类型电池组实现充电管理:(铅酸电池组,普通锂电池组,铁锂电池组….等等)并且使用LCD显示光伏板电压,电池组电压和控制器温度(因为年末时间比较少,就简化了控制器的附加高级功能。(例如:可以再添加电流传感器,实现功率可控-发电电量累计和手机APP查看和设置参数。以及通过wifi实时上传物联网平台。。))有喜欢的利用本方案自己再添加高级功能。。。本控制器使用串口输入设置参数,为了后期可以使用蓝牙模块配合APP预留的功能,本控制器具有电池过压保护,控制器过温保护功能,夜间防逆流功能,
    具有最大化利用光伏发电板,使其输出最大功率状态给电池组充电,实现绿色能源最大使用效益。。

    三、方案结构框图:
    流程图1.png

    四、设计应用描述及心得总结:
    1.    使用的GD32F207资源配置:配置DMAIDLE方式接收串口数据,配置5个DMAADC通道获取数据,配置TIMER2 2个通道PWM输出控制,配置SPI1显示数据,配置内部FLASH作为设置参数的掉电存储

           GD32F207ze_07.png

    2.    使用SPI1驱动LCD引脚配置:PA5-SCL,PA7-SI,PA4-RES,PD0-RSX,PD1-CSX

    GD32F207ze_02.png
       

    3.    控制器供电使用了LM2596HVS降压12v给MOS驱动IR2110s供电以及(通过5v降压和3.3vLDO降压)提供单片机的供电。。最高支持60vDC输入(也可以使用XL7015替换,支持最高80VDC输入)

       GD32F207ze_04.png

          GD32F207ze_05.png
       
          GD32F207ze_03.png

          GD32F207ze_06.png


    4.    不得不说,第一次使用GD32F系列的单片机,对GD32的库(使用非常方便,提供的历程也很多。有时间还是要继续再深入的学习)和STM32库的兼容性非常不错。可以节省很多的时间再去重新学习GD32的库使用函数了,再次感谢爱板网的活动和GD的开发板。。。
          

    五、作品实物图+视频:   

           串口调试截图:
           GD32F207ze_01.png

           IMG_20160125_120053.jpg
          
           IMG_20160125_120135.jpg

           IMG_20160125_120153.jpg

           IMG_20160125_124144.jpg
           这个是小功率光伏板:
           IMG20160125125024.jpg
           这个板子的功率非常小。。。电流只有180ma最大了。。。。。
           IMG_20160125_124125.jpg
           移到楼下:换50w的光伏板
           IMG_20160125_134025.jpg
           测试输入电压空载21v,输出23v电流:1.8a =41.4w的功率。。今天天气特别的好
           IMG_20160125_133959.jpg
       

          视频里测试过程按了重启,为了方便观察mppt最大功率点的快速定位。。。

          
    六、方案代码

    ADC DMA 配置:PC0 PC2 PC3 内部温度传感器和内部Vrefint
    1. void ADC_Configuration(void)
    2. {
    3.     ADC_InitPara ADC_InitStructure;
    4.          
    5.     ADC_InitStructure.ADC_Mode_Scan = ENABLE;
    6.     ADC_InitStructure.ADC_Mode_Continuous = ENABLE;
    7.     ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    8.     ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    9.     ADC_InitStructure.ADC_Channel_Number = 5;
    10.     ADC_Init(ADC1,&ADC_InitStructure);
    11.     /* Configure ADC1 regular channel13 */
    12.     ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_10, 1, ADC_SAMPLETIME_55POINT5);
    13.                 ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_12, 2, ADC_SAMPLETIME_55POINT5);
    14.     ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_13, 3, ADC_SAMPLETIME_239POINT5);
    15.     ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_16, 4, ADC_SAMPLETIME_239POINT5);
    16.     ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_17, 5, ADC_SAMPLETIME_239POINT5);
    17.     ADC_TempSensorVrefint_Enable(ENABLE);

    18.     /* Enable ADC1 DMA */
    19.     ADC_DMA_Enable(ADC1,ENABLE);
    20.     /* Enable ADC1 */
    21.     ADC_Enable(ADC1,ENABLE);
    22.     ADC_Calibration(ADC1);
    23.     /* Start ADC1 Software Conversion */
    24.     ADC_SoftwareStartConv_Enable(ADC1,ENABLE);
    25. }
    复制代码
    SPI 配置: PA4 PA5 PA6 PA7 D0 D1 驱动ST7858 LCD
    1. void SPI1_Configuration(void)
    2. {
    3.     SPI_InitPara  SPI_InitStructure;
    4.     SPI_InitStructure.SPI_TransType = SPI_TRANSTYPE_FULLDUPLEX;
    5.     SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
    6.     SPI_InitStructure.SPI_FrameFormat = SPI_FRAMEFORMAT_8BIT;
    7.     SPI_InitStructure.SPI_SCKPL = SPI_SCKPL_HIGH;
    8.     SPI_InitStructure.SPI_SCKPH = SPI_SCKPH_2EDGE;
    9.     SPI_InitStructure.SPI_SWNSSEN = SPI_SWNSS_SOFT;
    10.     SPI_InitStructure.SPI_PSC = SPI_PSC_4;
    11.     SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
    12.     SPI_InitStructure.SPI_CRCPOL = 10;

    13.     SPI_Init(SPI1, &SPI_InitStructure);
    14.     SPI_Enable(SPI1, ENABLE);
    15.                 SPIx_ReadWriteByte(0xff);

    16. }
    复制代码
    TIMER2 PWM输出配置:配置PA1 PA2
    1. void TIM_Configuration(void)
    2. {
    3.     /* -----------------------------------------------------------------------
    4.     TIMER2 Configuration: generate 2 PWM signals with 2 different duty cycles:
    5.     TIMER2CLK = SystemCoreClock / 8 = 9MHz
    6.     TIMER2 frequency = 180/9M = 0.02ms

    7.     ----------------------------------------------------------------------- */
    8.     TIMER_BaseInitPara TIMER_TimeBaseStructure;
    9.     TIMER_OCInitPara   TIMER_OCInitStructure;

    10.     /* TIMER2 clock enable */
    11.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2,ENABLE);

    12.     /* TIMER2  configuration */
    13.     TIMER_DeInit(TIMER2);
    14.     TIMER_TimeBaseStructure.TIMER_Prescaler     = 8-1;
    15.     TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
    16.     TIMER_TimeBaseStructure.TIMER_Period        = 180-1;
    17.     TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    18.     TIMER_BaseInit(TIMER2,&TIMER_TimeBaseStructure);

    19.     /* CH2,CH3 and CH4 Configuration in PWM mode */
    20.     TIMER_OCInitStructure.TIMER_OCMode      = TIMER_OC_MODE_PWM1;
    21.     TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
    22.     TIMER_OCInitStructure.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;
    23.     TIMER_OCInitStructure.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_RESET;

    24.     TIMER_OCInitStructure.TIMER_Pulse = 0;
    25.     TIMER_OC2_Init(TIMER2, &TIMER_OCInitStructure);
    26.     TIMER_OC2_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

    27.     TIMER_OCInitStructure.TIMER_Pulse = 0;
    28.     TIMER_OC3_Init(TIMER2, &TIMER_OCInitStructure);
    29.     TIMER_OC3_Preload(TIMER2,TIMER_OC_PRELOAD_DISABLE);

    30.     /* Auto-reload preload enable */
    31.     TIMER_CARLPreloadConfig(TIMER2,ENABLE);
    32.     /* TIMER enable counter*/
    33.     TIMER_Enable( TIMER2, ENABLE );
    34. }
    复制代码
    FMC 存储数据函数:
    1. void FMC_savedate(void)
    2. {
    3.           uint8_t p=0,n=0,flashflag[3]={0};
    4.     if(flashdate==1)
    5.                 {
    6.                 if(ReadData[0]>=PVMIN&&ReadData[0]<=PVMAX){backupData[0]=ReadData[0];flashflag[0]=1;}else{/*printf("PV SETTING ERROR\n\r");*/}
    7.                 if(ReadData[1]>=BATMIN&&ReadData[1]<=BATMAX){backupData[1]=ReadData[1];flashflag[1]=1;}else{/*printf("BAT SETTING ERROR\n\r");*/}
    8.                 if(ReadData[2]>=FANMIN&&ReadData[2]<=FANMAX){backupData[2]=ReadData[2];flashflag[2]=1;}else{/*printf("FAN TEMP SETTING ERROR\n\r");*/}        
    9.     for(p=0;p<Savenumber;p++){ReadData[p]=0;}                        
    10.                 if(flashflag[0]==1&&flashflag[1]==1&&flashflag[2]==1)
    11.                 {        
    12.     FMC_Unlock();
    13.    
    14.     /* Define the number of page to be erased */
    15.     NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FMC_PAGE_SIZE;
    16.    
    17.     /* Clear All pending flags */
    18.     FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );
    19.    
    20.     /* Erase the FLASH pages */
    21.     for(EraseCounter = 0; EraseCounter < NbrOfPage; EraseCounter++)
    22.     {
    23.         FMCStatus = FMC_ErasePage(BANK1_WRITE_START_ADDR + (FMC_PAGE_SIZE * EraseCounter));
    24.         FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );
    25.     }  
    26.     FMC_Lock();
    27.                
    28.     /* Unlock the Flash Bank1 Program Erase controller */
    29.     FMC_Unlock();
    30.    
    31.     /* Define the number of page to be erased */
    32.     NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FMC_PAGE_SIZE;
    33.    
    34.     /* Clear All pending flags */
    35.     FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );   
    36.         
    37.     /* Program Flash Bank1 */
    38.                 Address = BANK1_WRITE_START_ADDR;
    39.                 for(save=0;save<Savenumber;save++)
    40.                 {        
    41.     FMCStatus = FMC_ProgramWord(Address, backupData[save]);
    42.                 FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );
    43.                 Address+=4;
    44.                 }
    45.     FMC_Lock();

    46.                 for(n=0;n<3;n++){flashflag[n]=0;}
    47.                 reset=1;
    48.          }
    49.                 flashdate=0;
    50.          
    51.         }

    52. }
    复制代码
    串口DMA+IDLE中断接收数据
    1. void USART1_IRQHandler(void)
    2. {
    3.           uint32_t tmp_flag = 0;
    4.           uint32_t temp;
    5.           tmp_flag=USART_GetIntBitState(USART1, USART_INT_IDLEF);
    6.     if(tmp_flag!= RESET)
    7.     {
    8.                 DMA_Enable(DMA1_CHANNEL5, DISABLE);
    9.                                         temp = USART1->STR;
    10.           temp = USART1->DR;
    11.                                         temp= DMA_GetCurrDataCounter(DMA1_CHANNEL5);;
    12.                                         Length=BufferSize-temp;
    13.                             flag=1;
    14.                                         DMA1_CHANNEL5->RCNT=BufferSize;
    15.                             DMA_Enable(DMA1_CHANNEL5,ENABLE);
    16.                          }  
    17.     __nop();  
    18. }
    复制代码
    GD32F207ZE_BOOST_MPPT.rar (17.69 KB, 下载次数: 73)

    评分

    参与人数 1声望 +3 与非币 +100 收起 理由
    小菜儿 + 3 + 100 很给力!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-7-19 10:35
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-1-25 20:55:29 | 显示全部楼层
    32个赞,太好了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-23 13:44
  • 签到天数: 243 天

    连续签到: 1 天

    [LV.8]以坛为家I

     楼主| 发表于 2016-1-25 21:01:38 | 显示全部楼层
    netlhx 发表于 2016-1-25 20:55
    32个赞,太好了!

    多谢N神的鼓励啊。。。。。一定继续努力学习。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-1-25 21:38:01 | 显示全部楼层
    唉,不置可否
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-1-26 08:20:11 | 显示全部楼层
    不错不错!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-1-26 08:54:38 | 显示全部楼层
    亲,可以将内容一并发到经验频道,这是一个很好的系列,很有机会获得每月之星的呢http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 04:19 , Processed in 0.155583 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.