#ifndef MOTOR_CONTROL_TASK_H__ #define MOTOR_CONTROL_TASK_H__ #include #include #include #include #include #include //#define Time1_timing 8000U //500*16 :500us #define ADC_period 20000U*48U/Time1_timing #if control_type == Divide_2 #define VAMP_Cnt 8 #define ADC_period 20000U*48U/Time1_timing #define Downpwm_APhasePos_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x08U //PA3 ON(Upper bridge arm) #define Downpwm_APhasePos_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x08U //PA3 OFF(Upper bridge arm) #define Downpwm_APhasePos_Low_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x04U //PA2 OFF(Lower bridge arm) #define Downpwm_APhasePos_Low_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x04U //PA2 ON(Lower bridge arm) #define Downpwm_APhaseNeg_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x40U //PA6 ON(Upper bridge arm) #define Downpwm_APhaseNeg_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x40U //PA6 OFF(Upper bridge arm) #define Downpwm_APhaseNeg_Low_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x20U //PA5 OFF(Lower bridge arm) #define Downpwm_APhaseNeg_Low_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x20U //PA5 ON(Lower bridge arm) #define Downpwm_BPhasePos_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATASET |= 0x04U //PB2 ON(Upper bridge arm) #define Downpwm_BPhasePos_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATACLR |= 0x04U //PB2 OFF(Upper bridge arm) #define Downpwm_BPhasePos_Low_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATACLR |= 0x02U //PB1 OFF(Lower bridge arm) #define Downpwm_BPhasePos_Low_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATASET |= 0x02U //PB1 ON(Lower bridge arm) #define Downpwm_BPhaseNeg_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x10U//PA4 ON(Upper bridge arm) #define Downpwm_BPhaseNeg_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x10U //PA4 OFF(Upper bridge arm) #define Downpwm_BPhaseNeg_Low_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATACLR |= 0x01U //PB0 OFF(Lower bridge arm) #define Downpwm_BPhaseNeg_Low_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATASET |= 0x01U //PB0 ON(Lower bridge arm) #define Abridge_OFF do{ Downpwm_APhasePos_High_OFF;Downpwm_APhasePos_Low_OFF;Downpwm_APhaseNeg_High_OFF;Downpwm_APhaseNeg_Low_OFF;}while(0) #define Bbridge_OFF do{ Downpwm_BPhasePos_High_OFF;Downpwm_BPhasePos_Low_OFF;Downpwm_BPhaseNeg_High_OFF;Downpwm_BPhaseNeg_Low_OFF;}while(0) #define Twobridge_OFF do{ Abridge_OFF;Bbridge_OFF;}while(0) #elif control_type == Divide_6 #define VAMP_Cnt 24U #define PWMAUX_Period 100U*16U #define Downpwm_APhasePos_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x08U //PA3 ON(Upper bridge arm) #define Downpwm_APhasePos_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x08U //PA3 OFF(Upper bridge arm) #define Downpwm_APhasePos_Low_ON do{PWMAUX_SetMatchValue(PWMAUX_CH5, 0, PWMAUX_Period);}while(0) //PA2 OFF(Lower bridge arm) #define Downpwm_APhasePos_Low_OFF do{PWMAUX_SetMatchValue(PWMAUX_CH5, 0, 0);}while(0) //PA2 ON(Lower bridge arm) #define Downpwm_APhaseNeg_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x40U //PA6 ON(Upper bridge arm) #define Downpwm_APhaseNeg_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x40U //PA6 OFF(Upper bridge arm) #define Downpwm_APhaseNeg_Low_ON do{PWMAUX_SetMatchValue(PWMAUX_CH0, 0, PWMAUX_Period);}while(0) //PA5 OFF(Lower bridge arm) #define Downpwm_APhaseNeg_Low_OFF do{PWMAUX_SetMatchValue(PWMAUX_CH0, 0, 0);}while(0) //PA5 ON(Lower bridge arm) #define Downpwm_BPhasePos_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATASET |= 0x04U //PB2 ON(Upper bridge arm) #define Downpwm_BPhasePos_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOB].DATACLR |= 0x04U //PB2 OFF(Upper bridge arm) #define Downpwm_BPhasePos_Low_ON do{PWMAUX_SetMatchValue(PWMAUX_CH2, 0, PWMAUX_Period);}while(0) //PB1 OFF(Lower bridge arm) #define Downpwm_BPhasePos_Low_OFF do{PWMAUX_SetMatchValue(PWMAUX_CH2, 0, 0);}while(0) //PB1 ON(Lower bridge arm) #define Downpwm_BPhaseNeg_High_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATASET |= 0x10U//PA4 ON(Upper bridge arm) #define Downpwm_BPhaseNeg_High_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOA].DATACLR |= 0x10U //PA4 OFF(Upper bridge arm) #define Downpwm_BPhaseNeg_Low_ON do{PWMAUX_SetMatchValue(PWMAUX_CH1, 0, PWMAUX_Period);}while(0) //PB0 OFF(Lower bridge arm) #define Downpwm_BPhaseNeg_Low_OFF do{PWMAUX_SetMatchValue(PWMAUX_CH1, 0, 0);}while(0) //PB0 ON(Lower bridge arm) #define Abridge_OFF do{ Downpwm_APhasePos_High_OFF;Downpwm_APhasePos_Low_OFF;Downpwm_APhaseNeg_High_OFF;Downpwm_APhaseNeg_Low_OFF;}while(0) #define Bbridge_OFF do{ Downpwm_BPhasePos_High_OFF;Downpwm_BPhasePos_Low_OFF;Downpwm_BPhaseNeg_High_OFF;Downpwm_BPhaseNeg_Low_OFF;}while(0) #define Twobridge_OFF do{ Abridge_OFF;Bbridge_OFF;}while(0) #endif #define MotorPower_ON GPIO_SFRS->GPIO_SET[GROUP_GPIOC].DATASET |= 0x08U #define MotorPower_OFF GPIO_SFRS->GPIO_SET[GROUP_GPIOC].DATACLR |= 0x08U #define VDD3V3EXT_ON do{TRIMHV_SFRS->BORTESTMODE.VDD33EXT_EN = 1U;}while(0) #define VDD3V3EXT_OFF do{TRIMHV_SFRS->BORTESTMODE.VDD33EXT_EN = 0U;}while(0) typedef enum{ MotorStop = 0U, MotorRun, }MotorRunState_t; typedef enum{ MotorNoOC= 0U, MotorOC, }MotorOCState_t; typedef enum{ CoilNomal = 0U, CoilOpen, CoilShort, }CoilState_t; typedef enum{ Constantstage = 0U, Climbstage, Slowstage, }RunStage_t; typedef struct{ uint32_t T1timercnt; uint16_t SlowSteper; uint16_t ClimbSteper; uint16_t ClimbTime; uint16_t SlowTime; uint8_t MM_Step; uint32_t stepr; uint32_t stepn; uint32_t s; }Motorpra_t; typedef struct{ uint8_t M_ON; uint16_t Constantspeed; uint16_t Startspeed; uint16_t Slowspeed; uint16_t LockACoilValtage; uint16_t LockBCoilValtage; uint8_t ClimbTime; uint8_t SlowTime; uint16_t Position; }M_Re_pra_t; //Response master typedef struct{ int16_t Tchip; //chip temperature 1C uint16_t vbat; //vbat mv union{ struct{ uint8_t tchipstate :1; //0 正常 1 超温 uint8_t Motor_overcur :1;//0:未超载 1:超载 uint8_t Motor_coilAsta :2;//0:正常;1:开路;2:短路; uint8_t Motor_coilBsta :2;//0:正常;1:开路;2:短路; uint8_t VBAT_sta :2;//VBAT电压 0:正常 1:低压报警 2:高压报警 uint8_t Motor_runsta :1;//1:运行,0:停止 uint8_t Motor_runstage :2;//0:匀速阶段;1:加速阶段;2:减速阶段 }; uint8_t byte[2]; }state; uint32_t MotorErrorState10s; uint16_t Motor_lockAcoilcurrent; //触发堵转停止功能时的Acoil运放输出端电压 mv uint16_t Motor_lockBcoilcurrent; //触发堵转停止功能时的Bcoil运放输出端电压 mv uint16_t Motor_position; //当前运行位置 步 }Motor_and_ChipPar_t; typedef union{ struct{ uint8_t nodeAddress; uint8_t ON :1; //1:运行运转 其它:禁止 uint8_t reserve :7; uint16_t Position; uint8_t reserve1; uint8_t reserve2; uint8_t reserve3; uint8_t reserve4; }; uint8_t data[LIN_BUFF_SIZE]; /*!< data buffer. */ uint16_t data16[LIN_BUFF_SIZE/2]; }MotorCtrlFrame_t; void delay(uint32_t delayus); void MOTORunP_24(uint8_t motorstep); void StopMotor(void); uint8_t ReturnClearT1cntFlag(void); uint8_t Motor_GetMotorState(void); uint8_t Motor_GetMotorRunStage(void); uint32_t Motor_GetMotorErrorState10s(void); void Get_MotorprafromLINM(LIN_Device_Frame_t const *frame); void Calculation_position(void); void Motor_GetSETLockCurrent(uint16_t *data1,uint16_t *data2); uint8_t Motor_GetMotorStep(void); M_Re_pra_t Motor_GetALLMotorSetparameters (void); uint16_t Motor_GetMotorConstantspeed(void); uint16_t Motor_GetCurrentPosition(void); uint8_t Motor_GetOnestep_csa_adcnt(void); void MOTOR_TaskHandler(void); void MotorCtrl_TaskHandler(void); void MOTORunP_8(uint8_t motorstep); void MOTORunP_24(uint8_t motorstep); void Timer1_INTTest(void); uint8_t GetVAMPCNT(void); void ClearVAMPCNT(void); uint8_t GetVBATCNT(void); void ClearVBATCNT(void); #endif