第一 : 用STM32高级定时器1控制伺服直流电机
///////////////////////////////////////////
//定时器1PWM初始化 共4路可变掌控比/////////
//输入参数PWM1/2/3/4掌控比参数30000-60000//
//////////////////////////////////////////
void TIM1_PWM(unsigned int PWM1_Val,unsigned int PWM2_Val,unsigned int PWM3_Val,unsigned int PWM4_Val )
{
vu16 CCR1_Val = PWM1_Val;
vu16 CCR2_Val = PWM2_Val;
vu16 CCR3_Val = PWM3_Val;
vu16 CCR4_Val = PWM4_Val;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 , ENABLE); //打开相应的定时器时钟和复用推挽输出对应I/O口时钟
//这里是定时器对应的是TOP值是60000
TIM_TimeBaseStructure.TIM_Period = 60000;//计数器向上最大计数到65535后产生更新事件,计数值归零
TIM_TimeBaseStructure.TIM_Prescaler = 2; //设置预分频器分频系数2 TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置了时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;//PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM输出比较极性
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;//配着相对应的I/O
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转频率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//比较数
TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化定时1
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);//初始化定时1
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);//初始化定时1
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);//初始化定时1
TIM_Cmd(TIM1, ENABLE);//使能定时器
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
在这个函数中我已经把STM32定时器输出PWM的模板写好了,你可以去改进也可以去深入的学习,即使有了程序还是不够的,你必须了解定时器工作的原理和它为什么能达到这样的效果,不然你仅仅只会使用而不能得心应手把它很好应用到你自己的项目中。
对于定时器你去学习单片机时肯定会遇到的一个很重要的问题,在视频教学里面有很多的讲解和看法,在这里我也来说说自己的看法。
定时器我认为就是一个只要你使能它,它就一直在计数的一个16位的计数器,从0到65535,当你配置了相应的定时器模式、TOP值、匹配值时,它就会在计数到相应的位置产生中断或者从新计数也就是说发生更新事件。就拿输出PWM来做解释,在上面我设定了TOP值为60000,设置了为PWM2模式,使定时器的输出极性为低。通俗的说就是当我在主函数中配置该定时器时,高级定时器TIM1就会启动,这里如果我设定比较值为30000,那么定时器一直计数,从0开始对应的I/O口为高电平,一旦定时器计数到30000,对应I/O口出现下降沿,电平发生改变,从高电平转变成低电平,然后计数到60000,定时器出现更新事件,对应的I/O出现上升沿,电平发生改变,从低电平转变成高电平。由此反复,从而形成50%占空比的PWM,这个函数可以自定义占空比,但是不能改变频率。
这里我只是很随意的讲解了定时器的比较简单的应用,如果你想深入的了解,就一定要去看芯片手册,看懂它,熟透它,只有这样你才能对它使用的得心应手,如果想做好就一定要去努力。
当然定时器的时钟这块很是重要,也可以说STM32的时钟树是一定要了解,精通和熟透的东西,在这个我不讲解,在后面的过程中我会用一个比较大的篇幅去讲解STM32时钟树,还有一些我自己的看法。
希望能对有些初入的学者有所帮助,我也是记录我自己的学习历程,一起努力。