STM32+FreeRTOS+CUBEMX_学习笔记(六)PWM终极总结

最新更新时间:2022-01-26来源: eefocus关键字:STM32  FreeRTOS  CUBEMX  PWM 手机看文章 扫描二维码
随时随地手机看文章

PWM输出

cubemx配置:

配置时钟和输出PWM模式:

注意,使用tim4时,这里要勾选使用内部时钟

在这里插入图片描述

配置PWM频率和极性:

这里讲解一下:

PWM频率 = 时钟频率/(分频系数 (prescaler)* 计数周期(counter period))

这里我的时钟是72M: 那么频率就是 : 72000000除以 (7199+1),再除以(99+1)。结果为100HZ。

在这里插入图片描述

配置PWM时钟:

先打开RCC中的高速时钟

在这里插入图片描述

设置HCLk时钟频率为72M,注意我们只需要设置hclk,别的时钟就会自动设置

在这里插入图片描述

启动PWM和设置占空比:

位置:

在这里插入图片描述

下面是我们启动pwm和设置pwm占空比的函数:


    __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 50);

__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 20);

  

    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);


pwm占空比设置和极性设置讲解:

注意,我们怎么计算PWM的占空比,前面我们在配置PWM时,设置了计数周期和极性。

我们可以看到,两个PWM的极性不一样,

低极性:就是下图的黄色,一个周期里面,先是低电平,然后是高电平

高极性:就是下面的蓝色,先是高电平,然后是低电平


那么,设置占空比是什么意思了?

官方解释为,我们设置占空比,当计数器到了设置的占空比时就更换电平。

那么我们的占空比范围就是: 0 - 技术周期。 前面我们设置的是99,那么这里就是 0- 99+1。


总结:PWM在周期开始时是高电平还是低电平由极性决定。而,一个时间过后翻转电平,这个时间是占空比。但是,占空比必须小于计数周期。所以占空比的范围为0-技术周期

在这里插入图片描述

//这里将占空比设置为20,计数周期为99+1 =100,那么就是20%的时候反转电平,可以看到上面的蓝色波到达20%就反转了

__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 20);


PWM输入模式:

注意这个模式是stm32提供的特殊的输入捕获模式:


pwm输入配置

在这里插入图片描述

打开中断:

在这里插入图片描述

打开输入中断:

在这里插入图片描述

  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);


编写回调函数:

/* 捕获回调函数 */

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

static uint32_t m_pulse;

// if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)

// {

// /* 得到周期 */

// m_period = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//低电平加高电平时间

// }

if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)

    {

m_pulse = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2); //得到低电平的时间

printf("m_pulse is %dn",m_pulse);

//add_low_level(m_pulse, &RxData); //获取数据

    }

}


结果:

在这里插入图片描述

输入结果计算:

注意,这里我们采用函数获取到的值是一个值,这个值是输入捕获寄存器里面的值。

这个值还需要经过计算而得来。


那么怎么计算了,注意我们之前设置分频系数了。


真实的测量值为: (预分频值/时钟频率) *获取到的;


比如说:预分频为 72 ,时钟为72000000,获取到20

那么实际检测到的时间为: (72 / 72000000)*20 = 20us。

关键字:STM32  FreeRTOS  CUBEMX  PWM 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic559781.html

上一篇:STM32+FreeRTOS+CUBEMX_学习笔记(四)按键输入
下一篇:STM32+FreeRTOS+CUBEMX_学习笔记(五)HAL串口终极总结

推荐阅读

Arduino_Core_STM32---pinMode()实现分析
pinMode()定义Arduino平台的易于使用性主要就体现在屏蔽的大量底层细节的实现,对于该函数来说也不例外。虽然该函数只有两个参数(arduino引脚号和模式),但这两个参数需要多层的映射才能转化为具体适合STM32芯片的配置信息,并调用底层接口完成配置。从下面源码中可以看出主要由两个函数来完成引脚模式配置的:digitalPinToPinName()和pinfunction()。在具体深入下面两个函数之前我们需要一些预备知识—该库对于STM32硬件端口和引脚的封装。void pinMode(uint32_t ulPin, uint32_t ulMode){ PinName p = digitalPinToPinName(ul
发表于 2022-08-11
vscode搭建STM32开发环
需要安装的软件vscode必装插件:C/C++:用于提供高亮显示和代码补全Cortex-Debug:用于提供调试配置makemake工具可以直接下载xPack项目提供的windows-build-tools工具里面带了make工具。Release xPack Windows Build Tools v4.2.1-2 · xpack-dev-tools/windows-build-tools-xpack (github.com)openocdarm-none-eabistm32CubeMX上述软件具体的安装教程网上有很多详细的介绍资料,这里就不详细介绍了。需要注意的是记得将make,openocd,arm-none-eabi等可执行程
发表于 2022-08-11
STM32_USB_CDC学习笔记
USB虚拟串口的接收方式:USB 虚拟串口的接收采用中断方式,芯片在接收到数据后回触发中断调用CDC_Receive_FS()函数来处理接收到的数据.USB虚拟串口一次最多接收64个字节的数据,如果收到的数据大于64个字节则会连续多次调用CDC_Receive_FS()函数来处理接收到的数据.问题:每次下载完成程序后,必须重新插拔USB线,PC才能识别到串口设备?解决方法:在每次USB初始化之前,配置USB的两个引脚拉低几个ms,即可让PC重新枚举该USB设备.函数功能USB发送USBD_CDC_SetTxBuffer()和USBD_CDC_TransmitPacket()函数是启动数据发送过程的一组函数,要成对使用.USBD_CD
发表于 2022-08-11
关于STM32定时器中TI1FP1 与TI1FP2及相关话题
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1与TI1FP2,TI2FP1与TI2FP2,TI3FP3与TI3FP4,TI4FP3与TI4FP4,即每个输入通道可以生产1对信号。这里以STM32F103系列为例聊聊T这个TImFPn,。在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来。这四对信号可以统一写为:TImFPn,其中m代表滤波和边沿检测器前的输入通道号,n代表经过滤波和边沿检测器后将要接入或
发表于 2022-08-11
关于<font color='red'>STM32</font>定时器中TI1FP1 与TI1FP2及相关话题
STM32编码器模式详解(一)---理论
一、编码器接口模式选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1
发表于 2022-08-11
<font color='red'>STM32</font>编码器模式详解(一)---理论
STM32驱动超声波模块测距
HC-SR04超声波测距模块可提供2cm到400cm的非接触式距离感测功能,测距精度可达3mm。一、基本工作原理(1)给TRIG引脚至少10us的高电平信号触发测距。(2)模块自动发送8个40KHz的方波,自动检测是否有信号返回(3)有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间。(4)测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2。二、接线三、模块时序图四、驱动程序在了解了上述内容后,我们便可以根据上述知识便可以编写驱动程序了。触发信号Trig很简单直接通过IO输出和延时给一个大于10us的高电平即可触发。Echo引脚需要接收并记录高电平的持续时间,大致有3种实现的思路
发表于 2022-08-11
<font color='red'>STM32</font>驱动超声波模块测距

推荐帖子

STM32 中断的全局变量
在ccit.h中定义全局数组volatileuint8_tglobal[50]; it.c中引用了#include\'\'ccit.h" 然后再main.c中用externuint8_tglobal[50]; 这个数组是接收串口2的数据 在串口2第一次接收到PC数据为010203//OK 然后我改变PC机下发的数据改为ffff//但是这个全局数组里面接收的还是010203 为什么? 为什么再次改变之后就没变化了STM32中断的全局变量
duzhiming stm32/stm8
谁知道有没有国产的以太网PHY芯片?
如题 谁知道有没有国产的以太网PHY芯片?
wulei19880906 单片机
TI 狂欢+后双十一继续买买买的详细笔记
本帖最后由x1816于2017-11-1500:32编辑 TI的LanuchPad系列都是好东西,谁用谁知道~ 这次EEWorld联合TI搞了活动,当然是要买买买啦。 话不多说,活动链接奉上: http://bbs.eeworld.com.cn/huodong/TI_SimpleLink_201709/ 这里想买个CC3220SLaunchPad,原因其实很简单,这是支持WiFi开发的LaunchPad中最便宜的一款。 点击要买的开发板下面的“立即购买”按钮 来到了
x1816 无线连接
指纹模块识别
用51单片机设计zaz-101指纹模块的c程序指纹模块识别
liyuechong 51单片机
问一个无线模块发AT指令无响应的原因
有一个彩信模块,和主机串口连接 接电脑串口用时一切正常,波特率是115200 手头有一块arm开发板,彩信模块接arm的串口时,通过串口发at指令无反应,该开发板串口没问题,因为同样的那个串口,我外接一个普通的GPRS模块就一点问题都没有 串口线也没问题,另外我还编了个程序,在电脑linux系统下使用彩信模块,一切正常,但把该该程序移植到arm时,无响应,设备文件打开是正确的,波特率也是115200,其他的波特率也试过了,没用 因此可排除模块本身的问题、串口线的问题、开发板串口的问题。
jim_gao 嵌入式系统
【基于物联网的PLC】---为PLC主控烧写IIOT OS
第一步:选择国产工业物联网操作系统,选择对应的TF卡,点击烧录。第二步:等待烧写完成后,将TF卡插入树莓派。然后上电。第三步:通过局域网扫描得到树莓派IP地址。第四步:通过SSH登录树莓派,查看操作系统是否正常启动。启动成功,证明工业物联网操作系统烧写成功。 【基于物联网的PLC】---为PLC主控烧写IIOTOS
cpsiot 2022得捷电子创新设计大赛
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved