diff --git a/HARDWARE/PID.c b/HARDWARE/PID.c index 3e6fc05..041f443 100644 --- a/HARDWARE/PID.c +++ b/HARDWARE/PID.c @@ -1,5 +1,6 @@ #include "PID.h" #include "Relays.h" +#include "USART.h" extern u16 tem; float cold_tem=0; float red_tem=0; @@ -8,12 +9,14 @@ float ki=0.001; float kd=340; extern u8 hot_clod_flag; extern u8 gpio_state; +extern int T; +unsigned int num=0; PID pid; void PID_Init() { //pid.set_tem=tem;//用户设定温度 - pid.Kp=170; + pid.Kp=110; pid.t=500;//PID计算周期 //pid.Ti=5000000;//积分时间 //pid.Td=1000;//微分时间 @@ -25,31 +28,13 @@ void PID_Init() void PID_Calc() //pid计算 { float DelEk;//最近两次偏差之差 - //float td; - float out; if(pid.C1ms<(pid.t)) //计算周期未到 { return ; } - if(pid.set_tem>pid.now_tem+1) - { - //得到当前的偏差值,设置温度大于实际温度,加热,关闭四通阀 - //GPIO_ResetBits(GPIOA,GPIO_Pin_1);//关闭四通阀 - HC595_Send_Byte(gpio_state&=0xFB);//关闭四通阀 &=1111 1011 0xFB - hot_clod_flag=2; - //pid.Iout=0; - } - if(pid.now_tem>pid.set_tem+1) - { - //得到当前的偏差值,设置温度小于实际温度 - //GPIO_SetBits(GPIOA,GPIO_Pin_1);//打开四通阀,制冷 - HC595_Send_Byte(gpio_state|=0x04);//打开四通阀,制冷 |=0000 0100 - hot_clod_flag=1; - //pid.Iout=0; - } - + if(pid.set_tem>pid.now_tem) { pid.Ek=pid.set_tem-pid.now_tem; @@ -70,18 +55,16 @@ void PID_Calc() //pid pid.Iout=ki*pid.SEk; //积分输出 // td=pid.Td/pid.t; -// // kd=pid.Kp*td; - + pid.Dout=kd*DelEk; //微分输出 if(pid.Dout<0) { pid.Dout=0-pid.Dout; } - //out= pid.Pout+ pid.Iout+ pid.Dout; - out= pid.Pout+pid.Iout+ pid.Dout; - + //out= pid.Pout+pid.Iout+ pid.Dout; + out= pid.Pout; if(out>pid.pwmcycle) { pid.OUT=pid.pwmcycle; @@ -96,4 +79,42 @@ void PID_Calc() //pid } pid.Ek_1=pid.Ek; //更新偏差 pid.C1ms=0; + + if(pid.set_tem>pid.now_tem+1) + { + //得到当前的偏差值,设置温度大于实际温度1℃,加热,关闭压缩机,打开加热棒 + /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */ + //HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF + TIM_SetCompare3(TIM3,0); + HC595_Send_Byte(gpio_state|=0x04);//打开加热棒 |=0000 0100 0x04 + hot_clod_flag=2; + pid.Iout=0; + } + if(pid.now_tem>pid.set_tem) + { + //得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒 + HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 &=1111 1011 0xFB + num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 + TIM_SetCompare3(TIM3,num); + //printf("%d\r\n",num); + //0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25% + //HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000 + hot_clod_flag=1; + //pid.Iout=0; + } + if(hot_clod_flag==1 && T<=tem-3)//制冷过程中温度下降低于设定温度0.3℃ + { + //HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB + TIM_SetCompare3(TIM3,0);//关闭压缩机 + HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 + hot_clod_flag=0; + } + + if(hot_clod_flag==2 && T>=tem) + { + //HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭四通阀 &=1101 1101 0xDB + TIM_SetCompare3(TIM3,0);//关闭压缩机 + HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 + hot_clod_flag=0; + } } diff --git a/HARDWARE/PWM.c b/HARDWARE/PWM.c index 37d7977..a9ed1b3 100644 --- a/HARDWARE/PWM.c +++ b/HARDWARE/PWM.c @@ -63,7 +63,7 @@ void PWM2_Init(uint16_t Per,uint16_t Psc) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //TIM2_CH1 + GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //TIM1_CH4 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); diff --git a/HARDWARE/PWMOUT.c b/HARDWARE/PWMOUT.c index 96aed50..a5495ee 100644 --- a/HARDWARE/PWMOUT.c +++ b/HARDWARE/PWMOUT.c @@ -2,13 +2,13 @@ #include "PID.h" -void TIM3_Init(void) +void TIM2_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); - NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; + NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); @@ -17,48 +17,55 @@ void TIM3_Init(void) TIM_TimeBaseStructure.TIM_Period = 1000; // 10KHz TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1); // 1MHz TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); - TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); - TIM_Cmd(TIM3,ENABLE); + TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); + TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); + TIM_Cmd(TIM2,ENABLE); } -void TIM3_IRQHandler(void) +void TIM2_IRQHandler(void) { - if(TIM_GetITStatus(TIM3,TIM_IT_Update)) + if(TIM_GetITStatus(TIM2,TIM_IT_Update)) { pid.C1ms++; - TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志 + TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志 } } -void TimePwm_init(int arr,int psc) +void TimePwm_init(int arr,int psc)// { - GPIO_InitTypeDef GPIO_InitStructure; - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - TIM_OCInitTypeDef TIM_OCInitStructure; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); - //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM3_CH3 - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOB, &GPIO_InitStructure); - - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); - - TIM_TimeBaseStructure.TIM_Period = arr; - TIM_TimeBaseStructure.TIM_Prescaler =psc; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); - - TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; - TIM_OC3Init(TIM3, &TIM_OCInitStructure); - TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); - TIM_Cmd(TIM3, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); + +// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); +// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); +// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); + + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //PA1 TIM2_CH2 + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOB,&GPIO_InitStructure); + + TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; + + TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; + TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; + TIM_TimeBaseInitStructure.TIM_Period=arr; //ARR + TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //PSC + TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; + TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); + + TIM_OCInitTypeDef TIM_OCInitStructure; + TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋初始值 + + TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式 + TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性 + TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_Pulse=0; //CCR的值 + TIM_OC3Init(TIM3,&TIM_OCInitStructure);//TIM_OC1Init()函数用来初始化输出比较单元 + + TIM_Cmd(TIM3,ENABLE);//定时器使能 } diff --git a/HARDWARE/PWMOUT.h b/HARDWARE/PWMOUT.h index 9fffa5c..0eb3297 100644 --- a/HARDWARE/PWMOUT.h +++ b/HARDWARE/PWMOUT.h @@ -3,9 +3,9 @@ #include "system.h" -void TIM3_Init(void); +void TIM2_Init(void); void PWM_OUT(void); -void TimePwm_init(int arr,int psc); +void TimePwm_init(int arr,int psc);// #endif diff --git a/OBJ/LED.axf b/OBJ/LED.axf index 13d9947..a439608 100644 Binary files a/OBJ/LED.axf and b/OBJ/LED.axf differ diff --git a/OBJ/LED.build_log.htm b/OBJ/LED.build_log.htm index 927543c..bff2017 100644 --- a/OBJ/LED.build_log.htm +++ b/OBJ/LED.build_log.htm @@ -27,9 +27,9 @@ Project File Date: 11/19/2023