STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了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输出相关推荐
- STM32F0库函数初始化系列:PWM输出
void TIM1_Configuration(void) {TIM_TimeBaseInitTypeDef TIM_Time1BaseStructure;TIM_OCInitTypeDef TIM_ ...
- 【STM32】HAL库——定时器PWM输出
前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...
- 【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 树莓派用WiringPi和Bcm2835库和PCA9685输出PWM
文章目录 1.前言 2.Bca2835发生PWM 3.WiringPi发生PWM 3.1 硬件PWM 3.2 软件PWM-Software PWM Library 4.外接PCA9685输出PWM 4 ...
- 树莓派输出pwm波c语言,树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制
树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 一:pigpio库简介 pigpio是一个用于树莓派的库 ...
- STM32 TIM PWM中阶操作:互补PWM输出
STM32 TIM PWM中阶操作详解:互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用,功能包括单线/非互补PWM输出,双线/互补PWM输出,以及死区时间和刹车控制等. 实际 ...
- arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突
一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...
- 基于STM32F03RCT的多路频率占空比可调PWM输出
基于STM32F03RCT的多路频率占空比可调PWM输出 1. 准备 1.1. 硬件 1.2. 软件 2. 基础知识 3. CubeMX配置 3.1. 通用配置 3.2. 定时器配置及初始化代码生成 ...
- 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码
树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 文章目录 树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一. Servo Driver ...
最新文章
- MS SQL “ 无法启动分布式事务“问题的解决思路
- 供应链金融与区块链技术-可以研读
- XML到Avro的转换
- ANSI X9.9 MAC算法介绍
- 方法区元空间实现之jdk7和8字符串常量池、运行时常量池、静态变量到底在哪?
- 利用JavaScript实现简单的下拉菜单
- html的搜索框代码怎么写_网站新闻怎么写才能被搜索引擎收录?
- QTP 自动化测试--定义变量
- Maven自动压缩脚本 和 样式文件配置
- 放之四海皆适用的设计原则(一)
- MindManager的例图资源
- 【php更换数据库为orcle】phpstudy+orcle
- python实现拼多多自动回复_拼多多客服多开工具怎么配置多店铺客服?
- Head First中文版教程
- 一文读懂什么是聚合支付
- t3服务器一登录就运行时错误,用友T3软件登陆系统管理提示运行时错误3709
- u盘复制一直正在计算机,解决U盘复制文件时电脑总是重启的方法
- Peer-to-Peer Sockets 工程入门
- OJ期末刷题 问题 B: 求三角形面积-gyy
- LeetCode:838. 推多米诺————中等
热门文章
- 星地融合→→→6G移动通信关键技术的未来
- 请求转发与重定向的区别和执行流程
- promise ,async 小记
- CF1096D Easy Problem(DP)
- 10分钟 在linux里创建.net core helloworld控制台程序
- 【转】JMeter学习(二十七)Jmeter常见问题
- 函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法
- Head first servlet and jsp学习笔记
- 创建featureclass,为它赋别名,并移动到数据集下
- DataBinder.Eval的基本格式 效率 比较