PWM介绍(STM32库函数)

2023-05-16

简介

PWM是 Pulse Width Modulation的缩写。
它是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
可应用与电机控制,测量,通信,开关电源等

使用STM32库函数输出PWM详解

STM32f103ZET6
使用正点原子提供的底层库,仅从库函数上面作理解
先看定时器的使能

typedef struct
{
  uint16_t TIM_Prescaler;         /*!< 指定用于分割定时时钟的预分频器值。
                                       此参数可以是介于0x0000和0xFFFF之间的数字 */

  uint16_t TIM_CounterMode;       /*!< 指定计数器模式。
                                       此参数可以是@ref TIM_Counter_Mode的值 */

  uint16_t TIM_Period;            /*!< 指定要加载到活动
                                       在下一个更新事件中自动重新加载注册。
                                       此参数必须是介于0x0000和0xFFFF之间的数字。  */ 

  uint16_t TIM_ClockDivision;     /*!< 指定时钟分区。
                                       此参数可以是@ref TIM_Clock_Division_CKD的值 */

  uint8_t TIM_RepetitionCounter;  /*!< 指定时钟分区。
                                       此参数可以是@ref TIM_Clock_Division_ckd指定重复计数器值的值。每次RCR下降计数器
                                       达到零时,将生成更新事件并重新开始计数
                                       从RCR值(N)开始。
                                       这意味着在脉宽调制模式下,(N+1)对应于:
                                       -边缘对齐模式下的脉宽调制周期数
                                       -中心对准模式下的半脉宽调制周期数
                                       此参数必须是介于0x00和0xFF之间的数字。
                                       @注意:此参数仅对TIM1和TIM8有效。 */
} TIM_TimeBaseInitTypeDef; 

格外注意两个值
TIM_Prescaler、TIM_Period
预分频值和自动重装载值
可以说当对这两个赋值就是在决定PWM的周期和频率
计算方式

频率(Hz)=72000000/(TIM_Prescaler+1)/(TIM_Period+1)

TIM_CounterMode是计数模式,计算模式有三种
(1)向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),
然后重新从0开始计数并且产生一个计数器溢出事件。
(2)向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,
然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
(3)中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,
产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件,
然后再从0开始重新计数。

TIM_ClockDivision 是时钟分割
可设置分割因子为1、2或者4

所以使能定时器的部分就有:使能GPIO时钟、初始化PWM输出引脚、设定预分频值和自动重装载值、设定计数模式、设定时钟分割等
接下来看PWM通道使能部分

typedef struct
{
  uint16_t TIM_OCMode;        /*!< 指定TIM模式。
                                   此参数可以是@ref TIM_Output_Compare_和_PWM_模式的值 */

  uint16_t TIM_OutputState;   /*!< 指定TIM输出比较状态。
                                   此参数可以是@ref TIM_Output_Compare_state的值 */

  uint16_t TIM_OutputNState;  /*!< 指定TIM互补输出比较状态。
								   此参数可以是@ref TIM_Output_Compare_N_state的值
								   @注意:此参数仅对TIM1和TIM8有效。 */

  uint16_t TIM_Pulse;         /*!< 指定要加载到捕获比较寄存器中的脉冲值。
								   此参数可以是介于0x0000和0xFFFF之间的数字*/

  uint16_t TIM_OCPolarity;    /*!< 指定要加载到捕获比较寄存器中的脉冲值。
							       此参数可以是介于0x0000和0xFFFF之间的数字,指定输出极性。
							       此参数可以是@ref TIM_Output_Compare_Polarity的值 */

  uint16_t TIM_OCNPolarity;   /*!< 指定互补输出极性。
								   此参数可以是@ref TIM_Output_Compare_N_Polarity的值
								   @注意:此参数仅对TIM1和TIM8有效。 */

  uint16_t TIM_OCIdleState;   /*!< 指定空闲状态下的TIM输出比较引脚状态。
								   此参数可以是@ref TIM_Output_Compare_Idle_State的值
							   	   @注意:此参数仅对TIM1和TIM8有效。*/

  uint16_t TIM_OCNIdleState;  /*!< 指定空闲状态下的TIM输出比较引脚状态。
                                   此参数可以是@ref TIM_Output_Compare_N_Idle_State的值
                                   @注意:此参数仅对TIM1和TIM8有效。 */
} TIM_OCInitTypeDef;

TIM_OCMode是PWM模式
PWM模式1:
在向上计数时,一旦TIMx_CNT<TIMx_CCRX时通道X为有效电平,否则为无效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRX时通道X为无效电平,否则为有效电平。
PWM模式2:
在向上计数时,一旦TIMx_CNT<TIMx_CCRX时通道X为无效电平,否则为有效电平;
在向下计数时,一旦TIMx_CNT>TIMx_CCRX时通道X为有效电平,否则为无效电平。
TIMx_CNT是定时器计数值,其中CCRX可以说即是TIM_Pulse,
当定时器计数与TIM_Pulse比较即可判断应该产生高电平还是低电平
TIM_Pulse可以说是占空比
通俗理解

PWM占空比 = TIM_Pulse / TIM_Period

TIM_OCPolarity设置电平极性
TIM_OutputState 用来设置比较输出使能,使能PWM 输出到端口
所以使能PWM部分的需要做的有设置PWM模式,设定占空比,设置计较输出使能,设定电平极性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PWM介绍(STM32库函数) 的相关文章

  • 修改ssh端口后无法连接ssh了?

    修改ssh端口后无法连接ssh了 xff1f richard 64 localhost vi etc ssh sshd config root 64 localhost richard vi etc ssh sshd config Open
  • Python基础知识——数据的集合之元组tuple

    人生苦短 xff0c 我学Python xff01 tuple tuple是一种有序的集合 xff0c 和list非常类似 xff0c 但是tuple一旦初始化就不能修改 定义格式 xff1a 变量名 61 元素1 xff0c 元素2 xf
  • Windows下载安装Intel RealSense SDK2.0

    下载地址 xff1a https github com IntelRealSense librealsense releases 选择下载Intel RealSense SDK WIN10 2 50 0 3785 exe 安装 xff08
  • 英特尔深度相机- Python 包装器的示例代码

    这些示例演示了如何使用 SDK 的 python 包装器 设备 xff1a RealSense D435i相机 代码链接 xff1a https github com IntelRealSense librealsense tree mas
  • 二维码识别与定位-方法2-利用opencv扩展库aruco

    二维码识别作为一种快捷准确的技术已经应用与生活中的购物支付 物体识别及工业AGV导航等领域 xff0c 典型的二维码识别开源库有arcuo alvar以及OpenCV中的二维码检测API如QRCodeDetector xff0c 在本节中我
  • Python 端口扫描器

    目录 前言一 TCP全连接二 程序编写1 获得主机名和端口2 解析主机名和端口3 抓取应用的Banner4 线程扫描5 信号量机制 总结 前言 任何一个靠谱的网络攻击都是起步于侦查的 在这里 xff0c 我们将使用Python来编写一个扫描
  • Windows+VS+OpenCV(多版本)环境配置

    Index 目录索引 写在前面1 OpenCV 的安装2 OpenCV 在 VS 中的配置配置方法一配置方法二 3 不同 OpenCV 版本的切换附录 查看OpenCV 版本的代码 写在前面 本篇文章记录如何安装OpenCV xff0c 以
  • 使用双天线G-RTK+Ardupilot小车完成厘米精度自动导航 pixhawk px4

    作为多年使用PIXHAWK的玩家 xff0c 相信大家或多或少被磁罗盘报错折磨过 由于磁非常容易受周围环境的干扰和自身结构的金属部分干扰 经常我们今天校准好的罗盘 xff0c 什么也没动 xff0c 明天上电发现罗盘报错 对于330 450
  • Cmake基础知识讲解

    本文主要参考https www cnblogs com cv pr p 6206921 html 1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写C
  • 基于opencv的ArUco的视觉定位之ArUco安装

    小编之前在前面的文章里是通过安装opencv 43 contirb来实现使用aruco xff0c 但在进行aruco的源码学习时 xff0c 发现不少类contirb里库是没有的 xff0c 于是不得不再装一个独立的aruco的库 xff
  • 使用opencv的aruco库进行位姿估计

    1 姿态估计在许多计算机视觉应用中非常重要 xff1a 机器人导航 xff0c 增强现实等等 该过程基于查找真实环境中的点与其2D图像投影之间的对应关系 这通常是一个困难的步骤 xff0c 因此通常使用合成或基准标记使其更容易 最流行的方法
  • linux centos 命令行 安装 teamviewers ___yyw合并版

    参考 xff1a 1 http blog csdn net changgongzhao article details 52299314 2 http blog csdn net dreamhai article details 57080
  • aruco字典如DICT_4X4_50含义

    其中DICT是dictionary的缩写 xff0c 4x4位表示marker标记要被划分的位数 xff0c 边界为1比特位 xff0c 所以4x4的marker识别时会被分割为6x6格 xff0c 如下图时6x6的 最下面的个数时字典里包
  • 单片机如何发出类似和弦的声音

    蜂鸣器声音优化 1 优化思路 蜂鸣器的控制 xff0c 在单片机领域 xff0c 大多数人都是给一定周期的脉冲 xff0c 蜂鸣器就会发出声音 xff0c 而本质上 xff0c 蜂鸣器只是一个金属弹片 xff0c 声音大小取决于弹片的幅值
  • 3年5年10年的嵌入式工程师,他们的区别在哪里

    嵌入式工程师与嵌入式工程师的区别在哪里 1 维度1 1 基础知识1 2 项目心态1 3 技术架构1 4 技术视野1 5 成熟方案1 6 一通百通1 7 选型能力1 8 其他能力 2 还有其他要说的 做过很多项目 xff0c 招了一些人 xf
  • 陀螺稳定云台控制流程图

    陀螺稳定云台控制流程图 控制流程图 手持云台控制流程图 xff0c 主要是一个串级PID xff0c 位置环和速度环 xff0c 当然了FOC电流环 xff0c 不在这个流程里 xff0c 位置环100HZ xff0c 速度环500HZ x
  • 电机的力矩计算

    1 转动惯量的公式 1 1 转矩如何计算 转矩等于转动惯量乘以角加速度 xff0c 然后我们要注意一下单位 xff0c 转矩的单位是NM 转动惯量的单位是kg m2 角加速度单位是rad s2 M 61 I B M是转矩 xff0c I 是
  • 电流采样运放参数

    关于运放参数 在我们做电流采样的时候 xff0c 压摆率这个参数很重要 xff0c 如果压摆率太小 xff0c 跟不上电流的变化带来的电压变化 xff0c 那么我们采样就不会准确 xff0c 在FOC算法里面 xff0c 一个完美的正弦波采
  • ICM42688初始化流程

    ICM42688初始化流程 1 陀螺仪复位 2 设置量程 3 关闭FIFO 4 关闭同步时钟 5 配置时间戳 xff0c 打开fifo 6 设置INTI引脚引脚属性为推挽及设置有效极性为高电平 7 配置中断 8 中断异步复位 9 配置陀螺和
  • FOC控制之小A小B小C是如何追求小D的

    1 写在前面 随着电动汽车的热火 xff0c 关于FOC控制技术的文章这几年在网络上可谓是一搜一大把 xff0c 各种理论分析 xff0c 公式推导 xff0c 应有尽有 通过这些文章 xff0c 可以看出大佬还是很多的 另外也有FOC的开

随机推荐