1、PWM
1.1 简介
PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。
PWM的参数: 频率 , 占空比 分辨率 = 占空比变化步距
以单片机为例,单片机的 IO 口输出的是数字信号,IO口只能输出高电平和低电平
电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。
PWM的调节作用来源于对“占周期”的高电平时间控制,“占周期”变长,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变短,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降。
因此:在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压
2.1 定时器的PWM模式实现
将TIM的输出比较模式设为PWM1,当计数器CNT开始计数时有以下两种模式:
向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平
向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平
因此可以实现上述的PWM的功能。
2、PWM实现
2.1 步骤
1、 RCC 初始化开启时钟 ——> 需要使用的TIM和GPIO的外设工作时钟都打开,
2、 初始化GPIO,将PWM对应的GPIO口,初始化为复用推挽输出,
3、 选择定时器的时基单元的时钟源、配置时基单元,
4、 配置输出比较单元(OC):包括输出比较模式、极性选择、输出使能,CCR的值、
5、 定时器使能,运行控制
2.2 程序实现
void PWM_TIM1_Init(uint16_t PSC, uint16_t PRE)
{
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//初始化TIM
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Prescaler = PSC - 1; //PSC:预分频器,即PSC的值
TIM_TimeBaseInitStruct.TIM_Period = PRE - 1; //ARR:计数周期,即ARR的值
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
//初始化OC
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct); //结构体初始化,若结构体没有完整赋值。
//则最好执行此函数,给结构体所有成员都赋一个默认值
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出的极性
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //输出的状态:使能 或 失能
TIM_OCInitStruct.TIM_Pulse = 0;//初始的CCR值
TIM_OC1Init(TIM1, &TIM_OCInitStruct); //配置PWM的输出通道
TIM_OC4Init(TIM1, &TIM_OCInitStruct);
//配置PWM输出
TIM_CtrlPWMOutputs(TIM1, ENABLE); //仅在高级定时器使用, 输出PWM时需要调用这个函数,
//使能输出
//OC--pre-load-config--使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //自动装载
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //
TIM_ARRPreloadConfig(TIM1, ENABLE); //ARR
TIM_Cmd(TIM1, ENABLE);
}
3、实现功能
3.1 LED呼吸灯
设置对应的GPIO口的模式
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_Initstructure;
GPIO_Initstructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_Initstructure);
}
在主函数中调用PWM的初始化函数:设置预分频PSC为7200,计数周期为100,
通过调用下面的函数来设置定时器的(捕获比较寄存器)CCR的值,来调节输出的PWM波的占空比。
TIM_SetCompare1(TIM1, compare);//设置CCR的值
当compare的值递减或递加时CCR的值发生变化,即可实现呼吸灯的功能。
3.2 控制舵机
舵机是一种根据输入 PWM 信号占空比来控制输出角度的装置
输入 PWM 信号要求:周期为 20ms ,高电平宽度为 0.5ms~2.5ms
根据舵机的输入要求将其周期扩大10倍,则调用PWM初始化函数设置PSC为7200,ARR为200
所其CCR设置的范围为 5~25 的范围内,因此调用下列函数,设置CCR,
TIM_SetCompare1(TIM1, compare);//设置CCR的值
输入compare = Angle / 180 * 20 + 15。
Angle为舵机的输出轴转角。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_51328875/article/details/143414145
|