1327|6

67

帖子

0

TA的资源

一粒金砂(中级)

【HC32F448测评】+用高级定时器6输出PWM [复制链接]

本帖最后由 dmzdmz666666 于 2023-8-31 19:46 编辑

第六篇:用高级定时器6输出PWM波

这篇文章将来测评HC32F448的高级定时器6输出任意频率和占空比的PWM波、一组互补的PWM波、一组互补的带死区PWM波。

image-20230831193658-15.png

首先Timer6支持的时钟为200MHz,理论上在锯齿波计数模式下,最高能输出单边对齐的占空比50%的100MHz方波;在三角波计数模式下,最高能输出对称的占空比50%的50MHz方波。原因在于在锯齿波计数模式下,周期值可以设置为2,对比值为1,当上溢到周期值后,一个PWM波就生成完毕了。而在锯齿波计数模式下,周期值可以设置为2,对比值为1,当上溢到周期值后,只生成了半个PWM波,当下溢到周期值后,又生成了半个,这样才是完整的PWM波。(以计数值从0到溢出再到0为例)

 

image-20230831193658-16.png   image-20230831193658-17.png  

 

1、这里面有意思的是这个缓存功能,分为单缓存和双缓存。

这里需要知道人家通用周期基准值寄存器有3个(TMR6_PERAR、TMR6_PERBR、TMR6_PERCR),通用比较基准值寄存器有6个(TMR6_GCMAR、TMR6_GCMBR、TMR6_GCMCR、TMR6_GCMDR、TMR6_GCMER、TMR6_GCMFR

而单缓存的作用在于在发生递加计数上溢点或递减计数下溢点等缓存传送节点时将PERBR的值更新至PERAR,将GCMCR的值更新至GCMAR,将GCMDR的值更新至GCMBR

双缓存是在缓存传送节点时将PERCR的值更新至PERBR,将PERBR的值更新至PERAR,将GCMER的值更新至GCMCR,将GCMCR的值更新至GCMAR,将GCMFR的值更新至GCMDR。将GCMDR的值更新至GCMBR

上面说的是比较输出,捕获输入的方向与之相反。

我认为缓存的意义在于可以快速的准确的更新比较值大小,也就是占空比,因为它是在一个完整的PWM波过后更新的,不会影响前一个PWM波的完整性。但经过实际测试,我感觉优势不大,或者说在我这种使用常见下并没有什么用,下面我会说的。

2、HC32F448的死区分为软件死区和硬件死区软件死区就是设置合理的比较值(GCMAR、GCMBR)和极性,使其产生带死区的互补PWM波。硬件死区就是设置合理的比较值(GCMAR)和死区时间值(DTUAR、DTDAR),而GCMBR是根据这3个寄存器(GCMAR、DTUA、DTDAR)计算出来的。具体的说,在上溢过程中,GCMBR=GCMAR-DTUAR,下溢过程中,GCMBR=GCMAR-DTDAR,同时也支持单缓存,具体怎么样呢,下面会测试。

3、其他特色功能我没怎么用,所以就不赘述了。

--------------------开始移植-------------------

这里需要用到的资源包括定时器6。

首先,在Hardware文件夹中新建Timer6.c等C文件及其对应的h头文件。同时还要添加hc32_ll_tmr6.c的库函数。还要记得使能hc32f4xx_conf.h的对应组件。

Timer6的初始化大致分为

  1. 使能对应时钟FCG2_PERIPH_TMR6_1
  2. 开启GPIO复用功能
  3. 设置时钟源
  4. 设置周期值
  5. 设置死区(可选)
  6. 设置缓存模式及传送节点
  7. 设置PWM的起始、溢出等极性
  8. 设置比较值
  9. 设置PWM模式,是比较输出还是捕获输入。
  10. 使能PWM输出
  11. 开启定时器

这里我挑几个讲,其他可以看我提供的测试程序。

首先是设置时钟源,这个设置合适的分频数和周期数,因为周期基准寄存器(如TMR6_PERAR)只有16位,PeriodValue最多设置65536,所以你的最低频率是200MHz / ClockDiv / 65536,最低频率是200MHz / ClockDiv ,我这里就选择不分频,这样好计算一些,同时频率可以设置较高。然后设置周期数PeriodValue,也就是决定输出频率,有两种方式,如下图所示,我推荐第2种,这样修改起来更方便。还有一点需要注意,在三角波计数模式下,实际输出的频率为200MHz / (2*PeriodValue),具体原因如开头介绍的。

 

image-20230831193658-18.png

缓存模式我这里选择不使能,具体原因我下面会测试。

 

image-20230831193658-19.png  

缓存时间配置有下面4种,下图1,具体寄存器及定义如下图2

 

image-20230831193658-20.png

 

image-20230831193658-21.png

设置PWM的起始、溢出等极性,个人觉得比较重要的是CompareValue、StartPolarity、StopPolarity、CountUpMatchAPolarity、CountDownMatchAPolarity、CountUpMatchBPolarity、CountDownMatchBPolarity。CompareValue也就是比较值也有两种方式,推荐第二种

 

image-20230831193658-22.png

 

StartPolarity、StopPolarity决定了起始和停止的输出极性,

如果StartPolarity=TMR6_PWM_HIGH,StopPolarity=TMR6_PWM_HIGH,

么你设置的比较值决定了正占空比;

如果StartPolarity=TMR6_PWM_LOW,StopPolarity=TMR6_PWM_LOW

那么你设置的比较值决定了负占空比;
CountUpMatchAPolarity、CountDownMatchAPolarity、CountUpMatchBPolarity、CountDownMatchBPolarity这4个参数决定了上溢或者下溢时的PWM极性。有以下4种配置

#define TMR6_PWM_LOW                        (0x00U)

#define TMR6_PWM_HIGH                       (0x01U)

#define TMR6_PWM_HOLD                       (0x02U)

#define TMR6_PWM_INVT                       (0x03U)

对于PWMA,其对应的比较值寄存器为GCMAR时,当溢出时要翻转,当比较值寄存器GCMBR溢出时要保持;同样的,对于PWMB,其对应的比较值寄存器为GCMBR时,当溢出时要翻转,当比较值寄存器GCMAR溢出时要保持,具体程序如下图。

image-20230831193658-23.png  

 

 

-------------------------实际测试---------------------

 

1、首先输出10KHz的PWM波,PWMA也就是PA8输出正占空比为40%;PWMB也就是PA7输出负占空比为40%

TMR6_SetPeriodValue(CM_TMR6_1, TMR6_PERIOD_REG_A, 10000);

TMR6_SetCompareValue(CM_TMR6_1, TMR6_CMP_REG_A, 4000U);

TMR6_SetCompareValue(CM_TMR6_1, TMR6_CMP_REG_B, 4000U);

 

image-20230831193658-24.png

 

还可以通过按键来切换成输出100KHz的PWM波,PWMA输出正占空比为20%;PWMB输出负占空比为90%

 

image-20230831193658-25.png

 

image-20230831193658-26.png

 

这里也测试了一下缓存传送,

设置stcBufConfig.u32BufTransCond = TMR6_BUF_TRANS_UDF;

然后在初始化程序和按键中关于TMR6_SetCompareValue函数改成

TMR6_SetCompareValue(CM_TMR6_1, TMR6_CMP_REG_C, 2000U);

TMR6_SetCompareValue(CM_TMR6_1, TMR6_CMP_REG_D, 9000U);

还有使能对应缓存传送

TMR6_GeneralBufCmd(CM_TMR6_1, TMR6_CH_A, ENABLE);

TMR6_GeneralBufCmd(CM_TMR6_1, TMR6_CH_B, ENABLE);

其他保持一致,发现效果跟不开启缓存是一致,我个人觉得还不如不开启缓存传送来的方便,还不需要配置缓存模式,直接修改更方便。

这里需要注意,如果要使用周期基准的缓存传送,需要用到TMR6_PeriodBufConfig()和TMR6_PeriodBufCmd(),上面的程序只配置比较值基准的缓存传送。

然后测试一下死区,具体配置如下

 

image-20230831193658-27.png

 

实际测量死区时间为500 *1/200M=2.5us,符合设置。PWMB的负占空比变为了35%。但是我发现不开启死区时间设定,直接将PWMB的比较值改成3500是同样的效果,所以说实际上硬件死区就是确定了PWMA的比较值和死区时间,系统自动算PWMB的比较值,其实道理都一样的。

 

image-20230831193658-28.png

至此,定时器6和PWM输出就测评好啦,功能还是很强的。

HC32F448_TIMER6_PWM.zip

1.31 MB, 下载次数: 3

最新回复

没有直接干的库函数吗?好复杂   详情 回复 发表于 昨天 20:07

回复

67

帖子

0

TA的资源

一粒金砂(中级)

欢迎大家交流和提出问题


回复

3191

帖子

1

TA的资源

版主

死区时间是固定的吗?更改不同的频率死区会变化吗?  

点评

死区时间是固定的 你改变了频率 那死区时间是不会改变的 改变的只是死区时间在整个周期里面的占比  详情 回复 发表于 2023-9-1 11:41

回复

4578

帖子

3

TA的资源

版主

Timer6的初始化大致分为

  1. 使能对应时钟FCG2_PERIPH_TMR6_1
  2. 开启GPIO复用功能
  3. 设置时钟源
  4. 设置周期值
  5. 设置死区(可选)
  6. 设置缓存模式及传送节点
  7. 设置PWM的起始、溢出等极性
  8. 设置比较值
  9. 设置PWM模式,是比较输出还是捕获输入。
  10. 使能PWM输出
  11. 开启定时器

回复

67

帖子

0

TA的资源

一粒金砂(中级)

秦天qintian0303 发表于 2023-9-1 08:51 死区时间是固定的吗?更改不同的频率死区会变化吗?  

死区时间是固定的 你改变了频率 那死区时间是不会改变的 改变的只是死区时间在整个周期里面的占比


回复

109

帖子

0

TA的资源

一粒金砂(中级)

感谢老铁提供资料文件,非常感谢,下载学习一下!!



回复

6361

帖子

2

TA的资源

五彩晶圆(中级)

没有直接干的库函数吗?好复杂

个人签名

默认摸鱼,再摸鱼。2022、9、28


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
发个“全国大学生电子设计竞赛获奖作品”

本帖最后由 paulhyde 于 2014-9-15 03:09 编辑 全国大学生电子设计竞赛是个很好的比赛,锻炼了电子信息工程及其它相关专业的学 ...

给初学单片机的40个经典实验!

本帖最后由 paulhyde 于 2014-9-15 03:36 编辑 初学单片机准备电子设计大赛的时候,这个资料对我帮助很大,也拿出来跟大家分享 ...

SDRAM串口实验之修改篇【可以正常试验了】

前些天,购买了一块Espier V1.1的FPGA电路板,看中的是Cyclone4 这块比较高级的芯片,同时板子上有256Mbit SDR SDRAM,资源比较 ...

基于STM32F7的视觉小球颜色识别系统--完结

本帖最后由 wwchang 于 2015-12-28 10:29 编辑 项目名称:基于STM32F7的视觉小球颜色识别系统项目简介:用STM32F7驱动摄像头, ...

MSP430FR2311 中 UART 通讯的累积误差分析计算和时钟频率优选

简介在UART通讯设计中,工程师会根据系统需要先选定合适的波特率(Baud Rate),然后选择合适的时钟源频率,以使UART传输数据时 ...

BQ76940采样芯片损坏问题

问题:采用BQ76940设计一款23串保护板,在测试的过程中发现一个比较严重的BUG,就是在采样线脱落或者电池组断裂的时候,BQ芯片或 ...

单片机选型表

各位大神,谁可以提供一下选型表?最好是那种哪个型号适用于哪个方面的那种,要32位的。

正式入坑FPGA,说说这些天的经历

本帖最后由 littleshrimp 于 2020-4-3 15:26 编辑 这些年一直想玩玩高速AD采集,因为没弄过FPGA很多时候都放着现成的ADC用不 ...

TI C6000DSP网络应用程序的开发

本帖最后由 灞波儿奔 于 2020-10-5 22:14 编辑 如果编程人员熟悉Windows平台的SOCKET的使用,那么在DSP平台上一样可以很容易 ...

关于按键去抖 走向死胡同了

大神关于按键去抖 走向死胡同了 求解救 我想用定时器10ms中断进行软件去抖 求大神指点一二

关闭
站长推荐上一条 1/10 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表