简介
输出比较简介
OC(Output Compare)输出比较【IC(Input Compare)输入捕获;CC(Capture Compare)输入捕获和输出比较的单元】
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1或0或翻转的操作,用于输出一定频率和占空比的波形。
PWM简介
PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,使被调对象不断地变化,LED灯亮灭,亮灭;电机转停,转停来实现LED亮度调节或者速度调节
PWM参数:
频率=1/Ts 占空比=Ton /Ts(高电平比上总时间) 分辨率=占空比变化步距
输出比较通道
输出比较通道(通用)
通道的打通线路:输出模式控制器会改变OC1ref(reference 参考信号)信号的高低电平,然后信号的主要去向是前往极性选择TIMx_CCER,给其写0时,则信号走上面一路,信号不翻转;写1时,信号走下面,通过一个非门取反。
控制输出模式寄存器的寄存器配置图:
有效电平可以理解为高电平,无效电平可以理解为低电平
PWM模式2即为PWM模式1的取反
图例是PWM模式1的寄存器配置
相关函数
*用结构体初始化输出比较单元(Output Compare)
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);
给输出比较函数赋一个初始值(在配置结构体函数时,要给其成员赋初始值,防止因未配初始值,而使其成员被系统随机赋值,后续程序运行出现问题。(例如在配置通用定时器时,定义的结构体里有高级定时器的成员,有些是用不到的,频繁配置比较麻烦,所以选择只列出来需要用到的,这时其他的成员就需要一个初始值))
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
配置强制输出模式(了解即可,因为强制输出高电平即占空比100%,低电平同理)
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);
配置CRR寄存器预装功能(即影子寄存器,写入的值不会立即生效,在更新事件才会生效)
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);
单独更改输出极性
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);
*单独更改CCR寄存器值的函数
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);
#在使用高级定时器时需要配置此函数
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
使得输出使能
#配置引脚时,要将引脚配置成复用推挽输出。将引脚控制权交给片上外设。
引脚重映射
以配置以下三个函数为例
* RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE ); //重映射的时钟开启
* GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2 , ENABLE); //重映射引脚
*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //解除调试端口
如果想要相关引脚当做GPIO使用,则用一、三句,先打开AFIO时钟,再用AFIO将JTAG复用解除;如果想要重映射定时器又或者其他外设的复用引脚,用一、二句,先打开AFIO时钟,在用AFIO重映射外设复用的引脚;若重映射的引脚正好是调试端口,则三句都用。