#include "SKEAZ1284.h"

#define F_CPU 8000000UL // KEA128工作频率为8MHz #define PRESCALER 1

void delay_us(uint32_t us) { uint32_t cycles = F_CPU / (1000000UL * PRESCALER) * us; while (cycles--); }

void delay_ms(uint32_t ms) { while (ms--) { delay_us(1000); } }

int main(void) { // 初始化PTC2作为输入引脚 PTC_BASE_PTR->PDDR &= ~(1 << 2);

// 初始化FTM0
SIM_SCGC |= SIM_SCGC_FTM0_MASK; // 使能FTM0时钟
FTM0_SC = 0; // 禁用FTM0
FTM0_CNTIN = 0; // 设置FTM0计数器初始值为0
FTM0_MOD = 0xFFFF; // 设置FTM0计数器溢出值为65535
FTM0_SC = FTM_SC_CLKS(1) | FTM_SC_PS(PRESCALER); // 选择系统时钟作为FTM0时钟源,并设置预分频器

while (1) {
    // 等待方波上升沿
    while (!(PTC_BASE_PTR->PDIR & (1 << 2)));
    
    // 记录上升沿时间
    uint32_t start_time = FTM0_CNT;
    
    // 等待方波下降沿
    while (PTC_BASE_PTR->PDIR & (1 << 2));
    
    // 计算方波周期
    uint32_t end_time = FTM0_CNT;
    uint32_t period = end_time - start_time;
    float frequency = (float)F_CPU / (PRESCALER * period);
    
    // 计算空占比
    uint32_t high_time = period - (end_time - FTM0_CNT);
    float duty_cycle = (float)high_time / period * 100;
    
    // 输出结果
    printf("频率 = %.2f Hz, 空占比 = %.2f %%

", frequency, duty_cycle);

    delay_ms(1000); // 延时1秒钟
}

return 0;

}

// 该程序使用FTM0模块来测量方波的频率和空占比。首先,通过设置PTC2作为输入引脚,将方波信号接到该引脚上。然后,初始化FTM0模块,并设置预分频器,以便对方波进行计数。在主循环中,程序等待方波的上升沿和下降沿,并记录两个时间点。通过计算时间差,可以得到方波的周期。然后,通过计算高电平时间与周期的比例,可以得到方波的空占比。最后,程序输出频率和空占比的结果,并延时1秒钟后再次进行测量。

请注意,这个示例代码可能需要根据具体的硬件配置和需求进行调整和修改。


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

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