首页 >> 知识 >> stm32 tim8 同时输出4路PWM

stm32 tim8 同时输出4路PWM

//***************************定时器初始化***************************// // 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);  }    

网站地图