STM32 定时器移相任意角度和占空比,频率可调
由于使用了中断修改翻转的CCR值,对于频率超250K以上不太适用.
void Motor1_Init(Motor MotorChValue)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_InitStructure;/*设置中断*/ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); /*时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd( MOTOR1_CLK | RCC_APB2Periph_AFIO, ENABLE);/*通道引脚*/ GPIO_InitStructure.GPIO_Pin = MOTOR1_A1_PIN | MOTOR1_B1_PIN | MOTOR1_A2_PIN | MOTOR1_B2_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(MOTOR1_A1_PORT, &GPIO_InitStructure);//初始化GPIOGPIO_InitStructure.GPIO_Pin = MOTOR1_A2_PIN | MOTOR1_B2_PIN; GPIO_Init(MOTOR1_A2_PORT, &GPIO_InitStructure);//初始化TIM3TIM_TimeBaseStructure.TIM_Period = 65535; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =72-1; //72分频,TIM3 = 1MhzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //1分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch1Value;TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC1TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch2Value;TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch3Value;TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC3TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch4Value;TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC4TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);TIM_SetCounter(TIM3,0);
// TIM_Cmd(TIM3, DISABLE); }void ConfigTimer(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;TIM_TimeBaseStructure.TIM_Period = (Fsys/2) / Fpwm;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * PWM_DUTY) / 100;TIM_OC3Init(TIM3,&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * (100-PWM_DUTY)) / 100;TIM_OC4Init(TIM3,&TIM_OCInitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_CtrlPWMOutputs(TIM3, ENABLE);TIM_Cmd(TIM3,ENABLE);
}