中级会员
 
- 积分
- 290
- 金钱
- 290
- 注册时间
- 2024-12-9
- 在线时间
- 16 小时
|
前言
这篇应用笔记介绍了如何使用 AT32 定时器进行 PWM 输入测试。注:本应用笔记对应的代码是基于雅特力提供的V2.x.x 板级支持包(BSP)而开发,对于其他版本BSP,需要注意使用上的区别
支持型号列表:AT32F 系列,AT32L 系列
说明:本文档仅供有需求的小伙伴参考,源文档及附件可访问雅特力官网获取https://www.arterytek.com/cn/support/index.jsp?index=1
1.AT32 定时器说明
1.1定时器框架介绍
定时器由一个 16 位的自动装载计数器组成(TMR2 和 TMR5 较为特殊,其自动装载计数器为 32位),它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补 PWM 等)。使用定时器预分频器和 CRM 时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

定时器由四个主要部分组成(见图 1)。第一部分时钟单元。此单元提供定时器的时钟驱动。第二部分时钟基单元,此单元提供定时器计数功能。第三部分输入捕获,此单元允许输入信号进入定时器模块。第四部分输出比较,此单元将定时器整合后的 PWM 输出。
1.2 定时器一般配置步骤
1) 时钟使能。crm_periph_clock_enable(CRM_TMR2_PERIPH_CLOCK, TRUE);
2) 初始化定时器参数,设置自动重装值,分频系数,计数方式等。在库函数中,定时器的初始化参数是通过初始化函数 tmr_base_init ()及 tmr_cnt_dir_set()实现的:
void tmr_base_init(tmr_type* tmr_x, uint32_t tmr_pr, uint32_t tmr_div);其中,第一个参数是确定是哪个定时器,这个比较容易理解。第二个参数 tmr_pr 是定时器计数的周期值。第二个参数 tmr_div 是定时器的分频系数。
void tmr_cnt_dir_set(tmr_type *tmr_x, tmr_count_mode_type tmr_cnt_dir);其中,第一个参数是确定是哪个定时器,第二个参数 tmr_cnt_dir 为定时器的计数模式(向上,向下,中央对齐)。
特别地,增强模式是 TMR2 和 TMR5 独有的功能。tmr_32_bit_function_enable()为增强模式使能(Plus Mode Enable)函数。开启 TMRx 增强模式,该模式下 TMRx_CVAL,TMRx_PR,TMRx_CxDT 由 16 位扩展为 32 位。void tmr_32_bit_function_enable(tmr_type *tmr_x, confirm_state new_state);
当需要配置时钟除频参数时(注意和 TMR_DIV 的区别,配置滤波、死区时间时需配置该参数),会使用到 tmr_clock_source_div_set()函数;当需要配置重复周期寄存器时(高级定时器TMR1/TMR8/TMR15 才有),会使用到 tmr_repetition_counter_set()函数。本例程不使用这两个函数,仅做简要介绍。
void tmr_clock_source_div_set(tmr_type *tmr_x, tmr_clock_division_type tmr_clock_div);void tmr_repetition_counter_set(tmr_type *tmr_x, uint8_t tmr_rpr_value);
3) 设置 TMRx_ IDEN 允许更新中断。void tmr_interrupt_enable(tmr_type *tmr_x, uint32_t tmr_interrupt, confirm_state new_state);这里着重描述参数 tmr_interrupt,它是用来指明我们使能的定时器中断的类型,定时器中断的类型有很多种,包括更新中断,触发中断,以及输入捕获中断等等。
4) TMRx 中断优先级设置。调用 nvic_irq_enable()函数即可。
5) 允许 TMRx 工作,也就是使能 TMRx。void tmr_counter_enable(tmr_type *tmr_x, confirm_state new_state);
6) 编写中断服务函数。
2.规格说明
2.1AT32 PWM 高频测试说明

测试高频信号时,将高频信号输入作为定时器 TMR2 的时钟源(如上图所示),驱动定时器 TMR2的 Counter 计数,使用另一个定时器做时钟基准,例如每隔 1s,获取 TMR2 的 Counter 变化值,则 TMR2 的变化值即为高频信号的频率值。
使用两个定时器,其中一个定时器为 TMR2(这里选取 TMR2 的原因在于其可以通过设置TMRx_CTRL1 中的 PMEN 位,开启 TMRx 增强模式,该模式下 TMRx_CVAL,TMRx_PR,TMRx_CxDT 由 16 位扩展为 32 位),测试高频时,有利于 Counter 计数,不容易产生溢出。
这样做的好处在于,既可以测试高频信号:最高 50MHz(受限于 I/O 口的最高频率),且没有频繁产生中断,代码也有冗余,去处理客户任务。
使用此方法测试的频率范围在:50MHz 到 1Hz(TMR2 的工作频率为 240MHz)。
注意:增强模式是TMR2和TMR5独有的功能,使用不支持增强模式的其他TMR,或使用不含有增强模式TMR的AT32时,测试频率会受限。
2.2AT32 PWM 低频测试说明

测试低频信号时,将低频信号输入作为定时器TMR2的捕获输入(如上图所示),触发TMR2的输入捕获中断,利用TMR2工作时钟除以两次输入捕获之间Counter变化值,即可得到低频信号频率值。这里定时器为TMR2(这里选取TMR2的原因在于其可以通过设置TMRx_CTRL1中的PMEN位,开启TMRx增强模式,该模式下TMRx_CVAL,TMRx_PR,TMRx_CxDT由16位扩展为32位),有利于低频测试。使用此方法测试的最低频率为:56mHz。(TMR2的工作频率在240MHz)。
注意:增强模式是TMR2和TMR5独有的功能,使用不支持增强模式的其他TMR,或使用不含有增强模式TMR的AT32时,测试频率会受限。
2.3AT32 PWM 占空比测试原理说明

测试PWM占空比时,利用门控模式(Hang Mode)方式来测量(如上图所示),将输入信号同时作为两个定时器的输入信号,利用输入信号来控制定时器的Counter计数。一个定时器在输入信号的高电平阶段计数,另一个定时器在输入信号的低电平阶段计数,使用第三个定时器作为时间基准,例如产生1s的中断,在中断内,获取这段时间内,两定时器Counter计数值,将两值做比值即可获取当前的PWM占空比。
这里定时器为TMR2和TMR5(这里选取TMR2、TMR5的原因在于其可以通过设置TMRx_CTRL1中的PMEN位,开启TMRx增强模式,该模式下TMRx_CVAL,TMRx_PR,TMRx_CxDT由16位扩展为32位),有利于测试。
这样做的好处在于,可以测量较高频率的占空比值,例如 10MHz 内,误差在 1%以内。且没有频繁产生中断,代码也有冗余,去处理客户任务。
注意:增强模式是TMR2和TMR5独有的功能,使用不支持增强模式的其他TMR,或使用不含有增强模式TMR的AT32时,测试频率会受限。
3.PWM Test 快速使用方法
3.1硬件资源
1) AT-START-F403A 实验板

注意:该 Demo 是基于 AT32F403A 的硬件条件,若使用者需要在 AT32 其他型号上使用,请修改相应配置即可。
3.2pwm input test demo 使用
- 打开pwm input test project源程序,其中,在at32f403a_407_clock.h里面有三个宏定义:
[url=]复制[/url]
- #define high_frequency_test
- #define low_frequency_test
- #define duty_ration_test
分别用于测试高频信号,低频信号,PWM占空比,打开需要测试的宏【注意:每次只开一个宏】。打开pwm output源程序,其中,在at32f403a_407_clock.h中有三个宏定义:
[url=]复制[/url]
- #define Output_High_Frequency
- #define Output_Low_Frequency
- #define Output_PWM_Duty_Ration_10
分别产生高频信号,低频信号,PWM占空比用于测试。AT-START板载的AT-LINK-EZ自带串口输出功能,它可以将USART1_TX口PA9输出至PC。也可使用其他串口工具进行测试结果的输出。
1) 打开pwm output源程序宏定义:#define Output_High_Frequency,PA8产生60MHz PWM(I/O口已超频工作,可适当降低主频)。编译下载到实验板1。
2) 打开pwm input test程序宏定义:#define high_frequency_test,编译下载到实验板2。
3) 将实验板1的PA8接入到实验板2的PA0,USART1通过PA9输出当前的PWM频率信息。串口打印信息如下:

1) 打开pwm output源程序宏定义:#define Output_Low_Frequency,PA8产生500mHzPWM。编译下载到实验板1。
2) 打开pwm input test程序宏定义:#define low_frequency_test,编译下载到实验板2。
3) 将实验板1的PA8接入到实验板2的PA0,USART1通过PA9输出当前的PWM频率信息。串口打印信息如下(应将第一个数据舍弃):

1) 打开pwm output源程序宏定义:#define Output_PWM_Duty_Ration_10,PA8产生6MHzPWM,占空比为10%。编译下载到实验板1。
2) 打开pwm input test程序宏定义:#define duty_ration_test,编译下载到实验板2。
3) 将实验板1的PA8接入到实验板2的PA0,USART1通过PA9输出当前的PWM占空比信息。串口打印信息如下:

|
|