⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 这是一个车用电机调速器的AVR单片机的整套C语言的源代码
💻 C
字号:
/********************************************************************************************************
* 文 件 名 : Timer.c
* 程 序 员 : (CaiJie) hnclcj@gmail.com
*                             (c) Copyright 2007-2007, CaiJie
*                                  All Rights Reserved
* 创建日期 :  
* 说    明 : 1>
* 修改日期 :
* 修改版本 :
* 说    明 :
********************************************************************************************************/


#include "includes.h"

#define FIL_TAB 10

INT16U FILTER_LIMITR (INT16U DATA);


/********************************************************************************************************
* 功 能 : 定时器0初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 初始化时间为10us
********************************************************************************************************/

void Timer0Init (void)
{
    //TCNT0  = 0x60;
    //TCCR0  = 0x01;

    //CLRBIT(TIMSK, TOIE0);                       // 允许T0工作 (靠通讯协议来处理)
}


/********************************************************************************************************
* 功 能 : 定时器1初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 初始化时间为0us
********************************************************************************************************/

void Timer1Init (void)
{
}


/********************************************************************************************************
* 功 能 : 定时器2初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 初始化时间为1ms
********************************************************************************************************/

void Timer2Init(void)
{
    TCCR2A = 0x02;
    TCCR2B = 0x07;
    OCR2A  = (MCU_Fosc/1024)/OS_TICKS_PER_SEC;
    OCR2B  = 0x0;
    TCNT2  = 0x00;
    ASSR   = 0x00;

    SETBIT(TIMSK2, OCIE2A);                         // 允许T2工作
}


/********************************************************************************************************
* 功 能 : T0定时器益处中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 
********************************************************************************************************/

ISR(SIG_OVERFLOW0)
{
    //TCNT0    = 0x83;                              // 更新定时时间
}


/********************************************************************************************************
* 功 能 : T1定时器益处中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 未用
********************************************************************************************************/
//void SIG_OVERFLOW1( void ) __attribute__ ( ( signal, naked ) );
ISR (SIG_OVERFLOW1)
{
    
    if (ESCBuf.Dm.ICPCtr < 1600){
        ESCBuf.Dm.ICPCtr++;
    }else{
        ESCBuf.Dm.ICPPpm = 0;
        SETBIT(TCCR1B,ICES1);   //将TCCR1B的第6位(ICES1:输入捕获触发方式)置1(ICP1上升沿触发)
        SETBIT(TIFR1,ICF1);
    } 
    //asm volatile ( "reti" ); 
}

/********************************************************************************************************
* 功 能 : T/C1 输入捕捉中断
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 
********************************************************************************************************/

ISR(SIG_INPUT_CAPTURE1)
{
    static  INT16U PWM_TCN; 
    
    INT16U         Ctr;
    INT16U         PWMTop;
     
    if(GETBIT(PPMS_PIN,PPMS)) {
       ESCBuf.Dm.ICPCtr  = 0;
       PWM_TCN           = ICR1;
       CLRBIT(TCCR1B,ICES1);    //将TCCR1B的第6位(ICES1:输入捕获触发方式)置0(ICP1下降沿触发)
       SETBIT(TIFR1,ICF1);
    } else { 
        Ctr    = ESCBuf.Dm.ICPCtr;
        PWMTop = ESCBuf.Dm.PWMTop;
        sei();
        ESCBuf.Dm.ICPPpm = (INT16U) ((((INT32U)Ctr * PWMTop) + ICR1 - PWM_TCN)/(MCU_Fosc/1000000L)) ;
        //Ctr =(INT16U) ((((INT32U)Ctr * PWMTop) + ICR1 - PWM_TCN)/(MCU_Fosc/1000000L)) ;
        //ESCBuf.Dm.ICPPpm = FILTER_LIMITR(Ctr);
        SETBIT(TCCR1B,ICES1);   //将TCCR1B的第6位(ICES1:输入捕获触发方式)置1(ICP1上升沿触发)
        SETBIT(TIFR1,ICF1);
    }
    
}

/********************************************************************************************************
* 功 能 : T2定时器益处中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 10Ms定时
********************************************************************************************************/

ISR (SIG_OUTPUT_COMPARE2A)
{
    b10MSFlg = 1; 
}



/**************************************************************************************************
* 函数名称 : FILTER_Center_Average      
* 功    能 : 中位值平均滤波法(又称防脉冲干扰平均滤波法)
* 入口参数 : 
* 出口参数 : 返回有效的实际值        
* 调用模块 : 无        
* 创建日期 : 2005-11-22
* 原始版本 : V 1.00.0  
* 说    明 :  
*            A、方法:
*                      相当于“中位值滤波法”+“算术平均滤波法”
*                      连续采样N个数据,去掉一个最大值和一个最小值
*                      然后计算N-2个数据的算术平均值
*                      N值的选取:3~14
*            B、优点:
*                      融合了两种滤波法的优点
*                      对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
*            C、缺点:
*                      测量速度较慢,和算术平均滤波法一样
*                      比较浪费RAM
* 修改日期 :
* 修改版本 :
* 修改说明 :
**************************************************************************************************/

/*
 INT16U FILTER_Center_Average (INT16U *value)
{ 
    INT16U temp;
    INT32U Data;

    INT8U i;

    INT16U min = 0xffffL;
    INT16U max = 0x0000L;


    Data=0;

    for (i = 0; i < FIL_TAB; i++){
        temp = *(value+i);
        Data = Data + temp;
        if (temp < min)
             min = temp;
        if (temp > max)
             max = temp;
    }
    return((Data - min - max) / (FIL_TAB - 2)); 
}
*/

/**************************************************************************************************
* 函数名称 : FILTER_LIMITR      
* 功    能 : 限幅消抖滤波法
* 入口参数 : *value   存储采样数据的数组
*            DATA     当前采样数据
*            *index   当前数据的存储索引
*            *Fil_ctr 消抖计数器
* 出口参数 : 返回有效的实际值        
* 调用模块 : 无        
* 创建日期 : 2005-11-22
* 原始版本 : V 1.00.0  
* 说    明 :  
*            A、方法:
*                      根据经验判断,确定两次采样允许的最大偏差值(设为A)
*                      每次检测到新值时判断:
*                      如果本次值与上次值之差<=A,则本次值有效
*                      如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
*            B、优点:
*                      能有效克服因偶然因素引起的脉冲干扰
*            C、缺点
*                      无法抑制那种周期性的干扰
*                      平滑度差
* 修改日期 :           
* 修改版本 :           
* 修改说明 :   
**************************************************************************************************/
/*
INT16U FILTER_LIMITR (INT16U DATA)
{
    INT16U Temp;
    
    
    if(Fil_ctr1 < FIL_TAB){
        Fil_ctr1++;
    } 
    
    Temp = value[index];
    if(DATA >= Temp){
        Temp = DATA - Temp;
    }else{
        Temp = Temp - DATA;
    }
    if (Temp > 100){
        Fil_ctr++;
        if(Fil_ctr > 10){ 
           Fil_ctr = 0;
            for (index = 0;index < FIL_TAB;index++){
                value[index] = DATA;
            }
            if(Fil_ctr1 < FIL_TAB-1){
                return (0);
            }   
            return (DATA);
        }
    }else {
        Fil_ctr = 0;
        if (++index > FIL_TAB-1){
            index = 0;
        }
        value[index] = DATA;
    }
    if(Fil_ctr1 < FIL_TAB-1){
        return (0);
    }
    return (FILTER_Center_Average (value));
}
*/

/********************************************************************************************************
*                                             End of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -