MCU:STM32F334C8T6

最近因某些原因,需要用到任意角度移相的PWM波形来驱动全桥电路,本文记录实现过程。

类似于全桥整流器,将四个二极管换成开关器件,就是全桥逆变器,两个桥臂,需要用四路,两组互补的PWM波形来驱动,但此次的要求中,两组互补PWM波形不是完全相同的,而是有一定的相位差,而且此相位差可能是任意值。

关于互补PWM波的产生,比较简单,上一篇文章中讲了使用通用定时器的方法,本文使用高级定时器或者具有互补输出功能的通用定时器的TIMx_CHy和TIMx_CHyN通道产生,两个定时器分别产生两组互补PWM,并且占空比和频率都可以调节

(参见上一篇文章:如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM )

本文重点在于如何产生任意角度的移相。

于是开始翻阅STM32F334的官方手册,寻找相关定时器同步和主从模式的功能!

Slave mode: Gated mode

The counter can be enabled depending on the level of a selected input.

意思就是一个计时器可以利用输入信号来使能或失能

官方手册中给出了一个例子:

Using one timer to enable another timer
In this example, we control the enable of TIM2 with the output compare 1 of Timer 3. Refer
to Figure 205 for connections. TIM2 counts on the divided internal clock only when OC1REF
of TIM3 is high. Both counter clock frequencies are divided by 3 by the prescaler compared
to CK_INT (fCK_CNT = fCK_INT/3).
1. Configure TIM3 master mode to send its Output Compare 1 Reference (OC1REF)
signal as trigger output (MMS=100 in the TIM3_CR2 register).
2. Configure the TIM3 OC1REF waveform (TIM3_CCMR1 register).
3. Configure TIM2 to get the input trigger from TIM3 (TS=000 in the TIM2_SMCR
register).
4. Configure TIM2 in gated mode (SMS=101 in TIM2_SMCR register).
5. Enable TIM2 by writing ‘1 in the CEN bit (TIM2_CR1 register).
6. Start TIM3 by writing ‘1 in the CEN bit (TIM3_CR1 register).
Note: The counter 2 clock is not synchronized with counter 1, this mode only affects the TIM2
counter enable signal.

STM32F334C8T6这款芯片中,TIM2和TIM3都没有互补PWM输出功能,有互补输出功能的有高级定时器TIM1,通用定时器TIM15,16,17,

而要使用主从模式连接两个定时器,需要两个之间有输出和输入信号

从这三个表可以看出,只能选用TIM1和TIM15,并且TIM15为主TIM1为从

使用TIM1和TIM15的CH1和CH1N分别输出一组互补PWM,用TIM15_CH2输出触发信号OC2REF

确定了选用的定时器,接下来就是写程序,程序大概有以下几个部分:

  1. 计算参数  //参见上一篇文章
  2. 配置输出引脚
  3. 时钟基本配置                //参见上一篇文章
  4. 输出模式和参数配置 //参见上一篇文章
  5. 互补输出配置
  6. 主从模式和触发信号配置
  7. 使能时钟
  8. 修改触发信号//非常重要,否则输出出错
其中配置主从模式步骤如下:
1. Configure the Master Timers using the following functions:
 void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_TRGOSource);
 void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t
TIM_MasterSlaveMode);
2. Configure the Slave Timers using the following functions:
 void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t
TIM_InputTriggerSource);
 void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

部分代码:

//#include "***"
//function name
{
uint16_t pulse=0 ,Period=0,shiftphase=0,deadtime=0;
uint16_t freq = 100000;//需要的频率,设定100k//计算各个参数并赋值给对应变量,不使用死区,所以deadtime=0Period = 72*1000000 / freq; //计时器时钟为72MHz 时PWM 一个周期内的总计数次数pulse= Period * 45 /100 ;  // 脉冲宽度的计数次数,= 总次数* 占空比,占空比45?,可调shiftphase = Period *90/360;//设移相90度shiftphase += 340*72/1000;//移相补偿,此处补偿0.34us,见注释1//配置GPIO 各引脚和相应的复用功能//时钟基本配置,参见上一篇文章TIM_TimeBaseInit(PWM12_TIM, & TIM_TimeBaseInitStruct);TIM_TimeBaseInit(PWM34_TIM, & TIM_TimeBaseInitStruct);
//输出模式和参数配置,参见上一篇文章TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_Pulse = pulse ;//脉宽TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//..........写入其他参数//PWM1,2TIM_OC1Init(TIM15, & TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM15, TIM_OCPreload_Enable);//PWM3,4TIM_OC1Init(TIM1, & TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//触发信号TIM_OCInitStruct.TIM_Pulse =shiftphase;//触发信号的脉宽,也就是移相的量TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC2Init(TIM15, &TIM_OCInitStruct);TIM_OC2PreloadConfig(TIM15, TIM_OCPreload_Enable);//配置主从模式//Master slave modeTIM_SelectOutputTrigger(TIM15, TIM_TRGOSource_OC2Ref);TIM_SelectMasterSlaveMode(TIM15, TIM_MasterSlaveMode_Enable);TIM_SelectInputTrigger(TIM1, TIM_TS_ITR0);TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated);//使能定时器和PWM 输出//TIM_Cmd();//TIM_CtrlPWMOutputs();//使触发信号始终保持有效,非常重要的一步,见注释2while(TIM_GetFlagStatus(TIM15, TIM_FLAG_Trigger) == RESET);TIM_OCInitStruct.TIM_Pulse =Period;TIM_OC2Init(PWM12_TIM, &TIM_OCInitStruct);//完成
}

注释1:移相补偿,由于打开时钟,代码执行等都需要时间,会造成移相不准确,所以需要对移相值进行修正,也就是补偿,代码中给出的值0.34us是在频率100K情况下经测算得到的补偿值,此值在0~300度范围内具有较高精度,能达到+-0.003us(或+-0.02度),补偿值受很多因素影响,如频率,代码执行效率(汇编效率高),芯片芯能等。

移相最小值为1/720
注释2:由于TIM1工作在从模式的gatmode,只有在触发信号为高电平是才有效,计数器才会工作,所以一旦TIM1被触发,要时触发信号时钟处于高电平状态,才能保证TIM1正常工作,不然输出频率,占空比都会变化!(按我的理解此处在PWM_MODE1和TIM_OCPolarity_Low;情况下应设置TIM_Pulse=0,但实际上设置为TIM_Pulse=Period才正确,此处还没有想通为什么)

完整代码:

http://download.csdn.net/detail/wind4study/8562427
效果图:移相90度

wind

2015,04,03

STM32实现任意角度移相全桥PWM相关推荐

  1. STM32F103移相全桥PWM寄存器实现

    STM32F103移相全桥PWM寄存器实现 由于项目需求需要使用单片做一个移相全桥的DCDC电源.采用STM32F103芯片,采用直接控制寄存器实现PWM移相控制 基本原理 两桥臂分别使用定时器TIM ...

  2. 移相全桥PWM发波要求

    移相全桥的拓扑如下图所示,由于谐振电感L1的存在,结合移相控制,使开关管达到零电压开通(ZVS),从而有效的降低了电路的开关损耗和开关噪声,减少了开关过程中的产生的电磁干扰. 移相控制的PWM驱动波形 ...

  3. 基于STM32的单片2KW+全数控移相全桥开关电源研发记录

    STM32系列,带来了用单片低成本32位芯片,开发单片数控移相全桥开关电源的可能. 核心驱动:采用2路带互补.死区控制的定时器,产生2相移相100KHz驱动信号,输出驱动.多通道ADC.移相控制等全硬 ...

  4. STM32移相全桥电源方案

    STM32移相全桥电源方案,源代码,原理图,pcb都有 id=656505358189&

  5. 移相全桥的分析与计算

    转自:http://www.360doc.com/content/17/0110/19/9272174_621594077.shtml 偷瞄大师笔记,终于弄懂移相全桥的分析与计算! 在早期的大功率电源 ...

  6. 移相全桥 matlab仿真,MATLAB中的SISOTOOL在数字式移相全桥中的应用

    在command window输入下列语句: num5=[5.76]; den5=[0.0019008,1]; [num6,den6]=series(num5,den5,num4,den4): (3) ...

  7. 移相全桥的控制模型的建立和仿真

    转自:http://bbs.21dianyuan.com/forum.php?mod=viewthread&tid=226811 (这篇真是太棒啦) 如果对传统PWM控制器的的控制和仿真有兴趣 ...

  8. 移相全桥DCDC通过Simulink扫频得到其传递函数方法(非m脚本)

    目录 模型搭建 扫频操作步骤 获得传递函数 模型搭建 上回说到开环不稳的情况,以为是自己传递函数推导的有问题导致控制器没设计好,于是乎利用Simulink建模电路仿真,通过扫频获得传递函数的方法来验证 ...

  9. 20200417-SiC+移相全桥文献

    目录 SiC+移相全桥文献 SiC+移相全桥文献 高晓璐.基于SiC MOSFET的移相全桥 ZVS变换器研究[D].华中科技大学,2016 (1)绪论:选题背景+软开关技术+磁性材料+新型材料+主要 ...

最新文章

  1. Appium+Python 自动化测试一之:环境安装(Android篇)
  2. 语音识别技术迎风发展,未来五年规模将近300亿
  3. Oracle查询数据库编码
  4. rp软件app流程图_如何开发app软件,流程怎样
  5. 上struts2的xml在lt;result type=quot;redirectquot;gt;参数问题
  6. opencv python destroyAllWindows() destroyWindow() 销毁窗口
  7. udp java_Java实现Udp网络编程
  8. PMP读书笔记(第7章)
  9. python 装饰器的讲解
  10. python log
  11. c++两个文档匹配数据_MongoDB 数据库的命名、设计规范
  12. ceph分布式存储简介
  13. Python基础篇:Python的数据结构
  14. 打印日历Java代码实现
  15. Shell命令提示符
  16. android apk 应用分发平台
  17. java中fido_一文读懂华为FIDO2指纹/3D 面容登录技术
  18. python 发送邮件535, 'Error: authentication failed' 解决
  19. 使用官方连供墨盒,打印机暂停打印的可能解决方案
  20. Wordpress里面的Set Featured Image

热门文章

  1. html5导航栏文字间距,div字间距-div内文字之间间距设置方法
  2. “芯”有灵“蜥”,万人在线!龙蜥社区走进 Intel MeetUp 精彩回顾
  3. hive 执行SQL异常
  4. EasyNVR H5无插件摄像机直播解决方案前端解析之:videojs初始化的一些样式处理
  5. 远程关闭计算机提示拒绝访问权限,如何解决shutdown远程关机win10拒绝访问的问题...
  6. sensor 感光原理和输出格式,sensor图像采集原理
  7. (转)编程的三层境界——器、术、道
  8. JAVA微信小程序小说电子书阅读系统毕业设计 开题报告
  9. 如何让电脑在指定时间内自动播放和关闭音乐
  10. 【电源】之【常用稳压IC大全】