打印
[资料分享与下载]

k60学习——FTM模块

[复制链接]
1116|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
奥德赛|  楼主 | 2015-7-14 09:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
综述:
弹性定时器模块( FTM )是一个支持输入捕捉,出比较和产生PWM信号来控制电动机和源管理应用的 2-8通道定时器。FTM 时钟参考是一个可以作为无符号或有符号的 16 位计数器。

相关函数:
初始化
FTM_PWM_init(ftmn模块号, CHn ch通道号, u32 freq频率(Hz), u32 duty占空比)
设置通道占空比
void FTM_PWM_Duty(FTMn ftmn, CHn ch, u32 duty)
设置FTM的频率
void FTM_PWM_freq(FTMn ftmn, u32 freq)
输入捕捉初始化函数
void FTM_Input_init(FTMn ftmn, CHn ch, Input_cfg cfg)

例程:
/*************************************************************************
*                             野火嵌入式开发工作室
*                             FTM 输入捕捉中断测试
*
*  实验说明:野火 FTM 输入捕捉中断实验,用LED显示是否进入了中断。
*
*  实验操作:这里用 FTM1_CH0 输入捕捉 ,即 PTA8 管脚。
*            PTA9 产生方波 ,把 PTA9 和 PTA8 短接 ,
*            即PTA9产生的上升沿来触发 FTM1_CH0 中断
*
*  实验效果:LED0闪烁
*
*  实验目的:测试  FTM1_CH0 输入捕捉功能
*
*  修改时间:2012-2-29     已测试
*
*  备    注:FTM.h 里有各个FTM通道所对应管脚的表格,方便查看
*
*************************************************************************/
void main()
{
    DisableInterrupts;            //禁止总中断

    gpio_init(PORTA, 9, GPO, HIGH);               //初始化PTA9,输出高电平
    LED_INIT();                                  //初始化LED, FTM1_IRQHandler 中断函数里闪烁LED0
    FTM_Input_init(FTM1, CH0, Rising);           //初始化FTM输入捕捉模式,上升沿触发

    EnableInterrupts;                                 //开总中断

    while(1)
    {
        gpio_set(PORTA, 9, LOW);                //PTA9产生低电平

        time_delay_ms(250);                     //延时一下

        gpio_set(PORTA, 9, HIGH);               //PTA9产生高电平

        time_delay_ms(250);                     //延时一下
    }
}

/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:FTM1_IRQHandler
*  功能说明:FTM1输入捕捉中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-2-25
*  备    注:引脚号需要根据自己初始化来修改,参考现有的代码添加自己的功能
*************************************************************************/
void FTM1_IRQHandler()
{
    u8 s = FTM1_STATUS;             //读取捕捉和比较状态  All CHnF bits can be checked using only one read of STATUS.
    u8 CHn;
    FTM1_STATUS = 0x00;             //清中断标志位

    CHn = 0;
    if( s & (1 << CHn) )
    {
        FTM_IRQ_DIS(FTM1, CHn);     //禁止输入捕捉中断
        /*     用户任务       */
        LED_turn(LED0);             //翻转LED0


        /*********************/
        //不建议在这里开启输入捕捉中断,而是在main函数里根据需要来开启
        //通道 CH0、CH1、Ch2、Ch3 有滤波器
        FTM_IRQ_EN(FTM1, CHn); //开启输入捕捉中断
        //delayms(10);        //因为输入的信号跳变过程不稳定,容易触发多次输入捕捉,所以添加延时
        //但考虑到中断不应该过长延时,所以开输入捕捉中断就放在main函数里,根据需要来开启
    }

    /* 这里添加 n=1 的模版,根据模版来添加 */
    CHn = 1;
    if( s & (1 << CHn) )
    {
        FTM_CnSC_REG(FTM1_BASE_PTR, CHn) &= ~FTM_CnSC_CHIE_MASK; //禁止输入捕捉中断
        /*     用户任务       */


        /*********************/
        //不建议在这里开启输入捕捉中断
        //FTM_CnSC_REG(FTM1_BASE_PTR,n) |= FTM_CnSC_CHIE_MASK;  //开启输入捕捉中断
    }

}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

397

帖子

3

粉丝