#include "sysconfig.h"
#include "lcd.h"
#include "pid.h"
#include "math.h"
#include "key.h"
typedef struct {
u8 SPEED_SetSpeed;
u8 PID_P;
u8 PID_I;
u8 PID_D;
u8 PID_Z;
}SYS_SetStructTypeDef;
SYS_SetStructTypeDef SYS_SetStruct;
bit TIM0_500uSFlag = FALSE;
u8 TIM_500msCounter;
u8 TIM_1SCounter;
u8 TIM_10mSCounter;
u16 SPEED_CheckSpeedCounter;
u16 SPEED_SpeedValue;
bit SPEED_OldState;
u8 PWM_Counter;
u8 PWM_Duty;
u8 SYS_SetMode = 1;
bit LCD_FlashSetSpeed;
bit LCD_FlashSetP;
bit LCD_FlashSetI;
bit LCD_FlashSetD;
bit LCD_FlashSetZ;
bit LCD_FlashFlagSetSpeed = FALSE;
bit LCD_FlashFlagSetP = FALSE;
bit LCD_FlashFlagSetI = FALSE;
bit LCD_FlashFlagSetD = FALSE;
bit LCD_FlashFlagSetZ = FALSE;
extern u8 KEY_Value;
u16 SPEED_ValueBuffer[10];
u8 SPEED_ResultValue;
bit TIM1_10uSFlag = FALSE;
u8 SYS_SetTimeOutCounter = 0;
static PID_TypeDef PID_Value;
void TIM_Init(){
TMOD = 0x11;
TH0 = 0xfe;
TL0 = 0x0c;
TH1 = 0xff;
TL1 = 0xf6;
TR0 = 1;
TR1 = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
}
void TIM0_IRQHandle() interrupt T0 using 1 {
EA = 0;
TF0 = 0;
TH0 = 0xfe;
TL0 = 0x0c;
TIM0_500uSFlag = TRUE;
EA = 1;
}
void TIM1_IRQHandle() interrupt T1 using 3 {
EA = 0;
TF1 = 0;
TH1 = 0xff;
TL1 = 0xf6;
TIM1_10uSFlag = TRUE;
EA = 1;
}
void SPEED_Init(){
TIM_Init();
TIM_500msCounter = 0;
TIM_1SCounter = 0;
TIM_10mSCounter = 0;
SPEED_OldState = FALSE;
SPEED_CheckSpeedCounter = 0;
PID_IncInit(&PID_Value);
SYS_SetStruct.SPEED_SetSpeed = 12;
PWM_Duty = 50;
SYS_SetStruct.PID_P = 120;
SYS_SetStruct.PID_I = 110;
SYS_SetStruct.PID_D = 0;
SYS_SetStruct.PID_Z = 10;
}
//中值滤波器
//u16 GetMedianNum(u16 * bArray, u8 len){
// u8 i,j;
// u16 bTemp;
// for (j = 0; j < len - 1; j ++){
// for (i = 0; i < len - j - 1; i ++){
// if (bArray[i] > bArray[i + 1]){
// bTemp = bArray[i];
// bArray[i] = bArray[i + 1];
// bArray[i + 1] = bTemp;
// }
// }
// }
// if ((len & 1) > 0)
// bTemp = bArray[(len + 1) / 2];
// else
// bTemp = (bArray[len / 2] + bArray[len / 2 + 1]) / 2;
// return bTemp;
//}
void SPEED_MiddleValue(){
// static u8 count;
// SPEED_ValueBuffer[count] = SPEED_SpeedValue;
// if(count ++ >= 10)
// count = 0;
SPEED_ResultValue = SPEED_SpeedValue;
// GetMedianNum(SPEED_ValueBuffer, 0);
}
void PID_Process(){
PID_IncSetRatio(SYS_SetStruct.PID_P,SYS_SetStruct.PID_I,SYS_SetStruct.PID_D,SYS_SetStruct.PID_Z,&PID_Value);
PID_IncSetRatioLimit(1,100,1,&PID_Value);
SPEED_MiddleValue();
PID_IncCompute(SPEED_ResultValue - SYS_SetStruct.SPEED_SetSpeed , &PWM_Duty, &PID_Value);
}
void LCD_InfDisp(){
u8 grap;
grap = abs(SPEED_ResultValue - SYS_SetStruct.SPEED_SetSpeed);
if(grap > 10)
LED1 = 0;
else
LED1 = 1;
if(PWM_Duty > 50)
LED2 = 1;
else
LED2 = 0;
LCD_Display(0,1,"SPEED:");
LCD_DisplayNumber(6,1,SPEED_ResultValue);
if(LCD_FlashSetSpeed == TRUE)
LCD_Display(11,1," ");
else
LCD_Display(11,1,"SET:");
LCD_DisplayNumber(15,1,SYS_SetStruct.SPEED_SetSpeed);
LCD_Display(0,2,"GRAP:");
LCD_DisplayNumber(5,2,grap);
LCD_Display(10,2,"DUTY:");
LCD_DisplayNumber(15,2,PWM_Duty);
if(LCD_FlashSetP == TRUE)
LCD_Display(0,3," ");
else
LCD_Display(0,3,"P:");
LCD_DisplayNumber(2,3,SYS_SetStruct.PID_P);
if(LCD_FlashSetI == TRUE)
LCD_Display(5,3," ");
else
LCD_Display(5,3,"I:");
LCD_DisplayNumber(7,3,SYS_SetStruct.PID_I);
if(LCD_FlashSetD == TRUE)
LCD_Display(10,3," ");
else
LCD_Display(10,3,"D:");
LCD_DisplayNumber(12,3,SYS_SetStruct.PID_D);
if(LCD_FlashSetZ == TRUE)
LCD_Display(15,3," ");
else
LCD_Display(15,3,"Z:");
LCD_DisplayNumber(17,3,SYS_SetStruct.PID_Z);
}
void SPEED_TimerDriver(){
static u8 flashCounter = 0;
if(TIM0_500uSFlag == TRUE){
TIM0_500uSFlag = FALSE;
if((SPEED_OldState == RESET) && (SPEED == SET)){
SPEED_SpeedValue = SPEED_CheckSpeedCounter;
SPEED_CheckSpeedCounter = 0;
}
SPEED_CheckSpeedCounter ++;
SPEED_OldState = SPEED;
if(++ TIM_10mSCounter >= 20){
u8 *middleValue;
middleValue = (u8 *)&SYS_SetStruct + SYS_SetMode - 1;
TIM_10mSCounter = 0;
PID_Process();
KEY_Scan();
if(KEY_Released == TRUE){
KEY_Released = FALSE;
switch(KEY_Value){
case KEY_Up:
(*middleValue) += 10;
SYS_SetTimeOutCounter = 5;
break;
case KEY_Down:
(*middleValue) -= 10;
SYS_SetTimeOutCounter = 5;
break;
case KEY_Left:
(*middleValue) --;
SYS_SetTimeOutCounter = 5;
break;
case KEY_Right:
(*middleValue) ++;
SYS_SetTimeOutCounter = 5;
break;
case KEY_Move:
LCD_FlashFlagSetSpeed = FALSE;
LCD_FlashFlagSetP = FALSE;
LCD_FlashFlagSetI = FALSE;
LCD_FlashFlagSetD = FALSE;
LCD_FlashFlagSetZ = FALSE;
SYS_SetTimeOutCounter = 5;
if(++ SYS_SetMode >= 6)
SYS_SetMode = 1;
if(SYS_SetMode == 1)
LCD_FlashFlagSetSpeed = TRUE;
else if(SYS_SetMode == 2)
LCD_FlashFlagSetP = TRUE;
else if(SYS_SetMode == 3)
LCD_FlashFlagSetI = TRUE;
else if(SYS_SetMode == 4)
LCD_FlashFlagSetD = TRUE;
else if(SYS_SetMode == 5)
LCD_FlashFlagSetZ = TRUE;
break;
case KEY_Enter:
break;
}
}
LCD_InfDisp();
if( ++ TIM_500msCounter >= 50){
TIM_500msCounter = 0;
LED0 = ~LED0;
if(SYS_SetTimeOutCounter-- == 1){
SYS_SetTimeOutCounter = 0;
SYS_SetMode = 1;
LCD_FlashFlagSetSpeed = FALSE;
LCD_FlashFlagSetP = FALSE;
LCD_FlashFlagSetI = FALSE;
LCD_FlashFlagSetD = FALSE;
LCD_FlashFlagSetZ = FALSE;
}
}
if(++ flashCounter >= 10){
if(LCD_FlashFlagSetSpeed == FALSE)
LCD_FlashSetSpeed = FALSE;
else
LCD_FlashSetSpeed = ~LCD_FlashSetSpeed;
if(LCD_FlashFlagSetP == FALSE)
LCD_FlashSetP = FALSE;
else
LCD_FlashSetP = ~LCD_FlashSetP;
if(LCD_FlashFlagSetI == FALSE)
LCD_FlashSetI = FALSE;
else
LCD_FlashSetI = ~LCD_FlashSetI;
if(LCD_FlashFlagSetD == FALSE)
LCD_FlashSetD = FALSE;
else
LCD_FlashSetD = ~LCD_FlashSetD;
if(LCD_FlashFlagSetZ == FALSE)
LCD_FlashSetZ = FALSE;
else
LCD_FlashSetZ = ~LCD_FlashSetZ;
}
}
}
if(TIM1_10uSFlag == TRUE){
TIM1_10uSFlag = FALSE;
if(++ PWM_Counter >= 100)
PWM_Counter = 0;
if(PWM_Counter >= PWM_Duty)
MOTOR = 1;
else
MOTOR = 0;
}
}
评论1
最新资源