FTM 模块中断处理程序:测量脉冲频率和占空比
"#include "flashfrequency.h"
#define FTM_MODULE 10000 // FTM模块计数器的最大值 #define FTM_CLK_FREQ 8000000 // FTM模块时钟频率
void FTM0_IRQHandler(void) { static uint32_t rising_edge_time = 0; static uint32_t falling_edge_time = 0; static uint32_t pulse_width = 0; static uint32_t frequency = 0; static uint32_t duty_cycle = 0;
if (FTM0_C0SC & FTM_CnSC_CHF_MASK) // 检查通道0的中断标志位
{
if (FTM0_C0SC & FTM_CnSC_MSB_MASK) // 检查通道0的输入捕获模式
{
rising_edge_time = FTM0_C0V; // 获取上升沿时间
FTM0_C0SC &= ~FTM_CnSC_MSB_MASK; // 切换到下降沿捕获模式
}
FTM0_C0SC &= ~FTM_CnSC_CHF_MASK; // 清除中断标志位
}
else
{
falling_edge_time = FTM0_C0V; // 获取下降沿时间
FTM0_C0SC &= ~FTM_CnSC_MSB_MASK; // 切换到上升沿捕获模式
pulse_width = falling_edge_time - rising_edge_time; // 计算脉冲宽度
frequency = FTM_CLK_FREQ / pulse_width; // 计算频率
duty_cycle = (pulse_width * 100) / (FTM_MODULE + 1); // 计算占空比
// 处理脉冲频率和占空比的数据
// ...
FTM0_C0SC |= FTM_CnSC_CHF_MASK; // 清除中断标志位
}
}
原文地址: https://www.cveoy.top/t/topic/pxHi 著作权归作者所有。请勿转载和采集!