久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5036|回復: 2
打印 上一主題 下一主題
收起左側

GD32F350單片機智能植物生長LED光照控制系統設計源碼與資料

[復制鏈接]
跳轉到指定樓層
樓主
作品簡介:光照是植物光合作用、生長發育不可缺少的重要環境因素,但光照受天氣、季節影響很大,而研究表明人工光源可以作為植物光合作用的光源來使用,能為植物提供不間斷的光照,不受天氣影響。但傳統人工光照光源通常采用熒光燈、高壓鈉燈和金屬鹵素燈等,但這些光源壽命短、效率低,其電氣特性決定了這些光源的光強難以調節、調光效果差,應用度不高。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串口與主控制器通信,可以實時控制主控制器和接收主控制器發送來的數據


系統框圖


光照波長配比調節1



演示系統在擾動下光照度控制過程記錄1


光照波長配比調節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 (211.13 KB, 下載次數: 115)

3.jpg

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

3.jpg

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

上位機監控軟件

上位機監控軟件

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

光照波長配比調節2

光照波長配比調節2

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

演示系統在擾動下光照度控制過程記錄2

演示系統在擾動下光照度控制過程記錄2

GD32F350DX.rar

1.33 MB, 下載次數: 33, 下載積分: 黑幣 -5

完整代碼如下

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美精品 | 国产免费拔擦拔擦8x高清 | 国产精品成人一区二区 | 一区二区三区视频播放 | 中文字幕在线网 | 中文字幕在线观看成人 | 国产精品自产拍 | 久久国产电影 | 日日欧美| 久久网日本 | 中文字幕成人网 | 国产又爽又黄的视频 | 中文字幕 视频一区 | 日本一区二区三区在线观看 | 免费看黄色国产 | 一区免费看 | 久久国产区 | 日韩中文字幕视频在线观看 | 亚洲精品乱码久久久久久按摩观 | 91精品在线播放 | 国产欧美在线 | 色在线免费 | 亚洲欧美男人天堂 | 欧美视频一区二区三区 | 亚洲精品日日夜夜 | 欧美成人精品一区二区男人看 | 国产精品国产三级国产aⅴ无密码 | 精品视频久久久久久 | 中文字幕在线视频精品 | 日韩成人久久 | 一区福利视频 | 精品国产乱码久久久久久蜜臀 | 欧美色999| 在线观看中文字幕 | 在线精品观看 | 男人天堂手机在线视频 | 成人欧美一区二区 | 在线国产一区二区 | 69av片| 在线视频一区二区三区 | 久久伊人影院 |