找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5085|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

GD32F350單片機(jī)智能植物生長LED光照控制系統(tǒng)設(shè)計(jì)源碼與資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:406390 發(fā)表于 2018-10-13 13:19 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
作品簡介:光照是植物光合作用、生長發(fā)育不可缺少的重要環(huán)境因素,但光照受天氣、季節(jié)影響很大,而研究表明人工光源可以作為植物光合作用的光源來使用,能為植物提供不間斷的光照,不受天氣影響。但傳統(tǒng)人工光照光源通常采用熒光燈、高壓鈉燈和金屬鹵素?zé)舻,但這些光源壽命短、效率低,其電氣特性決定了這些光源的光強(qiáng)難以調(diào)節(jié)、調(diào)光效果差,應(yīng)用度不高。LED光源體積小、重量輕、壽命長、發(fā)光效率高、波長類型豐富、高安全可靠和無環(huán)境污染。不同波長的LED組合可以很好的與植物光合作用需要的光譜相匹配,促進(jìn)了植物生長,減短了植物開花結(jié)果的時(shí)間,提高了產(chǎn)量,使用LED植物生長光源更加具有環(huán)保節(jié)能的作用。    為了高效的利用LED光源體對植物生長的促進(jìn)作用,植物生長LED光照系統(tǒng)的設(shè)計(jì)開發(fā)可以很好實(shí)現(xiàn)這個(gè)目標(biāo)。采用兆易創(chuàng)新GigaDevice公司基于ARM®Cortex™-M4處理器的32位微控制器GD32F350為控制核心的GD32 Colibri-F350RB 開發(fā)板為系統(tǒng)的主控制器,在此基礎(chǔ)上編制完全原創(chuàng)的控制程序。利用PID自動(dòng)控制技術(shù)編制相關(guān)算法,在GD32F350的程序中編寫使用PID算法程序?yàn)楹诵牡目刂瞥绦,采用PWM方式進(jìn)行光照調(diào)節(jié),利用上位機(jī)監(jiān)控軟件、傳感器、GD32 Colibri-F350RB 開發(fā)板為系統(tǒng)的主控制器和LED驅(qū)動(dòng)器等組成的植物生長LED光照控制系統(tǒng),可以實(shí)現(xiàn)對植物光照環(huán)境進(jìn)行實(shí)時(shí)監(jiān)控和自動(dòng)智能調(diào)節(jié),極大提高了生產(chǎn)效率,解決了溫室植物對光照環(huán)境的需求。
整個(gè)系統(tǒng)的硬件主要組成有GD32 Colibri-F350RB 開發(fā)板為系統(tǒng)的主控制器、XY-30光照傳感器、LED驅(qū)動(dòng)控制器、特殊波長的 LED光源、12V電源等。

制作出來的實(shí)物圖如下::

系統(tǒng)上位機(jī)檢測控制軟件,利用RS232串口與主控制器通信,可以實(shí)時(shí)控制主控制器和接收主控制器發(fā)送來的數(shù)據(jù)


系統(tǒng)框圖


光照波長配比調(diào)節(jié)1



演示系統(tǒng)在擾動(dòng)下光照度控制過程記錄1


光照波長配比調(diào)節(jié)3


單片機(jī)程序源碼如下:
  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;//上位機(jī)發(fā)送的PWM占空比系數(shù)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++);   //延時(shí)
  56.                         pwm_pulse_red =pwm_pulse_red+1000;//PWM占空比
  57.                         timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,pwm_pulse_red);//設(shè)置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;//數(shù)據(jù)幀尾碼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;//數(shù)據(jù)幀尾碼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 使能串口中斷及優(yōu)先級(jí)0,0*/
  139. //    nvic_irq_enable(USART1_IRQn, 0, 0);
  140.         /* USART2 configure 波特率11520 ,8數(shù)據(jù)位1停止位*/
  141.          EvbUart1Config();        //初始化串口
  142.         
  143.         UartSendData(transmit_data,7);
  144.         
  145. //        /* enable USART TBE interrupt開發(fā)空中斷 */  
  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); //發(fā)接收到的數(shù)據(jù)   
  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口時(shí)鐘
  169.   EvbLedConfig();  //初始化LED
  170.     timer_config();

  171.     while(1)
  172.     {
  173. //                delay_1ms(500);        //500 X 1ms=500ms,1000u時(shí)
  174. //        //for (i =0;  i<0xffffff; i++);   //延時(shí)     
  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++);  //延時(shí)
  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;//清除標(biāo)志
  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);//設(shè)置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);//設(shè)置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);//設(shè)置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;//數(shù)據(jù)幀尾碼186
  243.                         UartSendData(transmit_data,7);
  244.                         delay_1ms(9000);        
  245.                         }
  246.                         if(receive_data[1]==0x1F)     //按設(shè)定值PID控制光照數(shù)據(jù)
  247.                         {
  248.                         PIDReceive_comm();        
  249.                         set_distance = PIData_Rece;           
  250.                         ASR.Ref         = PIData_Rece;
  251.                         DIP_Main();     
  252.                         }
  253.                 UartSendData(receive_data,7); //發(fā)送接收到的數(shù)據(jù)
  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 庫函數(shù)printf function to the USART 魔法棒需勾選Use MicroLIB */
  272. int fputc(int ch, FILE *f)
  273. {        /* 將printf內(nèi)容發(fā)到串口      */
  274.     usart_data_transmit(USART1, (uint8_t)ch);// USART1 換成 USART2可改
  275.     while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));

  276.     return ch;
  277. }
復(fù)制代碼

3.jpg (211.13 KB, 下載次數(shù): 115)

3.jpg

3.jpg (211.13 KB, 下載次數(shù): 135)

3.jpg

5.jpg (352.45 KB, 下載次數(shù): 123)

上位機(jī)監(jiān)控軟件

上位機(jī)監(jiān)控軟件

7.jpg (309.14 KB, 下載次數(shù): 121)

光照波長配比調(diào)節(jié)2

光照波長配比調(diào)節(jié)2

10.jpg (271.75 KB, 下載次數(shù): 114)

演示系統(tǒng)在擾動(dòng)下光照度控制過程記錄2

演示系統(tǒng)在擾動(dòng)下光照度控制過程記錄2

GD32F350DX.rar

1.33 MB, 下載次數(shù): 33, 下載積分: 黑幣 -5

完整代碼如下

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:522147 發(fā)表于 2019-4-26 15:26 | 只看該作者
資料可以發(fā)我郵箱嗎?wxcgyb@163.com
回復(fù)

使用道具 舉報(bào)

板凳
ID:484435 發(fā)表于 2019-4-27 11:00 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表