|
作品簡介:光照是植物光合作用、生長發育不可缺少的重要環境因素,但光照受天氣、季節影響很大,而研究表明人工光源可以作為植物光合作用的光源來使用,能為植物提供不間斷的光照,不受天氣影響。但傳統人工光照光源通常采用熒光燈、高壓鈉燈和金屬鹵素燈等,但這些光源壽命短、效率低,其電氣特性決定了這些光源的光強難以調節、調光效果差,應用度不高。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電源等。
制作出來的實物圖如下::
4.jpg (555.13 KB, 下載次數: 116)
下載附件
系統上位機檢測控制軟件,利用RS232串口與主控制器通信,可以實時控制主控制器和接收主控制器發送來的數據 ...
2018-10-13 13:15 上傳
系統上位機檢測控制軟件,利用RS232串口與主控制器通信,可以實時控制主控制器和接收主控制器發送來的數據
1.png (50.22 KB, 下載次數: 80)
下載附件
系統框圖
2018-10-13 13:12 上傳
系統框圖
6.jpg (327.7 KB, 下載次數: 71)
下載附件
光照波長配比調節1
2018-10-13 13:17 上傳
光照波長配比調節1
9.jpg (245.27 KB, 下載次數: 76)
下載附件
演示系統在擾動下光照度控制過程記錄1
2018-10-13 13:18 上傳
演示系統在擾動下光照度控制過程記錄1
8.jpg (308.69 KB, 下載次數: 65)
下載附件
光照波長配比調節3
2018-10-13 13:17 上傳
光照波長配比調節3
單片機程序源碼如下:
- #include "350dx_led.h"
- #include "350dx_uart.h"
- #include "350dx_key.h"
- #include "350dx_iic.h"
- #include "350dx_pid.h"
- #include "systick.h"
- #include "main.h"
- #include <stdio.h>
- #include "gd32f3x0_rcu.h"
- //#include "gd32f3x0.h"
- //#include "gd32f3x0_it.h"
- #define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
- #define TRANSMIT_SIZE (ARRAYNUM(transmitter_buffer) - 1)
- uint8_t transmitter_buffer[] = "\n\rUSART interrupt test\n\r";
- uint8_t receiver_buffer[32];
- uint8_t transfersize = TRANSMIT_SIZE;
- uint8_t receivesize = 32;
- __IO uint8_t txcount = 0;
- __IO uint16_t rxcount = 0;
- uint8_t receive_data[10];
- uint8_t transmit_data[7];
- uint8_t receive_flag;
- uint32_t pwm_pulse_red,pwm_pulse_green,pwm_pulse_blue;
- uint32_t pwm_pulse_ratio;//上位機發送的PWM占空比系數X62=TIMER1值
- unsigned char SensorCDS_Data[5];
- uint8_t key_s,key_v = 0x01;
- uint8_t key_ctrol_pid = 0x00;
- extern uint32_t LUX_temp;
- extern PID_value ASR;
- extern float set_distance ;
- extern float PIData_Rece;
- void led_spark(void)
- { //呼吸燈
- static __IO uint32_t timingdelaylocal = 0U;
- if(timingdelaylocal){
- if(timingdelaylocal < 500U){
- EvbLedControl(LED1, LED_ON);
- // EvbLedControl(LED2, LED_ON);
- // EvbLedControl(LED3, LED_ON);
- }else{
- EvbLedControl(LED1, LED_OFF);
- //EvbLedControl(LED2, LED_OFF);
- //EvbLedControl(LED3, LED_OFF);
- }
- timingdelaylocal--;
- }else{
- timingdelaylocal = 1000U;
- }
- } // */
- void proc_key(unsigned char key_v)
- {
- // unsigned int count;
- if((key_v & 0x01) == 0)
- {
- //for (count =0; count<0xffffff; count++); //延時
- pwm_pulse_red =pwm_pulse_red+1000;//PWM占空比
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,pwm_pulse_red);//設置PWM占空比
- key_ctrol_pid =! key_ctrol_pid;
-
- Init_BH1750();
- transmit_data[0]=0xEE;
- transmit_data[1]=0x85;
- transmit_data[2]=SensorCDS_Data[0];
- transmit_data[3]=SensorCDS_Data[1];
- transmit_data[4]=100;
- transmit_data[5]=100;
- transmit_data[6]=0xBA;//數據幀尾碼186
- UartSendData(transmit_data,7);
-
- //DIP_Main();
- }
- }
- void timer_config(void)
- {
- /* -----------------------------------------------------------------------
- TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:
- TIMER1CLK is 1MHz
- - TIMER1_CH1 pin (PB3)
- - TIMER1_CH2 pin (PB10)
- - TIMER1_CH3 pin (PB11)
- TIMER1 channel1 duty cycle = (4000/ 16000)* 100 = 25%
- TIMER1 channel2 duty cycle = (8000/ 16000)* 100 = 50%
- TIMER1 channel3 duty cycle = (12000/ 16000)* 100 = 75%
- ----------------------------------------------------------------------- */
- timer_oc_parameter_struct timer_ocintpara;
- timer_parameter_struct timer_initpara;
- rcu_periph_clock_enable(RCU_TIMER1);
- timer_deinit(TIMER1);
- /* TIMER1 configuration */
- #ifdef GD32F330
- timer_initpara.prescaler = 83;
- #endif /* GD32F330 */
- #ifdef GD32F350
- timer_initpara.prescaler = 107;
- #endif /* GD32F350 */
- timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.period = 15999; //裝載值 1000k/15999=62hz
- timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
- timer_initpara.repetitioncounter = 0;
- timer_init(TIMER1,&timer_initpara);
- /* CH1,CH2 and CH3 configuration in PWM mode0 */
- timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
- timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
- timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);
- timer_channel_output_config(TIMER1,TIMER_CH_2,&timer_ocintpara);
- timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocintpara);
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,3999);
- timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,1999);//7999 50%
- timer_channel_output_mode_config(TIMER1,TIMER_CH_2,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(TIMER1,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,11999);
- timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);
- /* auto-reload preload enable */
- timer_auto_reload_shadow_enable(TIMER1);
- /* auto-reload preload enable */
- timer_enable(TIMER1);
- }
- int main(void)
- {
- int i;
- transmit_data[0]=0xEE;
- transmit_data[1]=0x99;
- transmit_data[2]=100;
- transmit_data[3]=100;
- transmit_data[4]=101;
- transmit_data[5]=150;
- transmit_data[6]=0xBA;//數據幀尾碼186
- // nvic_priority_group_set(NVIC_PRIGROUP_PRE0_SUB4);
- /* 配置configure systick */
- systick_config();
- // EvbLedConfig(); //
- EvbKeyConfigPoll(); //
- IICConfig();//
- /* USART interrupt configuration 使能串口中斷及優先級0,0*/
- // nvic_irq_enable(USART1_IRQn, 0, 0);
- /* USART2 configure 波特率11520 ,8數據位1停止位*/
- EvbUart1Config(); //初始化串口
-
- UartSendData(transmit_data,7);
-
- // /* enable USART TBE interrupt開發空中斷 */
- // usart_interrupt_enable(USART1, USART_INT_TBE);
-
- ///* wait until USART send the transmitter_buffer */
- // while(txcount < transfersize);
- //
- // while (RESET == usart_flag_get(USART1, USART_FLAG_TC));
- //UartSendData(receive_data,7); //發接收到的數據
- usart_interrupt_enable(USART1, USART_INT_RBNE);
- //while(rxcount < 7);
- //printf("\n\rUSART receive successfully!\n\r");
- //
- // /* wait until USART receive the receiver_buffer */
- // while(rxcount < receivesize);
- // if(rxcount == receivesize)
- // printf("\n\rUSART receive successfully!\n\r");
- //
- // EvbUart1WriteStr("Hello ZhanglinGD32F\r");
- // printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
- // printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
- // printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
- // printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
- // rcu_ckout_config(RCU_CKOUTSRC_CKSYS, RCU_CKOUT_DIV1);
- rcu_periph_clock_enable(RCU_GPIOB);//使能GPB口時鐘
- EvbLedConfig(); //初始化LED
- timer_config();
- while(1)
- {
- // delay_1ms(500); //500 X 1ms=500ms,1000u時
- // //for (i =0; i<0xffffff; i++); //延時
- // EvbLedControl(LED1, LED_ON);
- // EvbLedControl(LED2, LED_ON);
- // EvbLedControl(LED3, LED_ON);
- //
- // delay_1ms(500);
- // // for (i =0; i<0xffffff; i++); //延時
- // EvbLedControl(LED1, LED_OFF);
- // EvbLedControl(LED2, LED_OFF);
- // EvbLedControl(LED3, LED_OFF);
- if(key_ctrol_pid != 0)
- {
- if(i >1000)
- {
- i=0;
- Init_BH1750(); //通電
- if(LUX_temp > (set_distance+500) )
- {
- DIP_Main();
- }
- if(LUX_temp < (set_distance-500) )
- {
- DIP_Main();
- }
- }
- i++;
- }
- key_s = scan_key();
- if(key_s != key_v) //不等于01
- {
- delay_1ms(5000);
- key_s = scan_key();
- if(key_s != key_v) //防抖
- {
- key_v = key_s;
- proc_key(key_v);
- }
- }
- if(receive_flag==1)
- {
- receive_flag=0;//清除標志
- if(receive_data[1]==0x11)
- {
- pwm_pulse_ratio=receive_data[4];
- pwm_pulse_red=pwm_pulse_ratio*62;
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,pwm_pulse_red);//設置PWM占空比
- }
- if(receive_data[1]==0x10)
- {
- pwm_pulse_ratio=receive_data[4];
- pwm_pulse_green=pwm_pulse_ratio*62;
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,pwm_pulse_green);//設置PWM占空比
- }
- if(receive_data[1]==0x12)
- {
- pwm_pulse_ratio=receive_data[4];
- pwm_pulse_blue=pwm_pulse_ratio*62;
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,pwm_pulse_blue);//設置PWM占空比制頻率
- }
- if(receive_data[1]==0x16)
- {
- Init_BH1750(); //通電
- transmit_data[0]=0xEE;
- transmit_data[1]=0x85;
- transmit_data[2]=SensorCDS_Data[0];
- transmit_data[3]=SensorCDS_Data[1];
- transmit_data[4]=100;
- transmit_data[5]=100;
- transmit_data[6]=0xBA;//數據幀尾碼186
- UartSendData(transmit_data,7);
- delay_1ms(9000);
- }
- if(receive_data[1]==0x1F) //按設定值PID控制光照數據
- {
- PIDReceive_comm();
- set_distance = PIData_Rece;
- ASR.Ref = PIData_Rece;
- DIP_Main();
- }
- UartSendData(receive_data,7); //發送接收到的數據
-
- }
- //EvbUart1WriteStr("Hello ZhanglinGD32F\r");
- // if (EvbKeyScanPoll() == 1) //按鍵是否按下
- // {
- // delay_1ms(500);
- /* print out the clock frequency of system, AHB, APB1 and APB2 */
- // printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
- // printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
- // printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
- // printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
- // printf("%s =%d\r\n","rcu_clock_freq_get.CK_SYS",rcu_clock_freq_get(CK_SYS));
- // }
- //else
- }
- // return 1;
- }
- /* 重定向C 庫函數printf function to the USART 魔法棒需勾選Use MicroLIB */
- int fputc(int ch, FILE *f)
- { /* 將printf內容發到串口 */
- usart_data_transmit(USART1, (uint8_t)ch);// USART1 換成 USART2可改
- while(RESET == usart_flag_get(USART1, USART_FLAG_TBE));
- return ch;
- }
復制代碼
|
-
3.jpg
(211.13 KB, 下載次數: 115)
下載附件
2018-10-13 13:13 上傳
-
3.jpg
(211.13 KB, 下載次數: 135)
下載附件
2018-10-13 13:14 上傳
-
5.jpg
(352.45 KB, 下載次數: 123)
下載附件
2018-10-13 13:16 上傳
上位機監控軟件
-
7.jpg
(309.14 KB, 下載次數: 121)
下載附件
2018-10-13 13:17 上傳
光照波長配比調節2
-
10.jpg
(271.75 KB, 下載次數: 114)
下載附件
2018-10-13 13:18 上傳
演示系統在擾動下光照度控制過程記錄2
-
-
GD32F350DX.rar
2018-10-13 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.33 MB, 下載次數: 33, 下載積分: 黑幣 -5
完整代碼如下
評分
-
查看全部評分
|