找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4079|回复: 2
收起左侧

GD32F350单片机智能植物生长LED光照控制系统设计源码与资料

[复制链接]
ID:406390 发表于 2018-10-13 13:19 | 显示全部楼层 |阅读模式
作品简介:光照是植物光合作用、生长发育不可缺少的重要环境因素,但光照受天气、季节影响很大,而研究表明人工光源可以作为植物光合作用的光源来使用,能为植物提供不间断的光照,不受天气影响。但传统人工光照光源通常采用荧光灯、高压钠灯和金属卤素灯等,但这些光源寿命短、效率低,其电气特性决定了这些光源的光强难以调节、调光效果差,应用度不高。LED光源体积小、重量轻、寿命长、发光效率高、波长类型丰富、高安全可靠和无环境污染。不同波长的LED组合可以很好的与植物光合作用需要的光谱相匹配,促进了植物生长,减短了植物开花结果的时间,提高了产量,使用LED植物生长光源更加具有环保节能的作用。    为了高效的利用LED光源体对植物生长的促进作用,植物生长LED光照系统的设计开发可以很好实现这个目标。采用兆易创新GigaDevice公司基于ARM®Cortex™-M4处理器的32位微控制器GD32F350为控制核心的GD32 Colibri-F350RB 开发板为系统的主控制器,在此基础上编制完全原创的控制程序。利用PID自动控制技术编制相关算法,在GD32F350的程序中编写使用PID算法程序为核心的控制程序,采用PWM方式进行光照调节,利用上位机监控软件、传感器、GD32 Colibri-F350RB 开发板为系统的主控制器和LED驱动器等组成的植物生长LED光照控制系统,可以实现对植物光照环境进行实时监控和自动智能调节,极大提高了生产效率,解决了温室植物对光照环境的需求。
整个系统的硬件主要组成有GD32 Colibri-F350RB 开发板为系统的主控制器、XY-30光照传感器、LED驱动控制器、特殊波长的 LED光源、12V电源等。

制作出来的实物图如下::

系统上位机检测控制软件,利用RS232串口与主控制器通信,可以实时控制主控制器和接收主控制器发送来的数据 ...

系统上位机检测控制软件,利用RS232串口与主控制器通信,可以实时控制主控制器和接收主控制器发送来的数据  ...

系统上位机检测控制软件,利用RS232串口与主控制器通信,可以实时控制主控制器和接收主控制器发送来的数据

系统框图

系统框图

系统框图

光照波长配比调节1

光照波长配比调节1

光照波长配比调节1

演示系统在扰动下光照度控制过程记录1

演示系统在扰动下光照度控制过程记录1


演示系统在扰动下光照度控制过程记录1

光照波长配比调节3

光照波长配比调节3

光照波长配比调节3


单片机程序源码如下:
  1. #include "350dx_led.h"
  2. #include "350dx_uart.h"
  3. #include "350dx_key.h"
  4. #include "350dx_iic.h"
  5. #include "350dx_pid.h"

  6. #include "systick.h"
  7. #include "main.h"
  8. #include <stdio.h>
  9. #include "gd32f3x0_rcu.h"
  10. //#include "gd32f3x0.h"
  11. //#include "gd32f3x0_it.h"
  12. #define ARRAYNUM(arr_nanme)      (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
  13. #define TRANSMIT_SIZE   (ARRAYNUM(transmitter_buffer) - 1)

  14. uint8_t transmitter_buffer[] = "\n\rUSART interrupt test\n\r";
  15. uint8_t receiver_buffer[32];
  16. uint8_t transfersize = TRANSMIT_SIZE;
  17. uint8_t receivesize = 32;
  18. __IO uint8_t txcount = 0;
  19. __IO uint16_t rxcount = 0;

  20. uint8_t receive_data[10];
  21. uint8_t transmit_data[7];
  22. uint8_t receive_flag;
  23. uint32_t pwm_pulse_red,pwm_pulse_green,pwm_pulse_blue;
  24. uint32_t pwm_pulse_ratio;//上位机发送的PWM占空比系数X62=TIMER1值

  25. unsigned char  SensorCDS_Data[5];

  26. uint8_t key_s,key_v = 0x01;            
  27. uint8_t key_ctrol_pid = 0x00;

  28. extern uint32_t LUX_temp;
  29. extern PID_value ASR;        
  30. extern float set_distance ;  

  31. extern float PIData_Rece;

  32. void led_spark(void)
  33. {        //呼吸灯
  34.     static __IO uint32_t timingdelaylocal = 0U;

  35.     if(timingdelaylocal){

  36.         if(timingdelaylocal < 500U){
  37.                 EvbLedControl(LED1, LED_ON);
  38.        // EvbLedControl(LED2, LED_ON);
  39.        // EvbLedControl(LED3, LED_ON);
  40.         }else{
  41.                     EvbLedControl(LED1, LED_OFF);
  42.         //EvbLedControl(LED2, LED_OFF);
  43.         //EvbLedControl(LED3, LED_OFF);
  44.         }

  45.         timingdelaylocal--;
  46.     }else{
  47.         timingdelaylocal = 1000U;
  48.     }
  49. }    // */
  50. void proc_key(unsigned char key_v)  
  51. {
  52. //        unsigned int count;
  53.         if((key_v & 0x01) == 0)
  54.         {
  55.                                 //for (count =0;  count<0xffffff; count++);   //延时
  56.                         pwm_pulse_red =pwm_pulse_red+1000;//PWM占空比
  57.                         timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,pwm_pulse_red);//设置PWM占空比
  58.                         key_ctrol_pid =! key_ctrol_pid;
  59.                         
  60.                         Init_BH1750();               
  61.                 transmit_data[0]=0xEE;
  62.                 transmit_data[1]=0x85;
  63.                 transmit_data[2]=SensorCDS_Data[0];
  64.                 transmit_data[3]=SensorCDS_Data[1];
  65.                 transmit_data[4]=100;
  66.                 transmit_data[5]=100;
  67.                 transmit_data[6]=0xBA;//数据帧尾码186
  68.                         UartSendData(transmit_data,7);
  69.                                 
  70.                 //DIP_Main();
  71.         }
  72. }

  73. void timer_config(void)
  74. {
  75.     /* -----------------------------------------------------------------------
  76.     TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:
  77.     TIMER1CLK is 1MHz
  78.         - TIMER1_CH1  pin (PB3)
  79.     - TIMER1_CH2  pin (PB10)
  80.     - TIMER1_CH3  pin (PB11)

  81.     TIMER1 channel1 duty cycle = (4000/ 16000)* 100  = 25%
  82.     TIMER1 channel2 duty cycle = (8000/ 16000)* 100  = 50%
  83.     TIMER1 channel3 duty cycle = (12000/ 16000)* 100 = 75%
  84.     ----------------------------------------------------------------------- */
  85.     timer_oc_parameter_struct timer_ocintpara;
  86.     timer_parameter_struct timer_initpara;

  87.     rcu_periph_clock_enable(RCU_TIMER1);

  88.     timer_deinit(TIMER1);

  89.     /* TIMER1 configuration */
  90. #ifdef GD32F330
  91.     timer_initpara.prescaler         = 83;
  92. #endif /* GD32F330 */
  93. #ifdef GD32F350
  94.     timer_initpara.prescaler         = 107;
  95. #endif /* GD32F350 */
  96.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  97.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  98.     timer_initpara.period            = 15999; //装载值 1000k/15999=62hz
  99.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  100.     timer_initpara.repetitioncounter = 0;
  101.     timer_init(TIMER1,&timer_initpara);

  102.     /* CH1,CH2 and CH3 configuration in PWM mode0 */
  103.     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
  104.     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;

  105.     timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);
  106.     timer_channel_output_config(TIMER1,TIMER_CH_2,&timer_ocintpara);
  107.     timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocintpara);

  108.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,3999);
  109.     timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
  110.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

  111.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,1999);//7999  50%
  112.     timer_channel_output_mode_config(TIMER1,TIMER_CH_2,TIMER_OC_MODE_PWM0);
  113.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);

  114.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,11999);
  115.     timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0);
  116.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);

  117.     /* auto-reload preload enable */
  118.     timer_auto_reload_shadow_enable(TIMER1);
  119.     /* auto-reload preload enable */
  120.     timer_enable(TIMER1);
  121. }

  122. int main(void)
  123. {
  124.     int i;

  125.         transmit_data[0]=0xEE;
  126.         transmit_data[1]=0x99;
  127.         transmit_data[2]=100;
  128.         transmit_data[3]=100;
  129.         transmit_data[4]=101;
  130.         transmit_data[5]=150;
  131.         transmit_data[6]=0xBA;//数据帧尾码186
  132. //        nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
  133.         /* 配置configure systick */
  134.     systick_config();
  135. //    EvbLedConfig();  //
  136.         EvbKeyConfigPoll();        //
  137.                 IICConfig();//
  138.         /* USART interrupt configuration 使能串口中断及优先级0,0*/
  139. //    nvic_irq_enable(USART1_IRQn, 0, 0);
  140.         /* USART2 configure 波特率11520 ,8数据位1停止位*/
  141.          EvbUart1Config();        //初始化串口
  142.         
  143.         UartSendData(transmit_data,7);
  144.         
  145. //        /* enable USART TBE interrupt开发空中断 */  
  146. //    usart_interrupt_enable(USART1, USART_INT_TBE);
  147.         
  148. ///* wait until USART send the transmitter_buffer */
  149. //    while(txcount < transfersize);
  150. //   
  151. //    while (RESET == usart_flag_get(USART1, USART_FLAG_TC));

  152.         //UartSendData(receive_data,7); //发接收到的数据   
  153.    usart_interrupt_enable(USART1, USART_INT_RBNE);
  154.         //while(rxcount < 7);
  155.         //printf("\n\rUSART receive successfully!\n\r");
  156. //   
  157. //    /* wait until USART receive the receiver_buffer */
  158. //    while(rxcount < receivesize);
  159. //    if(rxcount == receivesize)
  160. //        printf("\n\rUSART receive successfully!\n\r");

  161. //        
  162. //         EvbUart1WriteStr("Hello ZhanglinGD32F\r");
  163. //  printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
  164. //    printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
  165. //    printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
  166. //    printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
  167. //        rcu_ckout_config(RCU_CKOUTSRC_CKSYS, RCU_CKOUT_DIV1);

  168.   rcu_periph_clock_enable(RCU_GPIOB);//使能GPB口时钟
  169.   EvbLedConfig();  //初始化LED
  170.     timer_config();

  171.     while(1)
  172.     {
  173. //                delay_1ms(500);        //500 X 1ms=500ms,1000u时
  174. //        //for (i =0;  i<0xffffff; i++);   //延时     
  175. //        EvbLedControl(LED1, LED_ON);
  176. //        EvbLedControl(LED2, LED_ON);
  177. //        EvbLedControl(LED3, LED_ON);
  178. //        
  179. //                delay_1ms(500);
  180. //       // for (i =0;  i<0xffffff; i++);  //延时
  181. //        EvbLedControl(LED1, LED_OFF);
  182. //        EvbLedControl(LED2, LED_OFF);
  183. //        EvbLedControl(LED3, LED_OFF);
  184.         if(key_ctrol_pid != 0)
  185.         {               
  186.         if(i >1000)
  187.         {
  188.                 i=0;
  189.                 Init_BH1750();                //通电
  190.                  if(LUX_temp > (set_distance+500) )   
  191.                 {
  192.                         DIP_Main();   
  193.                 }
  194.                  if(LUX_temp < (set_distance-500) )      
  195.                 {
  196.                         DIP_Main();     
  197.                 }
  198.         }
  199.         i++;
  200.         }
  201.                 key_s = scan_key();
  202.                 if(key_s != key_v)  //不等于01
  203.                 {
  204.                         delay_1ms(5000);
  205.                         key_s = scan_key();
  206.                         if(key_s != key_v)  //防抖
  207.                         {        
  208.                          key_v = key_s;  
  209.                          proc_key(key_v);  

  210.                         }
  211.                 }
  212.                 if(receive_flag==1)
  213.                 {
  214.                         receive_flag=0;//清除标志
  215.                         if(receive_data[1]==0x11)     
  216.                         {        
  217.                          pwm_pulse_ratio=receive_data[4];  
  218.                          pwm_pulse_red=pwm_pulse_ratio*62;
  219.                         timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,pwm_pulse_red);//设置PWM占空比
  220.                         }
  221.                         if(receive_data[1]==0x10)     
  222.                         {        
  223.                          pwm_pulse_ratio=receive_data[4];
  224.                          pwm_pulse_green=pwm_pulse_ratio*62;
  225.                          timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,pwm_pulse_green);//设置PWM占空比
  226.                         }               
  227.                         if(receive_data[1]==0x12)   
  228.                         {        
  229.                          pwm_pulse_ratio=receive_data[4];
  230.                          pwm_pulse_blue=pwm_pulse_ratio*62;
  231.                          timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,pwm_pulse_blue);//设置PWM占空比制频率
  232.                         }
  233.                         if(receive_data[1]==0x16)     
  234.                         {        
  235.                                 Init_BH1750();                //通电
  236.                         transmit_data[0]=0xEE;
  237.                         transmit_data[1]=0x85;
  238.                         transmit_data[2]=SensorCDS_Data[0];
  239.                         transmit_data[3]=SensorCDS_Data[1];
  240.                         transmit_data[4]=100;
  241.                         transmit_data[5]=100;
  242.                         transmit_data[6]=0xBA;//数据帧尾码186
  243.                         UartSendData(transmit_data,7);
  244.                         delay_1ms(9000);        
  245.                         }
  246.                         if(receive_data[1]==0x1F)     //按设定值PID控制光照数据
  247.                         {
  248.                         PIDReceive_comm();        
  249.                         set_distance = PIData_Rece;           
  250.                         ASR.Ref         = PIData_Rece;
  251.                         DIP_Main();     
  252.                         }
  253.                 UartSendData(receive_data,7); //发送接收到的数据
  254.                         
  255.                 }
  256.                  //EvbUart1WriteStr("Hello ZhanglinGD32F\r");
  257. //                if (EvbKeyScanPoll() == 1)  //按键是否按下
  258. //                {  
  259. //                        delay_1ms(500);
  260.                                         /* print out the clock frequency of system, AHB, APB1 and APB2 */
  261. //        printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
  262. //    printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
  263. //    printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
  264. //    printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
  265. //        printf("%s =%d\r\n","rcu_clock_freq_get.CK_SYS",rcu_clock_freq_get(CK_SYS));
  266. //                }  
  267.                  //else
  268.     }

  269.    // return 1;
  270. }

  271. /* 重定向C 库函数printf function to the USART 魔法棒需勾选Use MicroLIB */
  272. int fputc(int ch, FILE *f)
  273. {        /* 将printf内容发到串口      */
  274.     usart_data_transmit(USART1, (uint8_t)ch);// USART1 换成 USART2可改
  275.     while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));

  276.     return ch;
  277. }
复制代码

3.jpg
3.jpg

上位机监控软件

上位机监控软件

光照波长配比调节2

光照波长配比调节2

演示系统在扰动下光照度控制过程记录2

演示系统在扰动下光照度控制过程记录2

GD32F350DX.rar

1.33 MB, 下载次数: 32, 下载积分: 黑币 -5

完整代码如下

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:522147 发表于 2019-4-26 15:26 | 显示全部楼层
资料可以发我邮箱吗?wxcgyb@163.com
回复

使用道具 举报

ID:484435 发表于 2019-4-27 11:00 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表