PWM是Pulse Width Modulation的缩写,即脉冲宽度调制。其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码。等效的实现是基于采样定理中的一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量即指窄脉冲的面积。这里所说的效果基本相同,是指该环节的输出响应波形基本相同。
如把各输出波形用傅里叶变换分析,则它们的低频段特性非常接近,仅在高频段略有差异。
为了实现a的效果,可以通过b这种正弦波去模拟达到这种效果。(通过每一段的面积相同去模拟)
PWM信号是数字的,在给定的任何时刻,满幅值的直流供电要么完全有(0N),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。
改变脉冲的周期可以达到调频的效果,改变脉冲的宽度或占空比可以达到调压的效果,因此,采用适当控制方法即可使电压或电流与频率协调变化。
PWM控制技术获得了空前的发展,并且广泛的运用在从测量、通信到功率控制与变换的许多领域中。
PWM具有很多的优点,主要优点如下:
①从处理器到被控系统信号都是数字形式的,无需进行数模转换;
②让信号保持为数字形式可将噪声影响降到最小,噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响,这是PWM用于通信的主要原因。
STM32的定时器除了 TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这样,STM32最多可以同时产生30路PWM输出!
应用举例:
步进电机驱动
舵机控制器
1) PWM输出模式
STM32的PWM输出有两种模式,模式1和模式2,由TIMx CCMRx寄存器中的OCxM位确定的(“110”为模式1, “111”为模式2)。模式i和模式2的区别如下:
110 PWM模式1一在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(0C1REF=1)。111: PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。而从计数模式上来看,PWM也和TIMX在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式。
举例分析:
比如上方 自动重装载寄存器(ARR)、计数器(CNT)、捕获/比较1寄存器(CCR1),比如将ARR的值设为50,然后CNT由0开始数,数到50之后(这里举例默认是向上计数的),又开始从0开始数,又假设CCR1的值设定为25,PWM的输出模式为 110,当计数值CNT小于25时,输出的OC1REF 为高电平,大于25时,输出低电平。这个波形的占空比为1:1,比较有规律,可以通过控制几个寄存器的值来得到我想要的波形。
2) PWM输出管脚
PWM的输出管脚是确定好的:
不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM.
比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是 PA.7,如果设置部分重映像之后,TIM3_CH2的输出就被映射到 PB.5上了,如果设置了完全重映像的话,TIM_CH2的输出就被映射到 PC.7上了。
3) PWM输出信号
PWM输出的是一个方波信号,信号的频率是由 TIMx 的时钟频率和 TIMx_ARR 预分频器所决定的,具体设置方法在前面一个定时器中有详细介绍。而输出信号的占空比则是由 TIMx_CRRx寄存器确定的。其公式为“占空比 = (TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向CRR中填入适当的数来输出自己所需的频率和占空比的方波信号。
4) 操作步骤
1.设罝RCC时钟;
2.设置GPIO时钟;
3.设罝TIMx定时器的相关寄存器;
4.设罝TIMx定时器的PWM相关寄存器。
第2步设置GPIO时钟时,GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用GPIO_PinRemapConfig()函数进行设置。
第3步设罝TIMx定时器的相关寄存器时,和之前介绍的一样。
第4步设罝PWM相关寄存器,首先要设罝PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设罝为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状态和使能TIMx的PWM输出使能。
相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。
边沿对齐的PWM波形(ARR=8)
分析:向上计数模式,比如自动重装载寄存器(ARR=8),就是计数寄存器(CNT)会从0数到8,当比较单元CCRx=4时,计数器的值小于4时,输出高电平,大于等于时会发生跳变,变为低电平,当计数到8又从0开始计数时又会跳变为高电平。
中央对齐的PWM波形(ARR=8)
关键字:STM32 PWM基础 脉冲宽度调制
引用地址:
STM32-(24):PWM基础
推荐阅读最新更新时间:2024-11-13 13:34
PWM输出实验步骤,PWM输出代码
脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出。 CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。 CCMR1: OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】、CCE
[单片机]
关于STM32的存储器映像
1. 外设存储器映像 外设的基地址:响应外设的存储器起始地址+地址偏移(参见STM32参考手册存储器影响部分和相应的外设存储器) 2. SRAM STM32F10xxx 内置20K 字节的静态SRAM。它可以以字节、半字(16 位)或全字 (32 位)访问。SRAM 的起始地址是0x2000 0000。 3. 位段 4. 嵌入式闪存
[单片机]
意法半导体STM32十周年:出货超过24亿,已构建起强大生态
集微网 4月25日报道 俗话说“十年磨一剑”,而从2007年起意法半导体(ST)推出第一颗STM32以来至今恰好十年,该系列产品不仅出货量超过20亿颗,而且还构建起了庞大、强壮的产业生态链。 4月25日,ST在深圳专门召开了“STM32中国峰会”。据悉,这是继2016年在深圳举行的首届STM32中国峰会取得了成功后第二次举办。本次峰会以“专注生态合作,整合技术创新”为主题,特别聚焦智能硬件、智慧城市和智能工业等热点领域。现场除了ST展示十年来STM32 的发展成果外,还邀请了众多合作伙伴分享与ST的合作经验。 会议具体安排上,4月25日为意法半导体高层主旨演讲及STM32生态系统伙伴针对智能硬件、智慧城市和智能工业的分论坛
[手机便携]
STM32--如何产生8路PWM波
实验描述:PA0,PA1,PA2,PA3,PA8,PA9,PA10,PA11输出不同占空比的PWM波 程序清单: #include PWM.H #include stm32f10x.h void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动AFIO RCC_APB2PeriphClockCmd(RCC_A
[单片机]
STM32采用结构体定义FSMC的地址
LCD地址设置 图中只画出了数据线与地址线 其他的线我没有花,请各位脑部一下,实在不行去看原子提供的LCD的原理图。 LCD有一个引脚是D/C引脚,用来区分往LCD中写入的数据是命令还是数据Data/Command 比如说我要给LCD控制器的X寄存器写入数据Y 那么我需要先给LCD发送一个命令----X寄存器的地址,此时D/C引脚为低电平 然后再发送一个数据Y,此时D/C引脚为高电平。但是正常的FSMC总线中没有控制命令与数据的功能(或许我不知道)。 正常的FSMC是绝对地址寻址。也就是需要硬件地址线A0-AX(X为地址的长度)去控制。 所以STM32使用了一根地址线不是说往LCD控制的的某个地址写入数据。而是用这一
[单片机]
STM32单片机的GPIO端口设置
1 寄存器问题 首先要了解什么是寄存器?寄存器是中央处理器CPU内用来暂存指令、数据和地址的存储器,在所有应用单片机来进行各种控制操作时,都是通过设置单片机的内部寄存器来操作单片机的,其思想就是根据每块内存单元所具有功能的不同,给这些地址取一个别名,这个过程也叫作寄存器地址映射。在后面的发展过程中,为了减少直接操作寄存器,又增添了库文件操作,以及后来的CubeMX中设置各种寄存器信息,但寄存器操作是单片机内部基础操作的方式,因此寄存器的操作是很有必要了解一下的。 图1.1 存储结构图 1.1 单片机中的寄存器 单片机中有众多寄存器,在实际单片机操作中应熟练掌握的寄存器有程序状态寄存器PSW,定时器方式控制寄存器TMOD,电源控
[单片机]
STM32--外部中断
这是我经过几天,的努力最终把外部中断解决了,这篇日志我将终结几下问题 一:外部中断的配置步骤 二:配置的技巧以及如何快速配置 三:自己出现的问题 一:外部中断的配置步骤 1. 加入必要的头文件,且platform_config.h需手动复制到工程文件夹下; 2 void RCC_Configuration(void); 全局时钟的配置相映的时钟,这更STM32处理器总线结构有关 3 void GPIO_Configuration(void); GPIO的初始化设置输入输出, 注意别忘
[单片机]
STM32 数据类型定义
在 Keil MDK 开发环境中,经常会遇到类似于unsigned int 8、uint8_t 、u8等数据变量定义,对于初学者来讲确实是有点痛苦,后来查询发现以上三种方式均表示——无符号的8位整形数据。 由于C语言类型的长度完全由编译器决定,char 通常被定义成 8 位宽;int 通常被定义成 16 位或 32 位宽(或更高),它取决于平台(编译器将在这两者间选择最合适的字宽);short 通常被定义成 16 位宽;long 通常被定义成 32 或 64位宽。 所以 C99 中引进了一个标准C库头文件 stdint.h ,方便精确确定整数类型的宽度 定义标准的扩展整数类型_stdint.h文件(部分) /* Signe
[单片机]