PWM

意法半导体的STCH03脉宽调制(PWM)控制器拥有很高的集成度,采用一次侧调整技术实现精确的恒流输出,帮助经济型手机充电器、电源适配器或辅助电源更好地满足能效法规对平均效率和待机功率的严格限制。

在负载较低时,为最大限度地提高能效,STCH03进入准谐振模式(ZVS),通过检测变压器退磁来控制零电压开关操作。检测电路还提供电压前馈控制功能,以确保恒流调整的精确度。STCH03将运行电流维持在变压器连续(CCM)和不连续(DCM)电流的工作边界,根据线路/负载条件将转换器的最高工作频率限制在167kHz,并且随着负载的降低实现波谷跳跃,以取得最高的能效。

节能功能包括零功率高压启动电路以及负载非常低或断开时的低静态电流和突发模式切换等,可将待机功率保持在10mW以下,以帮助充电器和适配器符合严格的法规要求,例如,即将发布的CoC Tier 2电源效率规范。低峰流可消除轻负载或无负载时的人耳可听噪声。在变压器辅助偏置电压值较低时,STCH03的自适应欠压锁定(UVLO)创新功能可确保目标应用连续稳定地工作。

凭借准确的一次侧恒流调整技术,STCH03不需额外的输出电流检测组件,从而减少了充电器物料清单(BOM)费用。内部集成的启动电路在不工作时不耗电,也可以节省外部组件。

STCH03还有很多有助于节省外部组件和BOM成本的功能,包括过热保护(OTP)和过压保护(OVP),这些保护功能都有自动重启功能,部分产品(STCH03L型号)还可选择保护锁定。 此外,软启动可防止启动时出现高峰值电流,在设备出现输出短路或在恒定电流控制下输出电压过低时,输出欠压保护功能确保设备安全运行。

STCH03采用开发人员熟悉的SO-8封装,现已投入生产。

详情访问 www.st.com/stch03

围观 462

1 引言

PWM 开关稳压或稳流电源基本工作原理就是在输入电压变化、内部参数变化、外接负载变化的情况下,控制电路通过被控制信号与基准信号的差值进行闭环反馈,调节主电路开关器件的导通脉冲宽度,使得开关电源的输出电压或电流等被控制信号稳定。 PWM 的开关频率一般为恒定,控制取样信号有:输出电压、输入电压、输出电流 、输出电感电压、开关器件峰值电流。由这些信号可以构成单环、双环或多环反馈系统 ,实现稳压、稳流及恒定功率的目的,同时可以实现一些附带的过流保护、抗偏磁、均流等功能。现在主要有五种 PWM 反馈控制模式。下面以 VDMOS 开关器件构成的稳压正激型降压斩波器为例,说明五种PWM反馈控制模式的发展过程、基本工作原理、详细电路原理示意图、波形、特点及应用要点,以利于选择应用及仿真建模研究。

2 开关电源 PWM 的五种反馈控制模式

一般来讲,正激型开关电源主电路可用图1所示的降压斩波器简化表示,Ug表示控制电路的 PWM 输出驱动信号。根据选用不同的 PWM 反馈控制模式,电路中的输入电压 Uin、输出电压 Uout、开关器件电流(由 b 点引出)、电感电流(由 c 点引出或 d 点引出)均可作为取样控制信号。输出电压 Uout在作为控制取样信号时,通常经过图 2 所示的电路进行处理,得到电压信号 Ue,Ue 再经处理或直接送入 PWM 控制器。

图 2 中电压运算放大器(e/a)的作用有三:

①将输出电压与给定电压 Uref 的差值进行放大及反馈,保证稳态时的稳压精度。该运放的直流放大增益理论上为无穷大,实际上为运放的开环放大增益。

②将开关电源主电路输出端的附带有较宽频带开关噪声成分的直流电压信号转变为具有一定幅值的比较“干净”的直流反馈控制信号(Ue)即保留直流低频成分 ,衰减交流高频成分。因为开关噪声的频率较高,幅值较大,高频开关噪声衰减不够的话,稳态反馈不稳;高频开关噪声衰减过大的话,动态响应较慢。虽然互相矛盾,但是对电压误差运算放大器的基本设计原则仍是“低频增益要高,高频增益要低”。

③对整个闭环系统进行校正,使得闭环系统稳定工作

开关电源五种 PWM 反馈控制模式

输入电压、电流等信号在作为取样控制信号时,大多也需经过处理。由于处理方式不同,下面介绍不同控制模式时再分别说明。

2.1 电压模式控制 PWM (Voltage-mode Control PWM)

图 3(a)为 BUCK 降压斩波器的电压模式控制 PWM 反馈系统原理图。电压模式控制 PWM 是 60 年代后期开关稳压电源刚刚开始发展而采用的第一种控制方法。该方法与一些必要的过电流保护电路相结合,至今仍然在工业界很好地被广泛应用。电压模式控制只有一个电压反馈闭环,采用脉冲宽度调制法,即将电压误差放大器采样放大的慢变化的直流信号与恒定频率的三角波上斜坡相比较,通过脉冲宽度调制原理,得到当时的脉冲宽度,见图 3(a)中波形所示。逐个脉冲的限流保护电路必须另外附加。当输入电压突然变小或负载阻抗突然变小时,因为主电路有较大的输出电容 C 及电感L 相移延时作用,输出电压的变小也延时滞后,输出电压变小的信息还要经过电压误差放大器的补偿电路延时滞后,才能传至 PWM 比较器将脉宽展宽。这两个延时滞后作用是暂态响应慢的主要原因。

开关电源五种 PWM 反馈控制模式

电压模式控制的优点:
①PWM 三角波幅值较大,脉冲宽度调节时具有较好的抗噪声裕量;
②占空比调节不受限制;
③对于多路输出电源,它们之间的交互调节效应较好 ;
④单一反馈电压闭环设计、调试比较容易;
⑤对输出负载的变化有较好的响应调节。

缺点:
①对输入电压的变化动态响应较慢;
②补偿网络设计本来就较为复杂,闭环增益随输入电压而变化使其更为复杂;
③输出 LC 滤波器给控制环增加了双极点,在补偿设计误差放大器时,需要将主极点低频衰减,或者增加一个零点进行补偿;
④在传感及控制磁芯饱和故障状态方面较为麻烦复杂。

改善加快电压模式控制瞬态响应速度的方法有二种:

一是增加电压误差放大器的带宽,保证具有一定的高频增益。但是这样容易受高频开关噪声干扰影响,需要在主电路及反馈控制电路上采取措施进行抑制或同相位衰减平滑处理;

另一方法是采用电压前馈模式控制 PWM 技术,原理如图 3(b)所示。用输入电压对电阻电容(RFF、CFF)充电产生的具有可变化上斜坡的三角波取代传统电压模式控制 PWM 中振荡器产生的固定三角波。此时输入电压变化能立刻在脉冲宽度的变化上反映出来,因此该方法对输入电压的变化引起的瞬态响应速度明显提高。对输入电压的前馈控制是开环控制,而对输出电压的控制是闭环控制,目的是增加对输入电压变化的动态响应速度。这是一个有开环和闭环构成的双环控制系统。

开关电源五种 PWM 反馈控制模式

2.2 峰值电流模式控制 PWM (Peak Current-mode Control PWM)

峰值电流模式控制简称电流模式控制。它的概念在 60 年代后期来源于具有原边电流保护功能的单端自激式反激开关电源。在 70 年代后期才从学术上作深入地建模研究 。直至 80 年代初期,第一批电流模式控制 PWM 集成电路(UC3842、UC3846)的出现使得电流模式控制迅速推广应用,主要用于单端及推挽电路。近年来,由于大占空比时所必需的同步不失真斜坡补偿技术实现上的难度及抗噪声性能差,电流模式控制面临着改善性能后的电压模式控制的挑战。如图 4 所示,误差电压信号 Ue 送至 PWM 比较器后,并不是象电压模式那样与振荡电路产生的固定三角波状电压斜坡比较,而是与一个变化的其峰值代表输出电感电流峰值的三角状波形或梯形尖角状合成波形信号 UΣ比较,然后得到 PWM 脉冲关断时刻。因此(峰值)电流模式控制不是用电压误差信号直接控制 PWM 脉冲宽度,而是直接控制峰值输出侧的电感电流大小,然后间接地控制 PWM 脉冲宽度。

电流模式控制是一种固定时钟开启、峰值电流关断的控制方法。因为峰值电感电流容易传感,而且在逻辑上与平均电感电流大小变化相一致。但是,峰值电感电流的大小不能与平均电感电流大小一一对应,因为在占空比不同的情况下,相同的峰值电感电流的大小可以对应不同的平均电感电流大小。而平均电感电流大小才是唯一决定输出电压大小的因素。在数学上可以证明,将电感电流下斜坡斜率的至少一半以上斜率加在实际检测电流的上斜坡上,可以去除不同占空比对平均电感电流大小的扰动作用,使得所控制的峰值电感电流最后收敛于平均电感电流[1]。因而合成波形信号UΣ要有斜坡补偿信号与实际电感电流信号两部分合成构成。当外加补偿斜坡信号的斜率增加到一定程度,峰值电流模式控制就会转化为电压模式控制。因为若将斜坡补偿信号完全用振荡电路的三角波代替,就成为电压模式控制,只不过此时的电流信号可以认为是一种电流前馈信号,见图 4所示。当输出电流减小,峰值电流模式控制就从原理上趋向于变为电压模式控制。当处于空载状态,输出电流为零并且斜坡补偿信号幅值比较大的话,峰值电流模式控制就实际上变为电压模式控制了。

峰值电流模式控制 PWM 是双闭环控制系统,电压外环控制电流内环。电流内环是瞬时快速按照逐个脉冲工作的。功率级是由电流内环控制的电流源,而电压外环控制此功率级电流源。在该双环控制中,电流内环只负责输出电感的动态变化,因而电压外环仅需控制输出电容,不必控制 LC 储能电路。由于这些,峰值电流模式控制 PWM 具有比起电压模式控制大得多的带宽。

峰值电流模式控制 PWM 的优点:
①暂态闭环响应较快,对输入电压的变化和输出负载的变化的瞬态响应均快;
②控制环易于设计;
③输入电压的调整可与电压模式控制的输入电压前馈技术相妣美;
④简单自动的磁通平衡功能;
⑤瞬时峰值电流限流功能 ,即内在固有的逐个脉冲限流功能;
⑥自动均流并联功能。

缺点:
①占空比大于 50%的开环不稳定性,存在难以校正的峰值电流与平均电流的误差;
②闭环响应不如平均电流模式控制理想;
③容易发生次谐波振荡,即使占空比小于 50%,也有发生高频次谐波振荡的可能性。因而需要斜坡补偿;
④对噪声敏感,抗噪声性差。因为电感处于连续储能电流状态,与控制电压编程决定的电流电平相比较,开关器件的电流信号的上斜坡通常较小,电流信号上的较小的噪声就很容易使得开关器件改变关断时刻,使系统进入次谐波振荡;
⑤电路拓扑受限制;
⑥对多路输出电源的交互调节性能不好。

2.3 平均电流模式控制 PWM (Average Current-mode Control PWM)

平均电流模式控制概念产生于 70 年代后期。平均电流模式控制 PWM集成电路出现在 90 年代初期,成熟应用于 90 年代后期的高速 CPU 专用的具有高 di/dt 动态响应供电能力的低电压大电流开关电源。图 5(a)所示为平均电流模式控制 PWM 的原理图[1]。将误差电压 Ue 接至电流误差信号放大器(c/a)的同相端,作为输出电感电流的控制编程电压信号 Ucp(Ucurrent- program)。带有锯齿纹波状分量的输出电感电流信号 Ui 接至电流误差信号放大器(c/a)的反相端,代表跟踪电流编程信号 Ucp 的实际电感平均电流。Ui 与 Ucp 的差值经过电流放大器(c/a)放大后,得到平均电流跟踪误差信号 Uca 。再由 Uca 及三角锯齿波信号 UT 或 Us 通过比较器比较得到 PWM 关断时刻。Uca 的波形与电流波形 Ui 反相,所以,是由 Uca的下斜坡(对应于开关器件导通时期)与三角波 UT 或 Us 的上斜坡比较产生关断信号。显然,这就无形中增加了一定的斜坡补偿。为了避免次谐波振荡,Uca 的上斜坡不能超过三角锯齿波信号 UT 或 Us 的上斜坡。

开关电源五种 PWM 反馈控制模式

平均电流模式控制的优点是:

①平均电感电流能够高度精确地跟踪电流编程信号 ;
②不需要斜坡补偿;
③调试好的电路抗噪声性能优越;
④适合于任何电路拓扑对输入或输出电流的控制;⑤易于实现均流。

缺点是:

①电流放大器在开关频率处的增益有最大限制;
②双闭环放大器带宽、增益等配合参数设计调试复杂。

图 5(b)为增加输入电压前馈功能的平均电流模式控制,非常适合输入电压变化幅度大、变化速度快的中国电网情况。澳大利亚 R-T 公司的 48 V/100A 半桥电路通信开关电源模块实际上采用图 5(b)的控制方式。

2.4 滞环电流模式控制 PWM (Hysteretic Current-mode Control PWM)

滞环电流模式控制 PWM 为变频调制,也可以为定频调制[2]。图 6 所示为变频调制的滞环电流模式控制 PWM。将电感电流信号与两个电压值比较,第一个较高的控制电压值 Uc(Uc=Ue)由输出电压与基准电压的差值放大得到,它控制开关器件的关断时刻;第二个较低电压值 Uch 由控制电压 Uc减去一个固定电压值 Uh 得到,Uh 为滞环带,Uch 控制开关器件的开启时刻。滞环电流模式控制是由输出电压值 Uout、控制电压值 Uc 及 Uch 三个电压值确定一个稳定状态,比电流模式控制多一个控制电压值 Uch,去除了发生次谐波振荡的可能性,见图 6 右下示意图。因为 Uch1=Uch2,图 6右下示意图的情况不会出现。

开关电源五种 PWM 反馈控制模式

滞环电流控制模式的优点:
①不需要斜坡补偿;
②稳定性好,不容易因噪
声发生不稳定振荡。

缺点:
①需要对电感电流全周期的检测和控制;
②变频控制容易产生变频噪声。

2.5 相加模式控制 PWM (Summing-mode Control PWM)

图 7 所示为相加模式控制 PWM 的原理图。与图 3 所示的电压模式控制有些相似,但有两点不同[3]:
一是放大器(e/a)是比例放大器,没有电抗性补偿元件。控制电路中电容 C1 较小,起滤除高频开关杂波作用。主电路中的较小的 Lf、Cf 滤波电路(如图中虚线所示,也可以不用)也起减小输出高频杂波作用。若输出高频杂波小的话,均可以不加。因此,电压误差放大没有延时环节,电流放大也没有大延时环节;
二是经过滤波后的电感电流信号 Ui 也与电压误差信号 Ue 相加在一起构成一个总和信号 UΣ与三角锯齿波比较,得到 PWM 控制脉冲宽度。相加模式控制 PWM 是单环控制,但它有输出电压、输出电流两个输入参数。如果输出电压或输出电流变化,那么占空比将按照补偿它们变化的方向而变化。

开关电源五种 PWM 反馈控制模式

相加控制模式的优点是:动态响应快(比普通电压模式控制快 3~5 倍),动态过冲电压小,输出滤波电容需要较少。相加模式控制中的 Ui 注入信号容易用于电源并联时的均流控制。缺点是:需要精心处理电流、电压取样时的高频噪声抑制。

3 结论

1)不同的 PWM 反馈控制模式具有各自不同的优缺点,在设计开关电源选用时要根据具体情况选择合适的 PWM 的控制模式。

2)各种控制模式PWM反馈方法的选择一定要结合考虑具体的开关电源的输入输出电压要求、主电路拓扑及器件选择、输出电压的高频噪声大小、占空比变化范围等。

3)PWM 控制模式是发展变化的,是互相联系的,在一定的条件下是可以互相转化的 。

转载出处:电源网

围观 857

电机控制单电阻采样机制是在一个 PWM 波形内采集两相电流 ADC 数据,但某些扇区边界条件下只能获得一路电流 ADC 数据, 需要对 PWM 波形进行变形用于构造电流采样区域。

背景介绍

根据电机控制拓扑结构,单电阻采样在一个 PWM 控制周期内可以取得两相电流数据:

电机控制单电阻采样 PWM 变形信号产生

电机控制单电阻采样 PWM 变形信号产生

在扇区边沿无法获得两相电流信号。
电机控制单电阻采样 PWM 变形信号产生

波形产生

ST 专利的方法是在波形的中间部分产生变形波形,在变形后的波形上就可以得到两相电流 ADC 数据;

电机控制单电阻采样 PWM 变形信号产生

当然还有目前比较流行的波形移位方法也可以做到相同效果。 波形如下:
电机控制单电阻采样 PWM 变形信号产生

STM32 系列单片机 Timer 有足够的功能,可以产生上面两种波形,机制如下:

PWM 波中间变形

电机控制单电阻采样 PWM 变形信号产生

1. 设定 CCR4 的 DMA 通道,并且设定此时 Timer1 的 preload 为禁止状态;

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);

2. 在 CCR4 比较值部分产生 DMA 事件;

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 2u;
….
TIM_DMACmd(TIM1,TIM_DMA_CC4,ENABLE);

3. 在 1 点上将 CCR1 数据直接修改为周期数据+1;

4. 在 2 点上将 CCR1 数据修改为 CCR1’的数据;

5. 时间计算上按照上面的图示设定,中间凹陷时间为两边补充波形时间之和。

波形移位变形

电机控制单电阻采样 PWM 变形信号产生

1. 设定 Timer1 的 update 事件的 DMA 通道

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(TIM1->CCR1));
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(uint32_t)(hDmaBuff2);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 2u;
……
TIM_DMACmd(TIM1,TIM_DMA_Update,ENABLE);

2. 在 1 点上更新 CCR1 数据为 CCR1 数据;

3. 在 2 点上更新 CCR1 数据为 CCR1’数据;

4. 保证前后的移位时间相同。

来源:ST意法半导体

围观 383

一. TIMER分类:

STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。

定时器

计数器分辨率

计数器类型

预分频系数

产生DMA请求

捕获/比较通道

互补输出

TIM1

TIM8

16位

向上,向下,向上/向下

1-65536之间的任意数

可以

4

TIM2

TIM3

TIM4

TIM5

16位

向上,向下,向上/向下

1-65536之间的任意数

可以

4

没有

TIM6

TIM7

16位

向上

1-65536之间的任意数

可以

0

没有

其中TIM1和TIM8是能够产生3对PWM互补输出,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

二、PWM波形产生的原理:

产生波形原理来源:http://www.ndiy.cn/thread-31081-1-1.html
通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。

三、STM32产生PWM的配置方法:

1、配置GPIO口:

配置IO口的时候无非就是开启时钟,然后选择引脚、模式、速率,最后就是用结构体初始化。不过在32上,不是每一个IO引脚都可以直接使用于PWM输出,因为在硬件上已经规定了用某些引脚来连接PWM的输出口。下面是定时器的引脚重映像,其实就是引脚的复用功能选择:

a.定时器1的引脚复用功能映像:

STM32之PWM波形输出配置总结

b.定时器2的引脚复用功能映像:
STM32之PWM波形输出配置总结

c.定时器3的引脚复用功能映像:
STM32之PWM波形输出配置总结

d.定时器4的引脚复用功能映像:
STM32之PWM波形输出配置总结

根据以上重映像表,我们使用定时器3的通道2作为PWM的输出引脚,所以需要对PB5引脚进行配置,对IO口操作代码:

GPIO_InitTypeDef GPIO_InitStructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //选择Timer3部分重映像
//选择定时器3的通道2作为PWM的输出引脚TIM3_CH2->PB5 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化引脚

2、初始化定时器:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义初始化结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //TIMX预分频的值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据以上功能对定时器进行初始化

3、设置TIM3_CH2的PWM模式,使能TIM3的CH2输出:

TIM_OCInitTypeDef TIM_OCInitStructure;//定义结构体
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//选择定时器模式,TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
TIM_OC2Init(TIM3, &TIM_OCInitStructure);//根据结构体信息进行初始化
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能定时器TIM2在CCR2上的预装载值

4、使能定时器3:

TIM_Cmd(TIM3, ENABLE); //使能定时器TIM3

经过以上的操作,定时器3的第二通道已经可以正常工作并输出PWM波了,只是其占空比和频率都是固定的,我们可以通过改变TIM3_CCR2,则可以控制它的占空比。修改占空比的函数为:TIM_SetCompare2(TIM3,n); n不同,占空比不同。

5、修改pwm波形的占空比:

编写一个函数:void TIM3_PWM_Init(u16 arr,u16 psc);将以上所有的代码都加进来这个函数中,只要在main函数中调用该函数进行初始化,然后使用TIM_SetCompare2()函数修改PWM的占空比就可以在PB5脚得到需要的PWM波形了。关于频率以及占空比的计算方法有以下例子:

int main(void)
{
  TIM3_PWM_Init(9999,143);//频率为:72*10^6/(9999+1)/(143+1)=50Hz
  TIM_SetCompare2(TIM3,4999);//得到占空比为50%的pwm波形
  while(1);
}

可参考:http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/12/29/283...

转自:粥巴坨

围观 566

有客户需要用到高精度的DAC模块,MM32L0系列产品内部没有集成DAC模块,考虑到外接DAC芯片会增加成本,所以在本实验中将为大家介绍使用PWM输出,经过简单的变换电路即可实现DAC,这将大量降低电子设备的成本、减少体积,并提高精度。本实验在PWM到DAC转换关系的理论分析基础上,设计出输出为0~5V电压的DAC。

MM32L0系列产品包含1个高级控制定时器、5个通用定时器(1个32 位定时器和5个16 位定时器),以及 2个看门狗定时器和1个系统嘀嗒定时器。

每个定时器都有 PWM 输出或单脉冲模式输出,所以MM32L0系列产品任意一款型号都可以用PWM做DAC输出功能。

PWM波形的分段函数:

MM32 基于PWM做DAC输出设计

其中:k为谐波次数,N是PWM波一个周期的计数脉冲个数,T是单片机中计数脉冲的基本周期,即MCU每隔T时间记一次数(计数器的值增加或者减少1),t为时间, n是PWM波一个周期中高电平的计数脉冲个数,VH和VL分别是PWM波中高低电平的电压值。

PWM的高低电平分别为VH和VL,理想的情况VL等于0,但是实际中一般不等于0,所以用户在处理PWM的VL时需注意,出现较大误差一般都是因为这个地方。

将上述函数展开成傅里叶级数得到:

MM32 基于PWM做DAC输出设计

从上式可以看出,上式中第1个方括弧为直流分量,第2项为1次谐波分量,第3项为大于1次的高次谐波分量。上式中的直流分量与n成线性关系,并随着n从0到N,直流分量从VL到VL+VH之间变化,这正是电压输出的DAC所需要的。因此,如果能把式中除直流分量的谐波过滤掉,则可以得到从PWM波到电压输出DAC的转换,即:PWM波可以通过一个低通滤波器进行解调。式中的第2项的幅度和相角与n有关,频率为1/(NT),该频率是设计低通滤波器的依据。如果能把1次谐波很好过滤掉,则高次谐波就应该基本不存在了。

在DAC的应用中,分辨率是一个很重要的参数,傅里叶级数公式中的分辨率计算直接与N和n的可能变化有关:

MM32 基于PWM做DAC输出设计

从上式中可看出:
N越大DAC的分辨率越高,但是NT也越大,即 PWM的周期或者傅里叶级数公式中的1次谐波周期也越大,相当于1次谐波的频率也越低,需要截止频率很低的低通滤波器,DAC输出的滞后也将增加。为了使T减少,即减少单片机的计数脉冲宽度(这往往需要提高单片机的工作频率),达到不降低1次谐波频率的前提下提高精度。

MM32L0系列产品最高工作频率可达 48MHz,TIM2是32位的定时器,PWM频率计算公式:
Fpwm = 48M / ((arr+1)*(psc+1))(单位:Hz)
公式中psc就是分频系数,arr就是计数值。预分频器可以将计数器的时钟频率按 1 到 65536 之间的任意值分频。计数值可以从1-4294967295(2的32次方减1)中任意选取。

本次实验采用两阶RC滤波,使用两个电阻和两个电容组成一个具有DAC功能的引脚,PB10是32位的定时器TIM2_CH3通道,PA3和PA4两个通道分别去采集1阶RC滤波和2阶RC滤波后的电压值。

MM32 基于PWM做DAC输出设计

R29和C10的具体参数可根据傅里叶级数公式的第2部分的一次谐波频率来选择,实际应用中一般选择阻容滤波器的截止频率为傅里叶级数公式的基波频率的1/4左右。

RC滤波器的截止频率计算公式:

f = 1/(2πRC)

滤波器是频率选择电路,只允许输入信号中的某些频率成分通过,而阻止其他频率成分到达输出端。在电路中需要考虑到芯片引脚输出端到RC滤波电路之间的存在阻值等问题,上图中的电阻和电容值需要根据实际情况计算调整。

PB10引脚能将不同占空比的PWM信号转换为不同电压值的模拟信号。为了能更准确的获取DAC转换值,电路中还使用了2个ADC通道用来检测DAC转换值。在转换过程中PWM信号频率越快DAC输出的电压值越稳定,PWM位数越高DAC输出的电压值精度越高,32位PWM比16位PWM精度高。

实验程序:

TIM2定时器配置:
u32 OutCnt;

void InitTIM2_PWM(u16 t1, u16 t2, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM2_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM2_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_2);

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_Period = t1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = t2;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Pulse = t2;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}

获取 SysTick 计数器的值:
u32 GetSysTickCount(void)
{
return SysTick_Count;
}

设置 SysTick 重装载值:
void SysTick_Configuration(void)
{
SysTick_Config(48000);
}

SysTick中断配置:
u32 pwm = 150;
void SysTick_Handler(void)
{
if (SysTick_Count ++ > 500)
{
SysTick_Count = 0;
InitTIM2_PWM(1024, pwm, 1);
}
}

主函数:
int main(void)
{
SystemInit();
SysTick_Count = 0;
SysTick_Configuration();
while(1)
{
}
}

操作方法:按照上述硬件搭建实验环境后,上电接上调试器,进入Debug状态,在IAR的Live watch窗口修改pwm值可以实现占空比可调。

实验结果:

MM32 基于PWM做DAC输出设计MM32 基于PWM做DAC输出设计

根据实验现象:
从PWM到DAC输出的信号处理有许多电路实现方法,上述电路实现方法DAC输出的负载能力比较差,适合具有高输入阻抗的后续电路连接,对精度和负载能力要求较高的场合,建议增加基准电压、负载驱动等电路。在MCU的应用中还可以通过软件的方法进行精度调整和误差的进一步校正。

PWM 外设结合本电路所实现DAC 有非常好的差分非线性(DNL)、线性度(INL),8位分辨率的情况下,PWM 频率为50KHz,实测精度在 0.5LSB 以内,适合于输出低频、高精度的模拟信号。

转自: 灵动微电子

围观 1100

理解PWM需要知道的知识

(1)脉冲

解释:电子设备中电平状态发生的突变,通常突变时间很短,突变后极短时间后重新变为为原来的电平状态.(突变状态很短,两次突变间的时间相对较长)

(2)脉冲循环

解释:可以理解为一次突变到下一次突变所花的时间如下图:

浅析LED呼吸灯的实现和PWM的关系

(3)*(重点)占空比

解释:一个脉冲循环内通电时间所占的比例.,如下图:

浅析LED呼吸灯的实现和PWM的关系

举个例子:脉冲宽度1μs,信号周期5μs的脉冲序列即t=1,T=5,经过公式-占空比=t/T可以得到占空比为0.2.

(4)滤波器

解释:滤波器的组成为电感,电容,电阻等元器件.虽然PWM能通过通过改变占空比的方法.使电压的平均值达到稳压值,但输出稳定电压是靠PWM之后接的的滤波器来实现的。

(5)平均电压/输出电压

解释:
平均电压电压在一个周期T内积分之后再除以T.
也可以等同于写成:
输出电压 = (接通时间 / 脉冲时间)* 最大电压值

计算方式(平均电压)的示意图如下:

浅析LED呼吸灯的实现和PWM的关系

PWM的定义

PWN(Pulse-width modulation)的中文名是脉冲宽度调制.那么我们来看一下wikipedia对它的定义:

脉冲宽度调制(英语:Pulse Width Modulation,缩写:PWM),简称脉宽调制,是将模拟信号变换为脉冲的一种技术,一般变换后脉冲的周期固定,但脉冲的占空比会依模拟信号的大小而改变.在模拟电路中,模拟信号的值可以连续进行变化,在时间和值的幅度上都几乎没有限制,基本上可以取任何实数值,输入与输出也呈线性变化。所以在模拟电路中,电压和电流可直接用来进行控制对象,例如家用电器设备中的音量开关控制、采用卤素灯泡灯具的亮度控制等等 ...

计算PWN等效电压

PWM的等效电压计算公式为:

(此处我认为因为是方波所以可以将其视作平均电压)
U =(T1*Umax)/(T1+T2)
T1:导通时间
T2:断流时间
T1+T2 脉冲周期
Umax:电压幅值

所以根据公式可知,由于T1/(T1+T2)正是空占比,所以改变空占比就等于改变了等效电压,所以使得灯泡的亮度发生了变化

为什么Analogwrite的值是0-255?

LED亮度通过调节LED驱动器的PWM占空比来对亮度控制,一个PWM周期可以划分成2的控制位的次方个时钟周期而对大部分LED而言,控制位通常是8位,所以8位PWM能够提供256个亮度级的电平,因此PWM周期由256个时钟周期组成.

脉冲周期/频率和人眼的关系

LED的典型时钟频率是32kHz,那么根据公式PWM周期为256/32kHz=8ms.那么这样对于人眼而言这个闪烁频率很安全的避免了人眼能够觉察的闪烁.

在ARDUINO中使用PWM控制LED灯模拟呼吸灯的实验

实验准备:

实验主设备: Arduino UNO R3(图片来自NRIOBOT)

浅析LED呼吸灯的实现和PWM的关系

其他:
LED灯(若干)
面包板(一块)
杜邦线(双头公若干)
电阻(若干)(可选择/非必需)

连接图示意(通过Fritzing软件制作的简易电路图)

浅析LED呼吸灯的实现和PWM的关系

实验代码:

/*先要介绍一下analogwrite的用法
将模拟值(PWM波)输出到管脚。可用于在不同的光线亮度调节发光二极管亮度或以不同的速度驱动马达。调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())

这种方法也叫快速PWM方式*/

需要上传到ARDUINO中的代码:

//设定使用9号口
void setup (){
pinMode(9,OUTPUT);
}
void loop(){
//由于上文中提到的所以为256种亮度
for (int a=0; a<=255;a++) //控制PWM亮度的增加
{
analogWrite(9,a);
delay(8);
}
for (int a=255; a>=0;a--) //控制PWM亮度减小
{
analogWrite(9,a);
delay(8);
}
delay(300); //完成一个循环
}

Analogwrite和占空比的关系

analogwrite(x,y)

X是管脚,而y(value)就是亮度级(在LED中)

占空比的计算方法就是: 占空比=y/256

对于Analogwrite占空比的一个特殊之处的解释

对于快速PWM模式,如果我们代码用了analogWrite(9, 0)即Y(value)=0,实际上应该有1/256的占空比,然而实际输出的电平为0.这是因为在Arduino的强制设定,当检测到AnalogWrite的value为0,那么就等于关闭了PWM.所以带来的问题是,如果我们设置analogWrite(9, 1),那么占空比2/256,所以在0到1之间产生了一个跳跃,丢弃了占空比为1/256的情况.

总结

这次的python实验中,让我们尝试了怎么使用Arduino和LED灯做出呼吸灯的效果,因为对于机器是怎么输出高电平(5v)和低电平(0v)之间的电压好奇,所以探究了一下原理,总结来说就是机器通过pwm在管脚产生了一定占空比的方波,改变空占比就等同于改变了等效电压,所以使得灯泡的亮度发生了变化.

转自: xlxw<-博客园/a>

围观 940

页面

订阅 RSS - PWM