【STM32标准库】PWM功能详解
1.PWM简介
1.1 PWM
脉冲宽度调制,即脉宽调制(Pulse Width Modulation,PWM):
对模拟信号进行数字编码;
输出为一连串高低电平的方波信号;
利用微处理器的数字输出实现对模拟电路的控制。
1.2 STM32F1 PWM
除基本定时器TIM6、TIM7之外都可以产生PWM输出(通用定时器可以产生4路PWM输出,高级定时器可以产生7路PWM输出)。
PWM:脉宽可调(占空比可调的方波信号),由TIMx_ARR寄存器确定频率和TIMx_CCRx寄存器确定占空比决定。
PWM输出模式:8种,常用2种(PWM1/PWM2)——边沿对齐(递增、递减)、中心对齐(先递增再递减)
2.PWM配置
2.1通用定时器PWM输出配置步骤
(1)添加库文件:time.c;
(2)使能定时器及端口时钟,并设置引脚复用器映射
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //配置GPIO重映射功能
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
(3)初始化定时器参数,包含自动重装值,分频系数,计数方式等
void TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
(4)初始化PWM输出参数,包含PWM模式、输出极性,使能等
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{
注:通用定时器输出PWM只用设置以下4个参数,其他为高级定时器使用
uint16_t TIM_OCMode; //比较输出模式:8种(常用2种,PWM1/PWM2)
uint16_t TIM_OutputState; //比较输出使能
uint16_t TIM_OutputNState;
uint32_t TIM_Pulse; //脉冲宽度设置
uint16_t TIM_OCPolarity; //输出极性
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
(5)开启定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
(6)修改TIMx_CCRx的值控制占空比
void TIM_SetComparex(TIM_TypeDef* TIMx, uint32_t Compare1);
(7)使能TIMx在CCRx上的预装载寄存器
void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
(8)使能 TIMx 在 ARR 上的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);//配置高级定时器
2.2 配置流程
2.2.1 初始化函数
(1)使能定时器、GPIO端口及其复用IO时钟:
(2)初始化定时器:
(3)初始化PWM
(4)使能TIMx在CCRx上的预装载寄存器、使能 TIMx 在 ARR 上的预装载寄存器允许位
(5)开启定时器
2.2.2 主函数
3.硬件设计
4.软件设计
4.1 功能描述
本章所要实现的功能是:通过 TIM3 的 CH2 输出一个 PWM 信号,控制 DS0 指示灯由暗变亮,再由亮变暗,类似于人的呼吸。
4.2 软件实现
(1)初始化PWM
// -------------------------1.初始化PWM-------------------------------------
/* ---------------------------------函数声明-------------------------------------
*函数名称:TIM3_CH2_PWM_Iint(u16 per, u16 psc)
*输入参数:u16 per:自动重装载值;u16 psc:预分频系数
*返回参数:无
*功 能:初始化PWM,使用TIM3的通道2输出PWM
*作 者:lph
*日 期:2024/03/27
------------------------------------------------------------------------------ */
void TIM3_CH2_PWM_Iint(u16 per, u16 psc)
{
//1.1使能定时器及端口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//1.2初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = LED0_GPIO_Pin;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED0_GPIO_PORT, &GPIO_InitStruct);
//1.3设置引脚复用器映射
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//2.初始化定时器参数,包含自动重装值,分频系数,计数方式等
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_Period=per;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
//3.初始化PWM输出参数,包含PWM模式、输出极性,使能等
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//5.使能TIMx在CCRx上的预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
//6.使能 TIMx 在 ARR 上的预装载寄存器允许位
TIM_ARRPreloadConfig(TIM3, ENABLE);
//4.开启定时器
TIM_Cmd(TIM3, ENABLE);
}
(2)主函数
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "system.h"
#include "LED.h"
#include "SysTick.h"
#include "PWM.h"
/* 主函数main() --------------------------------------------------------------*/
int main()
{
// 自定义变量
u16 i=0; // CCR:占空比
u8 diretion=0; // 方向:变亮或者变暗
// 初始化
SysTick_Iint(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断分组
LED_Init();
TIM3_CH2_PWM_Iint(500, 72 - 1); //2K Hz, 0.5ms
while(1)
{
// PWM呼吸灯主程序
if(diretion==0)
{
i++;
if(i==300)
{
diretion=1;
}
}
else
{
i--;
if(i==0)
{
diretion=0;
}
}
TIM_SetCompare2(TIM3, i);
delay_ms(10);
}
}
作者:微风の清风