一、OC(Output Compare)输出比较
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能
PWM简介
PWM(Pulse Width Modulation)
脉冲宽度调制在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
PWM参数: 频率 = 1 / TS 占空比 = TON / TS 分辨率 = 占空比变化步距
通过占空比的大小改变模拟电压的大小。
通用定时器输出结构
输出比较模式
主要使用PWM模式1,向上计数。
PWM基本结构
参数计算 舵机简介
直流电机简介
二、代码部分
1、呼吸灯
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);//给结构体一个初始化的值(不使用的参数不用列出并赋值)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
设置CCR值
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);
}
通过设置CCR的值来改变PWM波的占空比/
使用重映射功能改变输出引脚
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能AFIO时钟以进行重映射
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//将所要使用的引脚重映射
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//解除调试功能,将对应引脚改为默认的I/O口
GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
Changes the mapping of the specified pin.
2、PWM驱动舵机
void PWM_SetCompare2(uint16_t Compare)//设置CCR的值
{
TIM_SetCompare2(TIM2, Compare);
}
void Servo_SetAngle(float Angle)
{
PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
通过角度与CCR值的关系直接设置CCR值。
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
uint8_t KeyNum;
float Angle;
int main(void)
{
OLED_Init();
Servo_Init();
Key_Init();
OLED_ShowString(1, 1, "Angle:");
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
Angle += 30;
if (Angle > 180)
{
Angle = 0;
}
}
Servo_SetAngle(Angle);
OLED_ShowNum(1, 7, Angle, 3);
}
}