【STM32 标准库】PWM

1.PWM简介

   1.1 PWM

    脉冲宽度调制,即脉宽调制(Pulse Width Modulation,PWM)

对模拟信号进行数字编码;

输出为一连串高低电平的方波信号;

利用微处理器的数字输出实现对模拟电路的控制。

77ecc1e37d82444b84a8d3b55ee87fe0.png

 1.2 STM32F1 PWM

除基本定时器TIM6、TIM7之外都可以产生PWM输出(通用定时器可以产生4路PWM输出,高级定时器可以产生7路PWM输出)。

PWM:脉宽可调(占空比可调的方波信号),由TIMx_ARR寄存器确定频率TIMx_CCRx寄存器确定占空比决定。eb662e4e09bd452280ba0a1fa6fd6919.png

PWM输出模式:8种,常用2种(PWM1/PWM2)——边沿对齐(递增、递减)、中心对齐(先递增再递减)919c70d2c19446b7955424edec1e8a08.png

37371e3495884c3884fc823c0f6ae999.png

bedae692004e48edb6d9e660b7d1ee12.png

2.PWM配置

 2.1通用定时器PWM输出配置步骤

    (1)添加库文件:time.c;

    (2)使能定时器及端口时钟,并设置引脚复用器映射                       

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);71481c5d3cbc406f8554f65aeae7f663.png

  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;9f55efc885054f119383799b512d97bf.png

(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时钟:8ccfbfad2cbe406198565c09da864b63.png

(2)初始化定时器:6990a44775fb47638ceca2330b604ad6.png

 (3)初始化PWM

44dcf60f407246fbb170e1e7f9f77987.png

(4)使能TIMx在CCRx上的预装载寄存器、使能 TIMx 在 ARR 上的预装载寄存器允许位

5f1cf6f20f0b42a5817e46d599eb73a5.png

    (5)开启定时器6208770258be49a4b5690c2a83c4baee.png

 2.2.2 主函数

77052378d89b4df78a6d7e1853642c42.png

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);
    }
}

 

 

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值