SKEAZ1284 FTM2通道3方波频率和占空比测量程序
#include "SKEAZ1284.h"
void FTM2_Init() { // 使能FTM2模块时钟 SIM_SCGC |= SIM_SCGC_FTM2_MASK;
// 设置FTM2模块为复位状态
FTM2_SC = 0;
// 设置FTM2通道3为输出模式
FTM2_C3SC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;
// 设置FTM2时钟源为内部时钟,分频系数为1
FTM2_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0);
}
float MeasureFrequency() { float frequency;
// 清除计数器
FTM2_CNT = 0;
// 等待上升沿
while (!(FTM2_C3SC & FTM_CnSC_CHF_MASK));
// 记录上升沿计数值
uint16_t risingEdgeCount = FTM2_CNT;
// 清除捕获标志位
FTM2_C3SC &= ~FTM_CnSC_CHF_MASK;
// 等待下降沿
while (!(FTM2_C3SC & FTM_CnSC_CHF_MASK));
// 记录下降沿计数值
uint16_t fallingEdgeCount = FTM2_CNT;
// 清除捕获标志位
FTM2_C3SC &= ~FTM_CnSC_CHF_MASK;
// 计算频率
frequency = 1 / ((risingEdgeCount - fallingEdgeCount) * (1.0 / FTM2_MOD));
return frequency;
}
float MeasureDutyCycle() { float dutyCycle;
// 清除计数器
FTM2_CNT = 0;
// 等待上升沿
while (!(FTM2_C3SC & FTM_CnSC_CHF_MASK));
// 记录上升沿计数值
uint16_t risingEdgeCount = FTM2_CNT;
// 清除捕获标志位
FTM2_C3SC &= ~FTM_CnSC_CHF_MASK;
// 等待下降沿
while (!(FTM2_C3SC & FTM_CnSC_CHF_MASK));
// 记录下降沿计数值
uint16_t fallingEdgeCount = FTM2_CNT;
// 清除捕获标志位
FTM2_C3SC &= ~FTM_CnSC_CHF_MASK;
// 计算占空比
dutyCycle = (risingEdgeCount - fallingEdgeCount) / (float)(risingEdgeCount - 0);
return dutyCycle;
}
int main(void) { FTM2_Init();
while (1) {
float frequency = MeasureFrequency();
float dutyCycle = MeasureDutyCycle();
// 将频率和占空比通过串口输出
// ...
// 延时一段时间
// ...
}
}
// 注意,上述示例中的测量方法假设PTD端口FTM2通道3已经正确配置为产生方波信号。在使用此示例代码前,请确保你已经正确配置了相关寄存器、引脚和时钟,并将串口输出和延时部分的代码根据你的需求进行适当的修改。
原文地址: https://www.cveoy.top/t/topic/pFQV 著作权归作者所有。请勿转载和采集!