//***************************定时器初始化***************************//
// TIM_Period / Auto Reload Register(ARR) = 1000 TIM_Prescaler--71
//arr:自动重装寄存器,psc分频系数
//PWM的频率 = 72MHz/ARR/PCS 例如 20K = 72M/3600/1 = 20K
void Timer_PWM_Init(u32 arr,int psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr-1;//自动重新装载寄存器周期的值澹ㄥ计数值澹)
TIM_TimeBaseStructure.TIM_Prescaler = psc;//时钟分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//对外部时钟进行采样的时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//参数初始化
TIM_ClearFlag(TIM8, TIM_FLAG_Update);
TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
//TIM_Cmd(TIM8, ENABLE);//启动定时器
}
//***************************PWM频率及占空比初始化***************************//
//=====初始化PWM 20KHZ 高频可以防止电机低频时的尖叫声
//TIM8 输出PWM控制四个电机
//CH1--PC6,CH2--PC7,CH3--PC8,CH4--PC9
//PC6控制PWMA--left moto,PC7控制PWMB--right moto 前部两个电机
//PC8控制PWMA--right moto,PC9控制PWMB--left moto 后部两个电机
// ARR= 3599 时频率为20Khz
//arr:自动重装寄存器,psc分频系数
//PWM的频率 = 72MHz/ARR/PCS 例如 20K = 72M/3600/1 = 20K
//************************************************************************//
void MOTO_PWM_Init(u32 arr, int psc)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//配置pwm输出端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//初始化定时器
Timer_PWM_Init(arr,psc);//Init timer8
//设置通道1 pwm参数
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //占空比初始化
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);
//PWM1 Mode configuration: Channel2
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
//PWM1 Mode configuration: Channel3
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);
//PWM1 Mode configuration: Channel4
TIM_OC4Init(TIM8, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);
TIM_CtrlPWMOutputs(TIM8,ENABLE);
TIM_ARRPreloadConfig(TIM8, ENABLE);//启动自动重装
TIM_Cmd(TIM8, ENABLE);//启动定时
}
//***************************占空比调节***************************//
//占空比 = TIMx_CCRx / TIMx_ARR
//moto_lq:左前轮电机,moto_rq:右前轮电机. 数值 0-100
//***************************占空比调节***************************//
void MOTO_Q_PWM_Out(u16 moto_lq, u16 moto_rq)
{
TIM_SetCompare1(TIM8,moto_lq);
TIM_SetCompare2(TIM8,moto_rq);
}
//***************************占空比调节***************************//
//占空比 = TIMx_CCRx / TIMx_ARR
//moto_rh:右后轮电机,moto_rq:右前轮电机. 数值 0-100
//***************************占空比调节***************************//
void MOTO_H_PWM_Out(u16 moto_lh, u16 moto_rh)
{
TIM_SetCompare3(TIM8,moto_lh);
TIM_SetCompare4(TIM8,moto_rh);
}