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