这是一个pwm的原理图,对于pwm其实就是一个定时器自我计数,并与我们自己设定的值比较,最终得出高低电平,从而产生有规律的波形
其中ARR是计数的最大值,CCRX是我们自己设定的比较值
定时器pwm有向上,向下计数,有pwm1,pwm2模式,有输出极性高低的选择
1.配置rcc
2.配置gpio复用为定时器
3.设置定时器pwm的模式并使能
(1)PWM模式1- 在向上计数时,一旦TIMx_CNT
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
PWM模式2- 在向上计数时,一旦TIMx_CNT
在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
(2)有效电平是通过TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_x来设置的,x可以为high,也可以为low
我自己的疑惑是,我设定的TIM_SetCompare1(TIM14,3000); 很高,但是电机却转的很慢,当我尝试把TIM_SetCompare1(TIM14,200); 时
我电机就变快了,这就是因为pwm模式的设定出了问题
void TIM14_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM14);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //我选择了向上计数
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择了pwm1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性是低电平
TIM_OC1Init(TIM14, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14,ENABLE);
TIM_Cmd(TIM14, ENABLE);
}
//我选择了向上计数
//选择了pwm1模式
//输出极性是低电平
当我输出较大的设定值ccrx,那么以为是pwm1,向上计数,所以当cnt
所以,当cnt
就会是的低电平占的比例大,那么电机就转的慢了
,,这是一个pwm的原理图,对于pwm其实就是一个定时器自我计数,并与我们自己设定的值比较,最终得出高低电平,从而产生有规律的波形,这是一个pwm的原理图,对于pwm其实就是一个定时器自我计数,并与我们自己设定的值比较,最终得出高低电平,从而产生有规律的波形,这是一个pwm的原理图,对于pwm其实就是一个定时器自我计数,并与我们自己设定的值比较,最终得出高低电平,从而产生有规律的波形