📄 timer.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 + -