下图是一个STM32普通PWM形成的图形原理说明

自动重装载寄存器(ARR)用于确定波形的频率(即周期)、捕获比较寄存器(CCRx)(用于确定占空比的)

PWM的工作过程如下:首先ARR寄存器里面的值确定了一个PWM周期,就是我们上面举的那两个例子中的“1秒”(注意这个周期是在PWM系统初始化的时候写入ARR寄存器的,写入以后一般就不再改动了)。然后CCR寄存器里面的值是PWM工作过程中确定的,它可以为一个定值,也可以是一个变化的值。

当它是一个定值时(就像图片里的那样),占空比就是一个定值,如果放到上面那个LED灯的例子,那么实验现象就不是灯会渐亮渐灭,而是始终维持一个比较暗的亮度,如果CCR里面的值设定得越靠近ARR寄存器里面的值(只是靠近,但不大于),那么按照图上来看,就是每个周期内高电平持续的时间越短,至于灯到底是更亮了还是更暗了就得实际情况具体分析了。

当它是一个变化的值的时候,在程序里就可以设置一个变量,让这个变量按照一定规律递增(或递减)。然后把这个值写入到CCR寄存器中,这样每个周期中PWM的占空比就是不同的。宏观上,就能看到上面的LED灯的渐亮渐灭的过程。

--------------------- 以上来自 FelikZhang 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/FelikZhang/article/details/79237573?utm_source=copy

计数器值TIMx_CNT与捕获比较寄存器值CCRx比较后,最终输出高电平还是低电平,。

如图为向上计数:
定时器重装载值为ARR,比较值CCRx
t时刻对计数器值和比较值进行比较
如果计数器值小于CCRx值,输出低电平
如果计数器值大于CCRx值,输出高电平 PWM的一个周期
定时器从0开始向上计数
当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
至此一个PWM周期完成 影响因素
ARR : 决定PWM周期(在时钟频率一定的情况下,当前为默认内部时钟CK_INT)
CCRx : 决定PWM占空比(高低电平所占整个周期比例)

下图是一个spwm的图形

一. STM32F103通用定时器简介:

  1. 通用定时器是一个可编程预分频器驱动的16位自动装载计数器
  2. 适用于:  测量输入信号的脉冲长度(输入捕获)、产生输出波形(输出比较和PWM)。
  3. 每个定时器都是完全独立的,都可以同步操作。

-----------------------------------------------------以下为复制粘贴---------------------------------------------------------

STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
  ①位于低速的APB1总线上(APB1)
  ②16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
  ③16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
  ④4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
  输入捕获 
  输出比较
  PWM 生成(边缘或中间对齐模式) 
  单脉冲模式输出 
⑤可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 
①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
③输入捕获 
④输出比较 
⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 
⑥触发输入作为外部时钟或者按周期的电流管理
STM32 的通用定时器可以被用于测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。   
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

---------------------------------------------------------------------------------------------------------------------------------

二. PWM是什么

OK,首先PWM全称为“Pulse Width Modulation”。中文翻译为:脉冲宽度调制。

脉冲宽度指的是 脉冲持续的时间,既高电平或低电平保持(持续)的时间。

而PWM通俗的说就是人为的(通过微处理器)去控制电平高低保持的时间。

好的,这里引出一个新名词,占空比:在一个脉冲的循环中,通电时间相对于总时间所占的比例。

stm32之PWM学习的更多相关文章

  1. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

  2. STM32之PWM君

    PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总 ...

  3. 【转载】 stm32之PWM

    发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...

  4. STM32的PWM输入模式设置并用DMA接收数据

    参考 :STM32输入捕获模式设置并用DMA接收数据 PWM input mode This mode is a particular case of input capture mode. The ...

  5. STM32之PWM波形输出配置总结

    一.   TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...

  6. stm32之PWM

    PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计 ...

  7. 【STM32】PWM DAC基本原理(实验:PWM实现DAC)

    虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的.通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加. 不过S ...

  8. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  9. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

随机推荐

  1. Linux unzip用法

    1.把文件解压到当前目录下 unzip test.zip 2.如果要把文件解压到指定的目录下,需要用到-d参数. unzip -d /temp test.zip 3.解压的时候,有时候不想覆盖已经存在 ...

  2. 转 event 'utl_file I/O':

    The ASH report shows tables and data files with wait event 'utl_file I/O': CHANGES No changes. CAUSE ...

  3. WPF 动态加载主题由zip

    经典主题的方式 主题战略 加载速度 本机支持 (不需要额外的代码) 支持代码为主题 (捆绑代码 & 资源成单独的文件) 支持资源层次结构中导航 动态加载 动态卸载 轻松地编辑和编译 (不需要安 ...

  4. Java的API及Object类、String类、字符串缓冲区

    Java 的API 1.1定义 API: Application(应用) Programming(程序) Interface(接口) Java API就是JDK中提供给开发者使用的类,这些类将底层的代 ...

  5. 关于 hystrix 的异常 fallback method wasn't found

    典型如下: @HystrixCommand(fallbackMethod = "fallbackHi") public String getHi(String x) { Strin ...

  6. Intellij idea 创建JAVA项目

    1. 打开软件,new一个project的java项目 2. 点击下一步,此界面可通过模板生成项目,如下图 3. 填写项目名称和项目源码的保存路径,如下图 4. 点击 Finish 完成按钮即可,项目 ...

  7. PADS 创建封装笔记

    1.在PADS logic中新建元件和CAE封装 2.在PADS layout 中建立元件的PCB封装 3.用PADS Library Converter 把以前版本的库转化为现在的版本.

  8. cpp 计算程序运行时间的两种方法

    1. #include <time.h> time_t begin_t = clock(); // to do time_t finish_t = clock(); cout<< ...

  9. 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态

    2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行.两天议程满满,包括 17 个主旨演讲.8 个分会场的 88 场技 ...

  10. python 之 re 模块

    re模块下的常用方法 1.findall:返回所有满足匹配条件的结果,放在列表里. import re # 查找数字 result = re.findall('\d+','nizhidao 123 w ...