在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现。本文我们将说明如何通过LL库实现PWM信号的输出。

1、概述

我们知道STM32的TIM计时器可以输出PWM信号,这测我们也采用STM32F030F4中的TIM3通用计时器来实现我们想要的功能。TIM3通用计时器由一个16位的自动重新加载计数器组成,由一个可编程的预定标器驱动。其结构如下图所示:

它可以用于各种目的,包括测量输入信号的脉冲长度(输入捕获)或生成输出波形(输出比较和PWM)。使用定时器预标量和RCC时钟控制器预标量,输出的PWM脉冲长度和波形周期可以调整从几微秒到几毫秒。我们这里实现一个占空比0%到100%可调,频率为200Hz的PWM波形。

2、TIM配置

我们在使用TIM3输出PWM波,我们必须对其进行相应的配置。关于TIM3的配置我们需要关注:TIM3控制寄存器1 (TIM3_CR1)、TIM3预置寄存器(TIM3_PSC)、TIM3自动重载寄存器(TIM3_ARR)以及对应通道的捕获比较寄存器。

首先来看一看TIM3控制寄存器1 (TIM3_CR1),这个寄存器用于配置TIM计时器。其结构如下:

对于TIM3控制寄存器1 (TIM3_CR1)我们主要需要说一下计数器使能(CEN)位。而其它的位通过初始化函数设置就可以了。

TIM3预置寄存器(TIM3_PSC)用以配置TIM计数器的工作频率,这个工作频率的计算是:psc的工作频率/(psc的值+1)。其结构如下:

TIM3自动重载寄存器(TIM3_ARR)用以配置输出PWM波的频率或者说周期。因为这个值就是计数器的计数周期。其结构如下:

我们设置了技术器的时钟频率,计数的周期,要想得到PWM波,我们还需要告诉TIM一个占空比。关于占空比实际上是在捕获比较寄存器中设置的。

3、PWM实现

我们已经如何通过配置TIM得到PWM波形输出,我们接下来就是通过软件来实现我们的想法。其配置代码如下:

/* TIM3 初始化配置 */
static void TIM3_Init_Configuration(void)
{LL_TIM_InitTypeDef TIM_InitStruct = {0};LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};LL_GPIO_InitTypeDef GPIO_InitStruct = {0};/* TIM3时钟使能 */LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);/* TIM3初始化配置 */TIM_InitStruct.Prescaler = 47;TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;TIM_InitStruct.Autoreload = TIMPERIOD;TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;LL_TIM_Init(TIM3, &TIM_InitStruct);LL_TIM_DisableARRPreload(TIM3);LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH4);TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;TIM_OC_InitStruct.CompareValue = 0;TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH4);LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);LL_TIM_DisableMasterSlaveMode(TIM3);/* TIM使用GPIO时钟使能 */LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);/* TIM3 GPIO配置:PB1   ------> TIM3_CH4 */GPIO_InitStruct.Pin = LL_GPIO_PIN_1;GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;GPIO_InitStruct.Alternate = LL_GPIO_AF_1;LL_GPIO_Init(GPIOB, &GPIO_InitStruct);LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH4);LL_TIM_EnableCounter(TIM3);
}

在这段配置代码中,有几个值需要说一下。Prescaler 值我们设为47,所以在48MHz的系统时钟下,TIM计数器的工作频率就是1MHz。Autoreload 的值我们设为了5000,所以可以得到PWM的频率为200Hz。CompareValue值设为了0,所以我们只能得到占空比为0%的PWM。若我们想要得到占空比为50%的PWM,则CompareValue值应设为2500才行。配置完成后各寄存器的值如下图所示:

这要得到的只是固定占空比的PWM波,若想动态修改占空比则需要修改捕获比较寄存器的值。使用函数LL_TIM_OC_SetCompareCH4(TIM3,pulse)就可以了,其中pulse是处于0到Autoreload 的值的整数。

4、总结

我们通过上述操作,就实现了基于LL库的PWM波的输出。我们将代码下载到目标板,并修改占空比和监视器波形输出。

上图是占空比为50%的波形图。

上图是占空比为20%的波形图。

上图是占空比为80%的波形图。

欢迎关注:

STM32F0使用LL库实现PWM输出相关推荐

  1. STM32F0库函数初始化系列:PWM输出

    void TIM1_Configuration(void) {TIM_TimeBaseInitTypeDef TIM_Time1BaseStructure;TIM_OCInitTypeDef TIM_ ...

  2. 【STM32】HAL库——定时器PWM输出

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  3. 【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  4. 树莓派用WiringPi和Bcm2835库和PCA9685输出PWM

    文章目录 1.前言 2.Bca2835发生PWM 3.WiringPi发生PWM 3.1 硬件PWM 3.2 软件PWM-Software PWM Library 4.外接PCA9685输出PWM 4 ...

  5. 树莓派输出pwm波c语言,树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

    树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 一:pigpio库简介 pigpio是一个用于树莓派的库 ...

  6. STM32 TIM PWM中阶操作:互补PWM输出

    STM32 TIM PWM中阶操作详解:互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用,功能包括单线/非互补PWM输出,双线/互补PWM输出,以及死区时间和刹车控制等. 实际 ...

  7. arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  8. 基于STM32F03RCT的多路频率占空比可调PWM输出

    基于STM32F03RCT的多路频率占空比可调PWM输出 1. 准备 1.1. 硬件 1.2. 软件 2. 基础知识 3. CubeMX配置 3.1. 通用配置 3.2. 定时器配置及初始化代码生成 ...

  9. 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码

    树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 文章目录 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一. Servo Driver ...

最新文章

  1. MS SQL “ 无法启动分布式事务“问题的解决思路
  2. 供应链金融与区块链技术-可以研读
  3. XML到Avro的转换
  4. ANSI X9.9 MAC算法介绍
  5. 方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?
  6. 利用JavaScript实现简单的下拉菜单
  7. html的搜索框代码怎么写_网站新闻怎么写才能被搜索引擎收录?
  8. QTP 自动化测试--定义变量
  9. Maven自动压缩脚本 和 样式文件配置
  10. 放之四海皆适用的设计原则(一)
  11. MindManager的例图资源
  12. 【php更换数据库为orcle】phpstudy+orcle
  13. python实现拼多多自动回复_拼多多客服多开工具怎么配置多店铺客服?
  14. Head First中文版教程
  15. 一文读懂什么是聚合支付
  16. t3服务器一登录就运行时错误,用友T3软件登陆系统管理提示运行时错误3709
  17. u盘复制一直正在计算机,解决U盘复制文件时电脑总是重启的方法
  18. Peer-to-Peer Sockets 工程入门
  19. OJ期末刷题 问题 B: 求三角形面积-gyy
  20. LeetCode:838. 推多米诺————中等

热门文章

  1. 星地融合→→→6G移动通信关键技术的未来
  2. 请求转发与重定向的区别和执行流程
  3. promise ,async 小记
  4. CF1096D Easy Problem(DP)
  5. 10分钟 在linux里创建.net core helloworld控制台程序
  6. 【转】JMeter学习(二十七)Jmeter常见问题
  7. 函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法
  8. Head first servlet and jsp学习笔记
  9. 创建featureclass,为它赋别名,并移动到数据集下
  10. DataBinder.Eval的基本格式 效率 比较