前言
脉冲宽度调制(pwm),能够以数字信号(方波)等效输出模拟信号。常用于驱动舵机、电机等场景。也是智能车的基础理论之一。
一、PWM理论
pwm通过调整高电平和低电平的占比,来模拟输出正弦波形,可以用于控制电机。
需要用到参数:
Freq(频率)=CK_PSC/(PSC+1)/(ARR+1)
Duty(占空比)=CCR/(ARR+1)
Reso(分辨率)=1/(ARR+1)
其中:
CK_PSC:单片机频率(在stm32中,CK_PSC即为72MHZ)
PSC:预分频器
ARR:自动重装器
CCR:捕获比较器
配置流程
- 开启单片机时钟
- 配置时基单元
- 配置输出比较单元
- 配置GPIO
二、代码分析
1.头文件pwm.h
本段就是定义一下用到的函数,不做过多解释。
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare1);
#endif
2.pwm.c
配置时钟
开启TIM和GPIO配置的时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
配置时基单元&&输出比较单元
这里开始配置时基单元。
TIM_InternalClockConfig(TIM2);//TIM2时钟开启
//TIM2配置
//时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//TIM结构体定义并配置参数
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(TIM2, &TIM_TimeBaseInitStructure);
//输出比较单元
//TIM2 OC2通道配置
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_OCInitTypeDef TIM_OCStructure;//通道结构体定义,配置参数
TIM_OCStructInit(&TIM_OCStructure);//初始化结构体
TIM_OCStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCStructure.TIM_Pulse=0;//CCR
TIM_OC2Init(TIM2,&TIM_OCStructure);
TIM_Cmd(TIM2, ENABLE);//TIM使能
配置GPIO
这里就是配置GPIO的输出了,也是通过这个来输出pwm信号,就不多说哩。
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
总结
pwm输出好像就这些?具体的参数还请见tim配置文件hhh,一般pwm用这些参数就够了。