|
作品简介:光照是植物光合作用、生长发育不可缺少的重要环境因素,但光照受天气、季节影响很大,而研究表明人工光源可以作为植物光合作用的光源来使用,能为植物提供不间断的光照,不受天气影响。但传统人工光照光源通常采用荧光灯、高压钠灯和金属卤素灯等,但这些光源寿命短、效率低,其电气特性决定了这些光源的光强难以调节、调光效果差,应用度不高。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
单片机程序源码如下:
- #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)
-
3.jpg
(211.13 KB, 下载次数: 135)
-
5.jpg
(352.45 KB, 下载次数: 123)
上位机监控软件
-
7.jpg
(309.14 KB, 下载次数: 121)
光照波长配比调节2
-
10.jpg
(271.75 KB, 下载次数: 114)
演示系统在扰动下光照度控制过程记录2
-
-
GD32F350DX.rar
1.33 MB, 下载次数: 33, 下载积分: 黑币 -5
完整代码如下
评分
-
查看全部评分
|