#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已经正确配置为产生方波信号。在使用此示例代码前,请确保你已经正确配置了相关寄存器、引脚和时钟,并将串口输出和延时部分的代码根据你的需求进行适当的修改。

SKEAZ1284 FTM2通道3方波频率和占空比测量程序

原文地址: https://www.cveoy.top/t/topic/pFQV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录