赞
踩
a
在tim.h文件中可以找到如下四个函数:
- void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
- void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
- void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
- void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
这四个函数就是用来配置输出比较模块的,用结构体来初始化输出比较单元的。(需要掌握)OC(Output Compare)输出比较。
这四个函数用来配置上图绿色部分的模块,上图有输出比较单元4个,那么OC1,OC2,OC3,OC4,一个函数配置一个单元。
函数的第一个参数为选择定时器,第二个是结构体(就是输出比较的那些参数)。
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
此函数是用来给输出比较结构体赋一个默认值的,到这里,输出比较的配置就可以完成了。
接下来是一些小功能和运行时更改参数的函数,
- void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
- void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
- void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
- void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
这四个函数是用来配置强制输出模式的,若在运行中想要暂停输出波形并且强制输出高或者低电平,一般用得不多,因为强制输出高电平和占空比100%是一样的,低电平也是一样。
- void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
- void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
- void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
- void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
这四个函数是用来配置CCR寄存器的预装功能的,这个预装功能就是影子寄存器(就是你写入的值不会立即生效,而是在更新事件后才会生效,这样可以避免一些小问题)。这四个函数一般也不用,了解了解即可。
- void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
- void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
- void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
- void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
这四个函数是用来配置快速使能的,也了解了解即可。
- void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
- void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
- void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
- void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
- void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
- void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
- void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
这些函数是用来单独设置输出比较的极性的,带个N的就是高级定时器里互补通道的配置,OC4没有互补通道,所以没有OC4N的函数。
这些函数可以设置极性,结构体初始化的那个函数里也可以设置极性,这两个地方设置极性的作用是一样的,只不过是结构体初始化那个函数里是一起初始化的,在这里是一个单独的函数进行修改的。一般来说,结构体里的参数,都会有一个单独的函数可以进行更改,这里的函数就是用来单独更改输出极性的。
- void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
- void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
这两个函数是用来单独修改输出使能参数的。
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
这个函数意为选择输出比较模式,这个函数是用来单独更改输出比较模式的函数。
- void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
- void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
- void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
- void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
这四个函数是用来更改CCR寄存器值的函数,运行时更改占空比就需要这四个函数。
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
这个函数仅高级定时器使用,在使用高级定时器输出PWM时,需要调用这个函数,使能主输出,否则PWM将不能正常输出。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
打开时钟。(选择的是通用定时器)
TIM_InternalClockConfig(TIM3);
选择內部时钟。
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
- TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
时基单元初始化。
-
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCStructInit(&TIM_OCInitStructure);
- 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; //CCR
- TIM_OC1Init(TIM3, &TIM_OCInitStructure);
输出比较单元初始化。因为四个初始化函数,对应四个输出比较单元,所以需要初始化哪个通道就调用哪个函数,不同的通道对应的GPIO口也是不一样的,所以这里要按照你GPIO口的需求来,此处使用pB0口,对应第一个输出比较通道,所以使用TIM_OC1Init这个函数。初始化这个结构体时,有些参数我们是用不上的,比如说带个N的参数还有IdleState参数,这些参数都是高级定时器才用到。
计算占空比的公式。
此处可以看见TIM3_CH3是在PB0的引脚上输出的。
这一行函数是给结构体赋初始值。
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
启动定时器。
想让LED呈现呼吸灯的效果,就是不断的改变占空比,即改变CCR的值。在运行过程中更改CCR的值,需要用到TIM_SetCompare1函数,这个函数就是用来更改通道1的CCR的值的。
- void PWM_SetCompare1(uint16_t Compare)
- {
- TIM_SetCompare1(TIM3, Compare);
- }
这个函数就是更改CCR的值的。
在main.c里面不断调用这个函数就可以一直更改CCR了。
- uint8_t i;
-
- int main(void)
- {
- OLED_Init();
- PWM_Init();
-
- while (1)
- {
- for (i = 0; i <= 100; i++)
- {
- PWM_SetCompare1(i);
- Delay_ms(10);
- }
- for (i = 0; i <= 100; i++)
- {
- PWM_SetCompare1(100 - i);
- Delay_ms(10);
- }
- }
- }
此代码就可以实现呼吸灯的效果了。
如需完整代码,找我就好。(此篇文章是学习笔记)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。