PWM移相以及占空比可变

2024-02-29 19:30
文章标签 可变 pwm 占空比 移相

本文主要是介绍PWM移相以及占空比可变,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在  PWM移相以及占空比可变(上) 一文中,我讲述了如何实现两路PWM输出相位差在0-180°范围内任意可调的实现逻辑,但是在后续的实验过程中,发现实现逻辑出现错误,导致PWM输出只有在固定占空比的情况下才能实现相位可调。而下文则是对于如何正确实现 PWM移相以及占空比可变  进行讲解。

注意:

  • 本文使用的是STC8h1k08单片机进行实验。
  • 本文使用I/O口分别为 P11P34,其中P11为通道1--CH1,P34为通道2----CH2
  • 本文中,CH1预装载重装值为 AAR1=2000,CH2的预装载重装值为 ARR2。
  • 本文

一、PWM的2种输出方式 

我们要使用 STC8H 高级定时器的PWM输出模式以及输出比较模式,其中 CH1 为 PWM 模式,CH2 为 输出比较模式。

1.1、PWM模式


上图清晰的展示了PWM输出模式下 PWM 输出的基本原理,这里不在赘述,不懂的小伙伴可以自行学习。

1.2、输出比较模式 

输出比较模式通俗来说 是CNT = CCR时  电平会翻转。例如 你配置了 向上计数,ARR=100, CCR=30,初始电平为高电平,那么 CNT从0计数到30时, CNT =CCR =30,此时高电平就会跳变到低电平,CNT继续在30的基础上计数,直到计数到100并溢出,此时CNT会置0并重新开始计数。

值得注意的是,PWM模式与翻转模式下所输出的波形频率是相差 2倍的,即 PWM输出频率为10HZ,那么输出比较模式下的输出频率只有5HZ。如下图

这是因为   输出比较模式下不关心CNT比 CCR值大还是小,只关心CNT和CCR值什么时候相等,两个值相等时,就翻转输出电平。在PWM模式下,CNT值从0增加到ARR一个周期内输出电平有两次变化(超过CNT=CCR临界值时跳变一次,CNT溢出置零跳变一次),而在输出比较模式下时CNT值从0增加到ARR一个周期内输出电平只有一次变化。所以输出比较模式下,定时器输出方波的频率为PWM模式下定时器输出方波频率的一半。(该段内容源自--生成两路PWM波相位差90°的方法)。

那么如何使输出比较模式下输出的波形频率与PWM输出的波形频率一致呢。其实主要是如何实现在同一个ARR周期下,输出比较与PWM的电平有两次变化。这个将在下文讲解。

二、自动重装值ARR 与 移相角度关系

2.1、PWM模式移相

以上图为例,我们先用PWM模式输出实现45°移相,其中ARR为2000,占空比为50%。

那么问题来了,我是如何判断或者我的逻辑是如何让他实现45°移相的呢?

其实很简单,我们把 ARR=2000 与 角度 360°一一对应起来,或者说是360°均分为 ARR 份。那么我们要移相 45°,即A点与B点相差45° ,现在要求的是 A点的CCR  与 B点 的CCR相差多少,已知B点的CCR的值 。通过计算我们很快就可以得出,A点与B点的 CCR的差值为 250,那么我们只需要在配置的时候,把两路PWM的CCR的值相差250,即可实现 45°的移相。

同理我们要实现90°的移相,那么A点与B点的CCR值应该相差多少? 通过计算 可以的到

\Delta CCR=\frac{2000}{360^{o}}*90^{o}

那么只要确定其中一路的CCR, 那么另外一路CCR便可以确定。

以上是在 ARR=2000 的情况下得到的,那么ARR是其他的值的时候我们该如何求得 A点与B点的\Delta CRR 值呢?

公式如下:

\Delta CCR=\frac{ARR}{360^{o}}*x

其中, ARR为自动重装值,x取值为(0-180°),为你所需要的角度 。

2.2、输出比较模式移相

2.2.1、输出比较的频率问题

 输出比较模式相比较与PWM模式有一个需要解决的问题就是频率不一致的问题。我们需要将输出比较模式 输出的波形频率调成与 PWM模式输出的波形频率一致才可以进行下一步的移相工作。

那么我们该如何进行操作呢?

1.2、输出比较模式 结尾我提到过,主要是如何实现在同一个ARR周期下,输出比较与PWM的电平有两次变化。

我们以 PWM模式输出的波形为基准,其中ARR1=2000,占空比为50%(即CCR1=1000)。

那么 我们假设第一个CCR2为0,即CCR2=0,那么在上电后,输出比较模式 CNT=CRR2=0,电平第一次翻转,由低电平跳变为高电平,那么我们要在 ARR1=2000 的范围内在跳变一次电平,且占空比为50%,那么显而易见,我们下一次跳变的CCR2的值应该为 CCR2=1000。那第三次跳变点应为 CCR2=2000(即0点)。如下图所示。

因此,我们在代码中,在CNT=CRR时,除了电平翻转外,还需要将下一次 电平翻转点的值装入到CCR当中。

在占空比固定位50%的情况下,不同的ARR值中,我们翻转点CCR的值也是不一样的,但是总的来说 ,只要A1、A2 的CCR间隔相差 ARR/2即可。

2.2.2、输出比较移相

输出比较的移相以PWM 移相类似,只是输出比较的移相需要考虑两次比较值CCR的位置。

首先,我们仍假设通道CH1为OPWM模式下输出的PWM波形,CH为输出比较模式输出的PWM波形,CH1的ARR1 = 2000,CCR1=1000,  CH2的重装载值为ARR2,第一次CCR值为 CCR2_A,第二次CCR的值为CCR2_B。

2.2.2.1、移相90°。

 首先,我们要确定我们移相角度;其次,我们要确定CH1与CH2电平翻转点差值\Delta CCR相差多少;然后,我们还需确定CH2第一个翻转点位置 CCR2_A 位置在哪里,最后在确定 CCR2_B位置在哪里。

根据公式:\Delta CCR=\frac{2000}{360^{o}}*x  有    \Delta CCR=\frac{2000}{360^{o}}*90^{o}

我们得到 \Delta CCR= 500, 因此  A1-B1=500。

那么我们令 CCR2_A = \Delta CCR=500,由于占空比为50%,所以CCR2_B=CCR2_A+\Delta CCR

即得 CCR2_B = 1500。这样就可以得到 占空比为50%,相位差为90°的两路PWM。

2.2.2.2、移相45°

根据公式:\Delta CCR=\frac{2000}{360^{o}}*x  有  \Delta CCR=\frac{2000}{360^{o}}*45^{o}  得到 \Delta CCR=250

则我们令 CCR2_A = \Delta CCR = 250, 由于占空比为50%,所以CCR2_B=CCR2_A+\Delta CCR=1250

2.2.2.3、移相10°

根据公式:\Delta CCR=\frac{2000}{360^{o}}*x  有  \Delta CCR=\frac{2000}{360^{o}}*10^{o}  得到 \Delta CCR\approx 55.556

则我们令 CCR2_A = \Delta CCR = 56, 由于占空比为50%,所以CCR2_B=CCR2_A+\Delta CCR=1056

2.2.2.4、总结

其实移相就分为以下3步

  • 计算 \Delta CCR 的值
  • 赋值 CCR2_A
  • 根据占空比 赋值CCR2_B

三、占空比可变(固定相位差)

 在第二章中讲述了固定占空比情况下如何实现相位差可调,那么本章讲述的是固定相位差的情况下如何正确更改占空比。

3.1、固定相位差90°,更改占空比

2.2.2.1、移相90° 中,我们令 CCR2_A = \Delta CCR=500,CCR2_B=CCR2_A+\Delta CCR,即得 CCR2_B = 1500。这样得到的是 占空比为50%,相位差为90°的两路PWM。

而现在我们需要更改占空比时,需要考虑的是 CCR2_A 与 CCR2_B 的差值,即\Delta CCRA-B

该值决定了我们占空比大小。

3.1.1、占空比为10%

由于我们相位差为90°,因此我们的 CCR2_A = \Delta CCR=500,不需要改变,而且也不能变化,否则将会改变移相角度,我们需要变化的是 CCR2_B的值。

我们要输出 10% 的占空比 ,则 PWM的高低电平比例为 1:9,由于我们在第二章假设了 CH1的 ARR1为 2000,因此,CH1高低电平时间比值为 200:1800;  CH2高低电平时间也为200:1800。

那在 CH2 中 我们CCR2_A 与 CCR2_B 的差为 200,即  \Delta CCRA-B = 200。又因为CCR2_A=500,所以计算可得 

CCR2_B= CCR2_A+ \Delta CCRA-B = 700

 3.1.2、占空比为20%

PWM的高低电平比例为 2:8,CCR2_A = \Delta CCR=500,CH2 中 我们CCR2_A 与 CCR2_B 的差为 400,即 \Delta CCRA-B = 400.通过计算可得 

CCR2_B= CCR2_A+ \Delta CCRA-B = 900

3.1.3、占空比为75%

PWM的高低电平比例为 3:1,CCR2_A = \Delta CCR=500,CH2 中 我们CCR2_A 与 CCR2_B 的差为 1500,即 \Delta CCRA-B = 1500,通过计算可得 

CCR2_B= CCR2_A+ \Delta CCRA-B = 2000

3.2、固定相位差45°

3.1、固定相位差90°,更改占空比 凡凡原理一样,保持 CCR2_A不变,改变CCR2_B的值。

3.3、固定相位差10°

3.1、固定相位差90°,更改占空比 凡凡原理一样,保持 CCR2_A不变,改变CCR2_B的值。

以上内容即为 相位差在0-180°范围内可调,占空比可变化的实现原理。如有内容补充,将会及时优化,希望该内容可以帮助有需要的朋友。

文中如有错误,请各位指出,我将及时更正。

这篇关于PWM移相以及占空比可变的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759824

相关文章

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

STM32CubeMX 3 解锁PWM模块

今天在底层高手的指导下又学习了PWM模块的配置!汪! 首先打开上次配置好的文件,如下: 然后,我们要用TIM1来进行PWM 的设置: 然后,clock configuration 不用动 然后 双击自动弹出以下,窗口:

STM32F103调试DMA+PWM 实现占空比逐渐增加的软启效果

实现效果:DMA+PWM 实现PWM输出时,从低电平到输出占空比逐渐增加再到保持高电平的效果,达到控制 MOS 功率开关软启的效果。 1.配置时钟 2.TIM 的 PWM 功能配置 选择、配置 TIM 注意:选择 TIM 支持 DMA 控制输出 PWM 功能的通道,有的TIM通道支持PWM 但不支持PWM注意选择。 PWM参数设置 Counter Period :

C++11,可变参数模板,lambda表达式,包装器

可变参数模板 在C++11中模板也可以接收多个不定参数,就和int printf(const char *format, ...);函数一般模板也可以接收多个参数; // 可变参数模板template<class ...Args>void testArgs(Args... args){}int main(){testArgs(123, 'a', "abc",

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器               蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1)结构原理 有源蜂鸣器内部自带振荡源,只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号,从而驱动蜂鸣器发声。

android光滑绘图可变宽度笔

要绘制代码 path 使用可变的描边宽度 public class FingerPaint extends GraphicsActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new MyView(this

61、Python之函数高级:为函数添加方法,实现属性可变的装饰器

引言 今天文章的标题,初读起来可能有些拗口,什么叫“为函数添加方法”?但是,如果真正对“Python函数也是对象”这个理念有清晰的理解的话,其实,也是不难理解的,本质上就是给一个对象新增一个自定义方法。通过这样做,我们就可以实现在运行过程中,对装饰器的属性进行动态修改了。 本文的主要内容有: 1、函数对象添加自定义方法 2、属性可变的动态装饰器 函数对象添加自定义方法 其实,这一点

[C++11#46](三) 详解lambda | 可变参数模板 | emplace_back | 默认的移动构造

目录 一.lambda 1. 捕捉列表 2. 底层原理 二. 可变参数模板 1. 递归函数方式展开参数包 2. 数组接收方式展开参数包 3. 运用 4.emplace_back 5.移动构造和拷贝构造 强制生成 default 一.lambda 可调用类的对象 函数指针--少用 void(*ptr) (int x) 仿函数--构造类 重载 operator() 对象

C++ 模板基础知识——可变参数模板

目录 C++ 模板基础知识——可变参数模板1. 可变参函数模板1.1 基本含义1.2 利用 constexpr if 优化递归函数1.3 关于 constexpr if 的进一步理解1.4 重载 2. 折叠表达式2.1 一元左折(Unary Left Fold)2.2 一元右折(Unary Right Fold)2.3 二元左折(Binary Left Fold)2.4 二元右折(Binar

51单片机的pwm控制的智能台灯设计【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能  该系统由AT89C51/STC89C52单片机+LCD1602显示模块+DS1302时间模块+光敏传感器模块+人体红外模块+按键等模块构成。适用于智能台灯、PWM调节灯光亮度等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、环境光照强度、手动/自动模式、台灯亮度等信息; 2、DS1302采集时间数据; 3、光敏传感器(电位器模拟)采集光照强度; 4、人