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的值,即可实现动态修改移相相位,此功能对具有反馈调节功能的系统具有非常重要的作用,可以根据反馈来实时修改移相角度,从而使输出更加精确和稳定!!
重要部分代码:
uint32_t Period=0;
Period= 72*1000000 / 100000;//时钟频率72M,输出100k
//其他配置,如GPIO等
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//中心计数模式
TIM_TimeBaseInitStruct.TIM_Period = Period /2;//计数周期为普通模式下计数周期的一半
//其他参数,TIM_TimeBaseInit();
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Asymmetric_PWM1;//非对称PWM模式1
TIM_OCInitStruct.TIM_Pulse =0;//此值为初始化CCRx的值
//初始时没有移相,CCR1=CCR3=0
TIM_OC1Init(PWM_TIM, & TIM_OCInitStruct);
TIM_OC1PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);
TIM_OC3Init(PWM_TIM, & TIM_OCInitStruct);
TIM_OC3PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);
//CCR2=CCR4=Period/2,所以占空比50%
TIM_OCInitStruct.TIM_Pulse = Period/2;
TIM_OC2Init(PWM_TIM, & TIM_OCInitStruct);
//由于选择Channel1和Channel3输出,不需要2,输出,所以不需要PreloadConfig
//TIM_OC2PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);
TIM_OC4Init(PWM_TIM, & TIM_OCInitStruct);
//TIM_OC4PreloadConfig(PWM_TIM, TIM_OCPreload_Enable);
/*
//可以关掉不需要使用的通道
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
TIM_CCxCmd(TIM1, TIM_Channel_4, TIM_CCx_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
*/
//BDTR Init........见之前的博文
//TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct);
//Enable Timer
TIM_Cmd(TIM1, ENABLE);
//Enable PWM output
TIM_CtrlPWMOutputs(TIM1, ENABLE);
//实现移相函数
//只要在软件中动态调用此函数即可实现动态修改移相角度
//参数:第一个是所用定时器,一般为TIM1才有此功能
//第二个参数: 移相角度,最小角度为1/Period度(CCR3=1),最大180度(CCR3=Period/2)
void PWM_Phaseshift(TIM_TypeDef *TIMx,uint16_t phase)
{
TIMx->CCR3 = phase;
TIMx->CCR4 = (uint16_t)(Period/2-phase);
}
关键字:STM32 非对称 PWM模式 动态移相
引用地址:
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搭出来的简易信号发生器,波形非常不规则) 下为示波器的实物图(后面那块小小的东西为简陋的波形发生器):
[单片机]
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输入捕获 作用:对输入信号的上升沿/下降沿/双边沿进行捕获,测量输入信号的脉宽,和
[单片机]
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打开工程文件。 最终要实现的是:
[单片机]
【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
[单片机]
STM32的Systick滴答定时器及延时函数编写
一、Systick滴答定时器是什么? Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。 定时器既是在规定时间之后执行某个操作。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 --------------------------------------------
[单片机]
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]