STM32非对称PWM模式实现动态移相

发布者:Meiren520最新更新时间:2017-09-30 来源: eefocus关键字:STM32  非对称  PWM模式  动态移相 手机看文章 扫描二维码
随时随地手机看文章

MCU:STM32F334C8T6

STM32有多种PWM模式,实现各种不同的强大功能,本文使用非对称PWM模式,实现可动态改变移相相位的全桥PWM驱动波形

首先什么是非对称PWM模式?

Asymmetric mode allows two center-aligned PWM signals to be generated with a programmable phase shift.

那什么是center-aligned PWM?个人比较浅显的理解为计数器采用中心计数模式时的PWM,如下图所示(截自ST官方参考手册),所以这里和之前讲的PWM中最大的不同之一就是计数器模式的选择,一定是选择中心计数模式,可根据中断的需要选择中心计数模式1,2,3. 选择此模式之后对应的另外一个问题,是和之前的PWM区别之二:计数周期,由于中心对其模式在一个周期内分别向上向下计数一次,所以周期就变成了普通模式下的两倍,要想是输出波的频率不变,那么必须改变自动重装载寄存器ARR的值,使其为普通模式下的一半,则实现了所需要的频率的输出。


非对称PWM也有两种模式:

Asymmetric PWM mode 1 - OC1REF has the same behavior as in PWM mode 1.OC1REFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down.
Asymmetric PWM mode 2 - OC1REF has the same behavior as in PWM mode 2.OC1REFC outputs OC1REF when the counter is counting up, OC2REF when it is counting down.

非对称PWM模式下寄存器非配如下:

– OC1REFC (or OC2REFC) is controlled by TIMx_CCR1 and TIMx_CCR2
– OC3REFC (or OC4REFC) is controlled by TIMx_CCR3 and TIMx_CCR4

例:

可以看出,只要在程序中动态修改CCR3和CCR4的值,即可实现动态修改移相相位,此功能对具有反馈调节功能的系统具有非常重要的作用,可以根据反馈来实时修改移相角度,从而使输出更加精确和稳定!!

重要部分代码:

  1. uint32_t Period=0;  

  2.   

  3. Period= 72*1000000 / 100000;//时钟频率72M,输出100k  

  4.   

  5. //其他配置,如GPIO等  

  6.   

  7.     TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//中心计数模式  

  8.     TIM_TimeBaseInitStruct.TIM_Period = Period /2;//计数周期为普通模式下计数周期的一半  

  9. //其他参数,TIM_TimeBaseInit();  

  10.     TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Asymmetric_PWM1;//非对称PWM模式1  

  11.     TIM_OCInitStruct.TIM_Pulse =0;//此值为初始化CCRx的值  

  12.     //初始时没有移相,CCR1=CCR3=0  

  13.     TIM_OC1Init(PWM_TIM, & TIM_OCInitStruct);  

  14.     TIM_OC1PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);  

  15.     TIM_OC3Init(PWM_TIM, & TIM_OCInitStruct);  

  16.     TIM_OC3PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);  

  17.     //CCR2=CCR4=Period/2,所以占空比50%  

  18.     TIM_OCInitStruct.TIM_Pulse = Period/2;  

  19.     TIM_OC2Init(PWM_TIM, & TIM_OCInitStruct);  

  20.     //由于选择Channel1和Channel3输出,不需要2,输出,所以不需要PreloadConfig  

  21.     //TIM_OC2PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);  

  22.     TIM_OC4Init(PWM_TIM, & TIM_OCInitStruct);  

  23.     //TIM_OC4PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);  

  24.       

  25.     /* 

  26.     //可以关掉不需要使用的通道 

  27.     TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); 

  28.     TIM_CCxCmd(TIM1, TIM_Channel_4, TIM_CCx_Disable); 

  29.     TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); 

  30.     */  

  31.       

  32.     //BDTR Init........见之前的博文  

  33.     //TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct);  

  34.       

  35.     //Enable Timer  

  36.     TIM_Cmd(TIM1, ENABLE);  

  37.       

  38.     //Enable PWM output  

  39.     TIM_CtrlPWMOutputs(TIM1, ENABLE);  

  40.   

  41. //实现移相函数  

  42. //只要在软件中动态调用此函数即可实现动态修改移相角度  

  43. //参数:第一个是所用定时器,一般为TIM1才有此功能  

  44. //第二个参数: 移相角度,最小角度为1/Period度(CCR3=1),最大180度(CCR3=Period/2)  

  45. void PWM_Phaseshift(TIM_TypeDef *TIMx,uint16_t phase)  

  46. {  

  47.     TIMx->CCR3 =  phase;  

  48.     TIMx->CCR4 = (uint16_t)(Period/2-phase);  

  49. }  


关键字:STM32  非对称  PWM模式  动态移相 引用地址:STM32非对称PWM模式实现动态移相

上一篇:STM32F3的ADC使用DMA模式传输转换数据
下一篇:STM32实现任意角度移相全桥PWM

推荐阅读最新更新时间:2024-03-16 15:39

STM32学习日志——主函数框架:时间轮
读大学时候,老师曾教了一种叫时间轮的方法,当时没好好学习。自己在写程序时经常乱用延时,一方面占用CPU资源,原本单片机可以执行更多的任务,却被用来延时,特别浪费,另一方面可能出现各种各样的问题。 使用时间轮的方法,可以使单片机像人一样,以时间为尺度,来规划任务。人可以决定今天几点吃饭,几点看书,几点睡觉。 而单片机依靠定时器的中断,每隔0.5ms进入一次中断,可以设定在任意的时间点执行合适的任务,比如需要usart发送比较重要的数据的,可以让它以1ms间隔发送,比如不重要的数码管显示,可以让他200ms执行一次。而这个框架可以直接套用于主程序。 配置定时器 主程序框架 主程序框架
[单片机]
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包含一个具有192 KB 闪
[单片机]
基于STM32的单通道示波器制作成功
终于把基于STM32的示波器做出来啦!本来想用外部高速AD做一个1Mhz采样率的示波器,由于自己没有制作示波器经验,手头上也没现成的IC,于是就先利用STM32内部的12位AD做了一个简易示波器,小练一下示波器的制作,以后有时间再继续做一个实用性较强的便携式示波器吧。 该示波器的硬件配置为:3.7V锂电池供电,显示屏为带触摸的16位3.2寸TFT液晶,主控芯片为STM32F103VC。为了省事,信号触发采用软件触发,幅值、周期、XY轴偏移都是通过触控屏来设置。(由于宿舍没有函数发生器,下面演示图片中的波形是由LM358搭出来的简易信号发生器,波形非常不规则) 下为示波器的实物图(后面那块小小的东西为简陋的波形发生器):
[单片机]
基于<font color='red'>STM32</font>的单通道示波器制作成功
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
1.实验目的 使用高级定时器,输出两路互补的PWM输出,需要有带死区和不带死区两种情况 2.实验效果 图1:不带死区的两路互补的PWM输出 图2 :带死区的两路互补的PWM输出 3.理论部分 3.1时钟源 内部时钟(基本定时器,通用定时器时钟源来自PCLK1,但高级定时器的时钟源来自PCLK2(72M)) 实践中几乎无需使用:外部时钟模式1、外部时钟模式2 3.2时基单元 组成: 16bit预分频PSC 16bit计数器CNT 8bit重复计数器RCR(高级定时器独有) 16bit自动重装载寄存器ARR 3.3输入捕获 作用:对输入信号的上升沿/下降沿/双边沿进行捕获,测量输入信号的脉宽,和
[单片机]
<font color='red'>STM32</font>学习笔记(4) 高级定时器-两路互补的<font color='red'>PWM</font>输出(带死区和刹车控制)
STM32实现IAP功能的学习笔记
最近因项目需求要实现STM32的在线升级即IAP功能,先将这几天的学习体会和IAP的具体实现总结出来,分享给大家,希望对同样实现IAP的童鞋有所帮助,文中最后会上传名为STM32_Update.zip的压缩文件里面包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码文件供大家参考。所有程序都经过测试,可以直接在原子哥的 开发板 上跑,上位机的升级软件大家可以直接打开 STM32_Update\STM32_UpdateSoftware\Release\STM32_UpdateSoftware.exe来升级,如果需要查看源码请用VS2010打开工程文件。 最终要实现的是:
[单片机]
<font color='red'>STM32</font>实现IAP功能的学习笔记
STM32】搭建基于Eclipse平台的STM32调试环境
以NuttX工程为例,硬件平台STM32F103C8。 1 导入工程 File- Import 选择Existing Code as Makefie Project,点击next 输入工程名字(nuttx)以及工程路径(/home/boots/nuttx) 2 配置MCU调试环境 应用市场下载MCU插件: Help- Eclipse Marketplace :输入mcu并搜索,点击Install进行安装 点击甲壳虫旁边倒三角,点击Debug Configurations...进行Debug 参数配置 双击GDB SEGGER J-LINK Debugging(若成功安装MCU插件,就会出现该选项),新建nuttx
[单片机]
【<font color='red'>STM32</font>】搭建基于Eclipse平台的<font color='red'>STM32</font>调试环境
STM32的Systick滴答定时器及延时函数编写
一、Systick滴答定时器是什么? Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。 定时器既是在规定时间之后执行某个操作。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 --------------------------------------------
[单片机]
<font color='red'>STM32</font>的Systick滴答定时器及延时函数编写
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]
Event Recoder调试组件在<font color='red'>stm32</font>上的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved