28.7
实验4:脉冲周期测量模式
28.7.1
硬件设计
以野火启明6M5开发板例程为例,本实验需要使用两个引脚,使用的PWM输出引脚为额外引出的IO引脚为:P500;用于脉冲输入的测量引脚使用的开发板引出的IO引脚为:P600。如下图所示。

点击可查看大图
注
野火启明6M5开发板例程选用的PWM输出引脚为:P500(AGTOA0);选用的测量引脚为:P600(AGTIO3)。
野火启明4M2开发板例程选用的PWM输出引脚为:P211(AGTOA5);选用的测量引脚为:P415(AGTIO4)。
野火启明2L1开发板例程选用的PWM输出引脚为:P208(AGTOB0);选用的测量引脚为:P402(AGTIO1)。
本次实验需要将PWM输出引脚与测量引脚使用杜邦线连接起来。
28.7.2
软件设计
28.7.2.1
新建工程
由于本实验需要用到PWM波形信号,因此我们直接在前面的“实验2:比较匹配功能(PWM输出)”例程的基础上修改程序。
对于e2studio开发环境:拷贝一份我们之前的e2s工程“28_AGT_PWM_Output”,然后将工程文件夹重命名为“28_AGT_Pulse_Period_Measurement”,最后再将它导入到我们的e2studio工作空间中。
对于Keil开发环境:拷贝一份我们之前的Keil工程“28_AGT_PWM_Output”,然后将工程文件夹重命名为“28_AGT_Pulse_Period_Measurement”,并进入该文件夹里面双击Keil工程文件,打开该工程。
工程新建好之后,在工程根目录下,进入到“src/agt” 文件夹里面新建源文件和头文件:“bsp_agt_pulse_period_measurement.c”和“bsp_agt_pulse_period_measurement.h”。工程文件结构如下。
列表13:文件结构
左右滑动查看完整内容
28_AGT_Pulse_Period_Measurement ├─ ...... └─ src ├─ led │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h ├─ agt │ ├─ bsp_agt_pwm_output.c │ ├─ bsp_agt_pwm_output.h │ ├─ bsp_agt_pulse_period_measurement.c │ └─ bsp_agt_pulse_period_measurement.h └─ hal_entry.c
28.7.2.2
FSP配置
以野火启明6M5开发板为例,打开FSP配置界面,在前面实验2的基础上,本实验需要通过IO引脚输入脉冲信号,因此首先配置AGT及其引脚,然后配置Stacks。
首先在“Pins”配置页中配置AGT3的操作模式配置为“Count Measurement”,并且为该AGT配置相应的引脚,也就是将AGT的AGTIO3信号连接到P600引脚,如下图所示。

点击可查看大图
接着在Stacks中加入第二个AGT模块实例,并按如下图所示配置该AGT模块的属性:

点击可查看大图
28.7.2.3
AGT初始化函数
列表14:代码清单28-10:
AGT初始化
左右滑动查看完整内容
timer_info_t info; //用于获取定时器参数信息
uint32_t period; //用于保存计数器的计数周期
/* AGT 初始化函数*/
voidAGT_Pulse_Period_Measurement_Init(void)
{
/* 初始化AGT 模块*/
R_AGT_Open(&g_timer_agt3_ctrl, &g_timer_agt3_cfg);
/* 获取当前参数*/
(void) R_AGT_InfoGet(&g_timer_agt3_ctrl, &info);
/* 获取计数周期:AGT 的一个周期的计数次数*/
period = info.period_counts;
/* 使能AGT 定时器*/
R_AGT_Enable(&g_timer_agt3_ctrl); //注:对于脉冲宽度/周期测量模式下,使用␣
,→R_AGT_Enable 或R_AGT_Start 函数效果是一致的
/* 启动AGT 定时器*/
//R_AGT_Start(&g_timer_agt3_ctrl);
}
28.7.2.4
AGT脉冲周期测量中断回调函数
列表15:代码清单28-11:
AGT脉冲周期测量中断回调函数
左右滑动查看完整内容
uint32_t pulse_period_time; //测量的脉冲周期时间
volatileuint8_t print_enble_flag; //允许打印测量结果标志
/* AGT 脉冲周期测量中断回调函数*/
voidagt3_pulse_period_measurement_callback(timer_callback_args_t * p_args)
{
staticuint32_t overflow_times = 0; //计数器溢出次数
/* 测量完成事件*/
if (TIMER_EVENT_CAPTURE_A == p_args->event)
{
pulse_period_time = p_args->capture + overflow_times * period; //记
录时间B
overflow_times = 0;
print_enble_flag = 1; //测量完成后允许打印测量结果
}
/* 定时器计数溢出事件*/
elseif (TIMER_EVENT_CYCLE_END == p_args->event)
{
/* 输入捕获期间计数器溢出,则记录溢出次数+1 */
overflow_times++;
}
}
28.7.2.5
hal_entry入口函数
列表16:代码清单28-12:hal_entry入口函数
左右滑动查看完整内容
/* 用户头文件包含*/
#include"led/bsp_led.h"
#include"debug_uart/bsp_debug_uart.h"
#include"agt/bsp_agt_pwm_output.h"
#include"agt/bsp_agt_pulse_period_measurement.h"
// 外部变量声明
externtimer_info_t info; //用于获取定时器参数信息
externuint32_t pulse_period_time; //PWM 周期的时间计数
externvolatileuint8_t print_enble_flag;
voidhal_entry(void)
{
/* TODO: add your own code here */
LED_Init(); // LED 初始化
Debug_UART4_Init(); // SCI4 UART 调试串口初始化
AGT_PWM_Init(); // AGT PWM 输出初始化
AGT_Pulse_Period_Measurement_Init(); // AGT 脉冲周期测量初始化
printf("这是一个AGT 的PWM 输出+ 脉冲周期测量功能实验
");
printf("使用杜邦线连接P500 和P600 引脚,然后打开串口助手查看串口的打印信息
,→");
while(1)
{
float pulse_period_time_us;
if (print_enble_flag)
{
// 打印PWM 脉冲周期测量的计数
printf("Period=%d, ", pulse_period_time);
/* 计算PWM 脉冲周期测量的时间*/
pulse_period_time_us = (float)pulse_period_time / ((float)info.
,→clock_frequency / (float)1000000);
printf("Time=%f us
", pulse_period_time_us);
pulse_period_time = 0; //测量结果打印完后旧数据清零
print_enble_flag = 0; //允许打印测量结果标志位清零
}
// LED1 闪烁指示程序正在运行...
LED1_TOGGLE;
// 间隔1s
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
287.3
下载验证
以野火启明6M5开发板为例,编译并下载程序后,复位开发板使程序重新运行,然后使用杜邦线连接P500和P600引脚,然后打开串口助手查看串口的打印信息。串口会打印出PWM信号的频率和占空比等信息,实验现象如下图所示。

点击可查看大图
通过计算,我们设置PWM输出波形的频率为20 KHz,周期为50us,这与我们测量得到波形周期一致。
全部0条评论
快来发表一下你的评论吧 !