PWM输出,可以用来做很多事情,呼吸灯,蜂鸣器,当然了最主要的还是 电机和舵机 控制了,主要通过的方式,就是改变占空比,当然就就可以模拟电压了! 学好这个,你就迈进了控制机器的门!!!
这里我用的开发板时正点原子的MiniSTM32,芯片型号为STM32F103RCT6. This is easy, so you can do that very easily!
- ***REMENBER STM32 is you! :)
接下来,还是一块一块代码进行分析,将其中的重点进行说明:
void pwm_Config(u16 period, u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = period-1; TIM_TimeBaseStructure.TIM_Prescaler = psc-1; TIM_TimeBaseStructure.TIM_ClockDivision= 0 ; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0;
Prescaler就是预分频,我们用的 TIM1 是72MHz的,有些控制是要求频率限制的,我们计算时PWM频率是这样的:假如我们需要1KHz的频率,1000的周期,那么我们需要输入的参数为 周期:1000, 预分频:72, 你会发现 频率*周期*预分频 就是72MHz。 接下来有个通俗的讲解,分频后TIM频率就是 1000KHz ,就是每秒振动1000K下,振动1000下一个周期,其中一个周期振动400下为低电平,振动600下为高电平,换算成时间就是 高电平:400/1000K 就是0.4ms 低电平: 600/1000K 就是0.6ms 一个周期为1ms 。
TIM_ClockDivision为时钟分割,一般的我们都为0,TIM_CounterMode 这个计数模式影响到后面PWM模式,一般的我们采用向上计数模式TIM_CounterMode_Up
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平。
TIM_OC1Init(TIM1,&TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); TIM_OC4Init(TIM1,&TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE); TIM_CtrlPWMOutputs(TIM1,ENABLE); TIM_Cmd(TIM1,ENABLE); }这里初始化 TM1得预装载,使能PWM输出,使能TIM1,这些都是常见得必须配置。
到这里整个初始化函数,就配置结束了,我们改变它得占空比,就可以通过
TIM_SetCompare4(TIM1,400); //通道4的比较值
是不是很简单啊!说实话,如果你是单片机创建者,考虑这些参数配置,其实都是很有必要的。
在这我又要为大家献上一首歌了,这首歌献给大一的我:格莱美-Stay with me-点击打开链接