PWM驱动
PWM
1. PWM驱动LED呼吸灯
来看一下必需掌握的结构体:
TIM_OCInitTypeDef结构体: 定义了定时器的输出比较模式、输出比较状态、输出比较极性、输出比较值、输出比较极性、输出比较空闲状态。
这个结构体经常用来配置PWM,具体的参数如下:
typedef struct
{
uint16_t TIM_OCMode; // 输出比较模式(PWM/翻转/强制等)
uint16_t TIM_OutputState; // 主输出通道使能(ENABLE/DISABLE)
uint16_t TIM_OutputNState; // 互补输出通道使能(高级定时器用)
uint16_t TIM_Pulse; // 比较值(决定PWM占空比或触发时机)
uint16_t TIM_OCPolarity; // 主输出通道极性(高电平有效/低电平有效)
uint16_t TIM_OCNPolarity; // 互补输出通道极性(高级定时器用)
uint16_t TIM_OCIdleState; // 空闲状态下主输出电平(刹车/停机时)
uint16_t TIM_OCNIdleState; // 空闲状态下互补输出电平(刹车/停机时)
} TIM_OCInitTypeDef;
示例初始化代码:
void PWM_Example_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // AFIO时钟使能
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); // GPIOA0映射到TIM2_CH1
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); // 禁止JTAG
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2); // 内部时钟配置(选择是内部还是外部的时钟源)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseStructure.TIM_Period = 100-1; // ARR
TIM_TimeBaseStructure.TIM_Prescaler = 720-1;// PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器的值
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化定时器
TIM_OCINitTypeDef TIM_OCInitStructure; //初始化比较单元
TIM_OCStructInit(&TIM_OCInitStructure);// 传入结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 设置比较单元的模式为PWM1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 比较单元输出极性为高电平有效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 比较单元输出使能,我们这里是驱动呼吸灯不需要高级定时器,否则需要用TIM_OCNPolarity
TIM_OCInitStructure.TIM_Pulse = 0; // 比较单元的初始占空比为0,CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 初始化比较单元1
TIM_Cmd(TIM2, ENABLE); // 使能定时器
}
void PWM_SetCompare1(uint16_t Compare){
TIM_SetCompare1(TIM2, Compare); // 设置比较单元1的比较值
}
2. PWM驱动舵机
舵机的频率一般为频率为50HZ,也就是一个20ms左右的时基脉冲。所以上面的分频和周期改改就好了。
3. PWM驱动直流电机
首先我们需要捕获一下编码器的数据。也就是读取电机的速度。