首页 > 其他分享 >嵌入式——PWM

嵌入式——PWM

时间:2024-10-12 17:51:43浏览次数:10  
标签:TIM3 定时器 嵌入式 TIM GPIO PWM 时钟

本文主要介绍了什么是PWM,PWM的基本结构,PWM波的生成过程,如何用代码生成PWM波以及通过示波器观察生成的PWM波形。

前期准备:32芯片、示波器。

一、PWM的概念

1.引言

关于PWM,常听到的有“用示波器抓PWM波啊”“PWM的占空比”……这些都是啥,我很好奇,所以我去学习了PWM波,知道了什么是占空比、频率是什么、怎样用PWM实现呼吸灯、为啥提及PWM就会提到定时器……

2.PWM的概念

PWM:Pulse Width Modulation,脉冲宽度调制。如下图所示三种信号,皆为脉冲信号,脉冲是指电子技术中经常运用的一种像脉搏似的短暂起伏的电冲击(电压或电流)信号。PWM脉冲宽度调制是一种调制技术,用于控制输出(模拟)信号的平均值。如下图所示,在PWM中,信号由一系列固定周期的脉冲组成。脉冲的宽度表示信号的高电平时间,而周期表示脉冲的重复时间。通过改变脉冲的宽度与周期之间的比例,即占空比(占空比:高电平在一个脉冲周期之内所占的时间比),即改变高电平时间,可以模拟出不同的电压或功率级别,即控制信号的平均电压或功率。

3.PWM基本结构

要想通过单片机输出一个PWM波形需要两部分动作,如图上蓝框所示,一是时基单元,即TIM定时器,用于生成PWM信号,即计数和重装载,它只能发送PWM信号,并不能生成PWM波;二是输出比较单元GPIO端口,用于接收PWM信号,并通过GPIO口输出相应的高低电平信号,即PWM波。简单介绍一下大概过程:

1.首先选择可用于生成PWM的定时器,一般选择通用定时器,并配置好定时器的时钟频率CK_PSC。定时器的时钟频率来源有内部时钟模式、外部时钟模式2、外部时钟模式1和编码器模式,一般选择RCC内部时钟生成(其他用得较少,可自行CSDN),RCC内部时钟取决于定时器TIM挂载的总线的时钟频率,可通过时钟树查询(详情见嵌入式——时钟一文),一般为72MHz。

2.确定CK_PSC后,由PWM的频率计算公式,根据需要生成的PWM波的频率确定预分频值PSC和自动重装值ARR。预分频器PSC即对定时器的时钟频率进行分频,得到较小的所需的频率;自动重装器ARR即用于设置PWM波的周期,综合可得单个PWM波的频率/周期。

PWM的频率计算公式:Frequence=CK_PSC/(PSC+1)/(ARR+1)。

3.确定PSC和ARR后即确定了PWM波的周期,CNT为定时器自动计数值,它是自动增加的,当CNT增加到ARR即计数一个周期后会清零重新计数。同时,CNT会传递给输出比较单元与CCR进行比较确定输出高电平或低电平。

4.CCR捕获/比较器,CCR的值是自己确定的,它主要用于与计数值CNT作比较,当CNT<CCR时,输出高电平;当CNT≥CCR时,输出低电平(PWM模式1如此),此时即可得到PWM信号。所以,CCR是控制输出高电平值的参数,当CCR较大,则高电平占整个PWM周期的时间则较多,也就是占空比越大。故CCR决定了PWM波的占空比

5.得到PWM信号后,由输出比较单元通道传递给GPIO端口,进而输出PWM波,用示波器即可看到生成的PWM波形。一个定时器有4个输出比较单元。

二、PWM实操

利用单片机生成PWM波的步骤如下:

  1. 定时器时钟源选择,RCC开启时钟(TIM外设、GPIO外设)。

  2. 配置GPIO(把定时器PWM通道对应的GPIO口初始化为复用推挽输出)。

  3. 配置时基单元(PSC和ARR的值)。

  4. 配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)。

  5. 运行控制,启动计数器。

  6. 通过示波器连接GPIO口观察PWM波形(可选)。

以下代码均来自于国民N32G455芯片官方例程!不同芯片函数名可能会不同,但大抵是相似的。

1.选择定时器时钟源,开启TIM和GPIO的RCC时钟。

void RCC_Configuration(void) { 
    /* TIM3 clock enable */ 
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM3, ENABLE); 

    /* GPIOA and GPIOB clock enable */ 
    RCC_EnableAPB2PeriphClk( RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_GPIOC | RCC_APB2_PERIPH_AFIO, ENABLE); 
}

选择定时器3(TIM3)作为PWM波生成的时钟源,时钟频率为72MHz,开启TIM3和GPIO所挂载的总线的RCC时钟,TIM3挂载在APB1,GPIO挂载在APB2。

2.配置GPIO(把定时器PWM通道对应的GPIO口初始化为复用推挽输出)。

void GPIO_Configuration(void) { 
    GPIO_InitType GPIO_InitStructure; 
    /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */ 
    GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1; 
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
 }

TIM3所对应的4路PWM输出通道为CH1(PA6)、CH2(PA7)、CH3(PB0)、CH4(PB1),这四个GPIO口均配置为复用推挽输出模式。

3.配置时基单元(PSC和ARR的值)

/* Compute the prescaler value */ 
PrescalerValue = (uint16_t)(SystemCoreClock / 24000000) - 1; //5 
/* Time base configuration */ 
TIM_TimeBaseStructure.Period = 665; //ARR 
TIM_TimeBaseStructure.Prescaler = PrescalerValue; //PSC 
TIM_TimeBaseStructure.ClkDiv = 0; 
TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;//向上计数 
TIM_InitTimeBase(TIM3, &TIM_TimeBaseStructure);

PrescalerValue预分频值即为PSC,Period周期即为ARR,定时器计数模式为向上计数。

4.配置输出比较单元(CCR的值、输出比较模式、极性选择、输出使能)

/* PWM1 Mode configuration: Channel1 */ 
TIM_OCInitStructure.OcMode = TIM_OCMODE_PWM1; 
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; 
TIM_OCInitStructure.Pulse = CCR1_Val; //CCR1 
TIM_OCInitStructure.OcPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIM3, &TIM_OCInitStructure); 
TIM_ConfigOc1Preload(TIM3, TIM_OC_PRE_LOAD_ENABLE); 
/* PWM1 Mode configuration: Channel2 */ 
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; 
TIM_OCInitStructure.Pulse = CCR2_Val; //CCR2 
TIM_InitOc2(TIM3, &TIM_OCInitStructure); 
TIM_ConfigOc2Preload(TIM3, TIM_OC_PRE_LOAD_ENABLE); 
/* PWM1 Mode configuration: Channel3 */ 
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; 
TIM_OCInitStructure.Pulse = CCR3_Val; //CCR3 
TIM_InitOc3(TIM3, &TIM_OCInitStructure); 
TIM_ConfigOc3Preload(TIM3, TIM_OC_PRE_LOAD_ENABLE); 
/* PWM1 Mode configuration: Channel4 */ 
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; 
TIM_OCInitStructure.Pulse = CCR4_Val; //CCR4 
TIM_InitOc4(TIM3, &TIM_OCInitStructure); 
TIM_ConfigOc4Preload(TIM3, TIM_OC_PRE_LOAD_ENABLE); 
TIM_ConfigArPreload(TIM3, ENABLE);

CCR1、CCR2、CCR3、CCR4为定时器四个PWM输出通道的占空比。

5.运行控制,启动计数器

void TIM_Enable(TIM_Module* TIMx, FunctionalState Cmd) { 
    /* Check the parameters */ 
    assert_param(IsTimAllModule(TIMx)); 
    assert_param(IS_FUNCTIONAL_STATE(Cmd)); 
    if (Cmd != DISABLE) { 
        /* Enable the TIM Counter */ 
        TIMx->CTRL1 |= TIM_CTRL1_CNTEN; } 
    else { 
        /* Disable the TIM Counter */ 
        TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_CNTEN)); }
 }
  1. 通过示波器连接GPIO口观察PWM波形(可选)

由上图可知,

PWM波的频率为18.0184KHz。(Frequence=f=CK_PSC/(PSC+1)/(ARR+1)=72MHz/6/666=18.0180KHz)

PWM波的周期为55.50μs。(T=1/f=1/18018=55.5μs)

通道一(CH1)PWM波的占空比为50%。(333/665≈50%)

通道二(CH2)PWM波的占空比为37.38%。(249/665≈37.38%)

通道三(CH3)PWM波的占空比为24.91%。(166/665≈24.91%)

通道四(CH4)PWM波的占空比为12.44%。(83/665≈12.44%)

以上内容仅为个人学习分享,若有错误,敬请指正。

标签:TIM3,定时器,嵌入式,TIM,GPIO,PWM,时钟
From: https://blog.csdn.net/qq_51390570/article/details/142882849

相关文章

  • 理解嵌入式系统中ARM32架构下的电源管理单元(PMU)及节能模式-原理(上)
     电源管理单元(PowerManagementUnit,PMU)是现代电子设备尤其是嵌入式系统中不可或缺的一部分。PMU的主要任务是管理和分配电力资源,确保各个组件在正确的工作电压下运行,同时优化系统的整体能效。PMU通常包含多种功能模块,如稳压器(LDO或DC-DC转换器)、电池充电电路、电量监测电......
  • 第十章 嵌入式技术
    选择占2-4分,主要考察嵌入式基础知识和嵌入式设计1.嵌入式硬件1.1.嵌入式系统        嵌入式系统是以应用为中心,计算机技术为基础,将配置与可剪裁的软硬件集于一体的专用计算机系统。1.1.1.嵌入式系统组成1.1.2嵌入式系统的特性专用性强技术融合软硬一体软件为......
  • 被嵌入式行业毒打了一年半的我,悟了!
    大家好,我是小梁,一名刚毕业在嵌入式行业工作一年半的职场新人。昨天和大家探讨了一下对自己有所帮助的资料,想了下不如释放自己大学所搜集到的嵌入式资源,相信很多同学在学习和生活中都会遇到资料搜集的难题,而我也不例外。在这个过程中,我发现一些可以改变大学体验感的资源,主打一个......
  • 【STM32开发之寄存器版】(七)-PWM脉冲宽度调制
    一、前言PWM简介PWM(脉宽调制)是一种通过调节信号的脉冲宽度来控制功率输出的技术。其基本原理是保持固定频率的信号,将其高电平和低电平的持续时间调整,达到控制平均功率的目的。应用方面,PWM广泛用于电机控制、LED调光、音频放大、以及电源管理等领域,因为它能有效提高能效并减......
  • STM32f103c8t6中PWM的配置
    1、PWM简介    PWM波形(PulseWidthModulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字......
  • 51c嵌入式分享~三极管相关1
    一、PNP与NPN两种三极管使用方法  分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。    在单片机应用电路中三极管主要的作用就是开关作用。PNP与NPN两种三极管使用方法    上图中,横向左侧的引脚叫做基极b,有一个箭头的是发射极e,剩下的一个引脚就是集电......
  • 基于双闭环PI的SVPWM控制器simulink建模与仿真
    1.课题概述      基于双闭环PI的SVPWM控制器simulink建模。包括da转换为abc,abc转换为dq,clark变换模块,电路模块,PI控制器,SVPWM模块等核心模块。 2.系统仿真结果 3.核心程序与模型版本:MATLAB2022a  4.系统原理简介      基于双闭环PI的SVPWM控制器......
  • U3525友顺调节脉宽调制器PWM IC
    UTCU3525是一款脉宽调制器IC,设计用于提高开关电源的性能和应用减少外部部件的使用。一个关闭终端控制软启动电路和继电器输出级,通过PWM提供瞬时关断锁存与脉冲关闭,以及软启动循环与更长的关闭命令。输出级采用NOR逻辑,给出关闭状态的低输出。欠压闭锁电路;保持输出......
  • pwm模拟遥控器驱动电调控制无刷电机
    目录1.前言2.操作全程2.1输出pwm信号2.2硬件部分2.3电调校准3.启动4.总结1.前言我们小伙伴是不是都遇到到过我们的无刷电机买回来,上电,并且给了正确的pwm超,但是电机就是不转动。我也遇到了这个问题,不过最后还是让我蒙对了,哈哈。下面开始我们的操作。本人学识尚浅,如果......
  • 【星汇极客】单片机竞赛之嵌入式设计竞赛(持续更新)
    前言        本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。    暑假的时候参加了太多的比赛,作为队长要写代......