//---------------------------------------------------------------------------------------------------- void PWM_Init(void) { //电机 ftm_init_struct0.FTM_Ftmx = FTM0; //使能FTM0通道 ftm_init_struct0.FTM_Mode = FTM_MODE_PWM; //输出PWM模式 ftm_init_struct0.FTM_PwmFreq = 20000; //PWM频率18000Hz ftm_init_struct0.FTM_PwmDeadtimeCfg=DEADTIME_CH45|DEADTIME_CH67; //编码器 FTM1:A12 A13 ftm_init_struct1.FTM_Ftmx = FTM1; //只有FTM1和FTM2有正交解码功能 ftm_init_struct1.FTM_Mode = FTM_MODE_QD; //正交解码功能 ftm_init_struct1.FTM_QdMode = QD_MODE_PHAB; //AB相输入模式 //编码器 FTM2:A10 A11 ftm_init_struct2.FTM_Ftmx = FTM2; //只有FTM1和FTM2有正交解码功能 ftm_init_struct2.FTM_Mode = FTM_MODE_QD; //正交解码功能 ftm_init_struct2.FTM_QdMode = QD_MODE_PHAB; //AB相输入模式 LPLD_FTM_Init(ftm_init_struct0); LPLD_FTM_Init(ftm_init_struct1); LPLD_FTM_Init(ftm_init_struct2); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch4, 0, PTD4, ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch5, 0, PTD5, ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch6, 0, PTD6, ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch7, 0, PTD7, ALIGN_LEFT); LPLD_FTM_QD_Enable(FTM1, PTA12, PTA13);//右电机 LPLD_FTM_QD_Enable(FTM2, PTA10, PTA11);//左电机 }
void Motor_Init(void) { ftm_init_struct.FTM_Ftmx = FTM0; ftm_init_struct.FTM_Mode = FTM_MODE_PWM; ftm_init_struct.FTM_PwmFreq = 7500 ; LPLD_FTM_Init(ftm_init_struct); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch0, 0, PTC1, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch1, 0, PTC2, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch2, 0, PTC3, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch3, 0, PTC4, ALIGN_LEFT ); }
/* * 初始化FTM的PWM输出功能 * */ void pwm_init(void) { #if defined(CPU_MK60DZ10) || defined(CPU_MK60D10) ftm_init_struct.FTM_Ftmx = FTM0; //使能FTM0通道 ftm_init_struct.FTM_Mode = FTM_MODE_PWM; //使能PWM模式 ftm_init_struct.FTM_PwmFreq = 50; //PWM频率50Hz LPLD_FTM_Init(ftm_init_struct); LPLD_FTM_PWM_Enable(FTM0, //使用FTM0 FTM_Ch0, //使能Ch0通道 angle_to_period(0), //初始化角度0度 PTC1, //使用Ch0通道的PTC1引脚 ALIGN_LEFT //脉宽左对齐 ); #elif defined(CPU_MK60F12) || defined(CPU_MK60F15) ftm_init_struct.FTM_Ftmx = FTM2; //使能FTM0通道 ftm_init_struct.FTM_Mode = FTM_MODE_PWM; //使能PWM模式 ftm_init_struct.FTM_PwmFreq = 50; //PWM频率50Hz LPLD_FTM_Init(ftm_init_struct); LPLD_FTM_PWM_Enable(FTM2, //使用FTM0 FTM_Ch0, //使能Ch0通道 angle_to_period(0), //初始化角度0度 PTD0, //使用Ch0通道的PTD0引脚 ALIGN_LEFT //脉宽左对齐 ); #endif }
void pwm_init() { FTM_InitTypeDef ftm_init_struct={0}; ftm_init_struct.FTM_Ftmx = FTM0; //使能FTM0通道 ftm_init_struct.FTM_Mode = FTM_MODE_PWM; //使能PWM模式 ftm_init_struct.FTM_PwmFreq = 15000; LPLD_FTM_Init(ftm_init_struct); //FTM0 ch4右前 ch5右后 ch6左后 ch7左前 LPLD_FTM_PWM_Enable(FTM0,FTM_Ch4,0, PTD4,ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0,FTM_Ch5,0, PTD5,ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0,FTM_Ch6,0, PTD6,ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0,FTM_Ch7,0, PTD7,ALIGN_LEFT); }
void Motor_Init(void) { /* Initial motor pwm */ FTM_InitTypeDef motorInitStruct; motorInitStruct.FTM_Ftmx = FTM0; motorInitStruct.FTM_Mode = FTM_MODE_PWM; motorInitStruct.FTM_PwmFreq = MOTOR_FRE; motorInitStruct.FTM_PwmDeadtimeCfg = DEADTIME_CH01; motorInitStruct.FTM_PwmDeadtimeDiv = DEADTIME_DIV1; motorInitStruct.FTM_PwmDeadtimeVal = 0; LPLD_FTM_Init(motorInitStruct); /*----------left motor backward initial--------*/ LPLD_FTM_PWM_Enable(FTM0, FTM_Ch1, 0, MOTOR_LEFT_BACKWARD, //PTA4 ALIGN_LEFT ); /*----------left motor forward initial--------*/ LPLD_FTM_PWM_Enable(FTM0, FTM_Ch2, PWM_Expect, MOTOR_LEFT_FORWARD, //PTA5 ALIGN_LEFT ); /*----------right motor backward initial--------*/ LPLD_FTM_PWM_Enable(FTM0, FTM_Ch3, 0, MOTOR_RIGHT_BACKWARD, //PTA6 ALIGN_LEFT ); /*----------righ motor forward initial--------*/ LPLD_FTM_PWM_Enable(FTM0, FTM_Ch4, PWM_Expect, MOTOR_RIGHT_FORWARD, //PTA7 ALIGN_LEFT ); }
status ftm_pwm_init(mypwm *pwm, uint32 FTM_PwmFreq, uint32 duty) { pwm_init_struct.FTM_Ftmx = pwm->FTM_Ftmx; //使能FTM1通道 pwm_init_struct.FTM_Mode = FTM_MODE_PWM; //使能PWM模式 pwm_init_struct.FTM_PwmFreq = FTM_PwmFreq; //PWM频率100Hz pwm_init_struct.FTM_PwmDeadtimeCfg = DEADTIME_CH01; pwm_init_struct.FTM_PwmDeadtimeDiv = DEADTIME_DIV16; pwm_init_struct.FTM_PwmDeadtimeVal = 63; if( LPLD_FTM_Init(pwm_init_struct) && \ LPLD_FTM_PWM_Enable(pwm->FTM_Ftmx, //使用FTM1 pwm->chn, //使能Ch1通道 duty, //初始化角度30度 pwm->pin, //使用Ch1通道的PTD1引脚 ALIGN_LEFT //脉宽左对齐 ) ) { return SUCCESS; } else { return ERROR; } }
/* * === FUNCTION ====================================================================== * Name: Motor_Set * Description: Set PWM to Motor * ===================================================================================== */ void Motor_Set(INT32S pwm,INT8U dir)// Called by Strategy Controller . Called Routine. { //Dead Area fixed if(pwm > 0 && dir == MOTOR_LEFT ) pwm +=900; if(pwm < 0 && dir == MOTOR_LEFT ) pwm -=850; if(pwm > 0 && dir == MOTOR_RIGHT) pwm +=750; if(pwm < 0 && dir == MOTOR_RIGHT) pwm -=700; if(pwm >=10000) pwm = 10000; if(pwm <= -10000) pwm = -10000; if(MOTOR_LEFT == dir) { if(pwm>0) { LPLD_FTM_PWM_Enable(FTM0, FTM_Ch0, pwm, PTC1, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch1, 0, PTC2, ALIGN_LEFT ); } else { LPLD_FTM_PWM_Enable(FTM0, FTM_Ch0, 0, PTC1, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch1, -pwm, PTC2, ALIGN_LEFT ); } } else { if(pwm>0) { LPLD_FTM_PWM_Enable(FTM0, FTM_Ch2, 0, PTC3, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch3, pwm, PTC4, ALIGN_LEFT ); } else { LPLD_FTM_PWM_Enable(FTM0, FTM_Ch2, -pwm, PTC3, ALIGN_LEFT ); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch3, 0, PTC4, ALIGN_LEFT ); } } }