📄 capture_pulse.h
字号:
sys_data_type TIM_FLAGS;
#define zs_flag TIM_FLAGS.Bit.BIT0 //转速信号有信号标志
#define cs_flag TIM_FLAGS.Bit.BIT1
#define pulse_flag TIM_FLAGS.Bit.BIT2
unsigned char zs_count=0; //转速脉冲计数器
unsigned int zs_temp=0;
unsigned int zs[21];
unsigned char cs_count=0; //车速脉冲计数器
unsigned int cs_temp=0;
unsigned int cs[11];
unsigned char lch_count=0;
unsigned long licheng=0;
void Init_Tim(void)
{
//转速
// T1SC=0x00; //2分频
T1SC=0x03; //8分频
// T1MODH=0xc3; //50000
// T1MODL=0x50;
T1SC1=0x48; //下降沿捕捉中断
//车速
// T2SC=0x44; //16分频
T2SC=0x46; //64分频
// T2MODH=0x00; //0
// T2MODL=0x00;
T2SC1=0x48; //下降沿捕捉中断
}
//***********************定时器2中断服务函数***********************************
void interrupt 9 TIM2_INTSVR(void)
{
T2SC_TOF=0; //清溢出中断标志
if(cs_flag&&cs_count!=11)
{
//cs=0;
cs_count=0;
}
cs_flag=1;
}
//***********************车速(T2CH1)中断服务函数*****************************
void interrupt 8 Capture_chesu(void)
{
unsigned char csh,csl;
T2SC1_CH1F=0; //清捕捉中断标志
csh=T2CH1H;
csl=T2CH1L;
if(cs_count!=11)
{
cs[cs_count]=csh*0x100+csl;
cs[cs_count]=cs[cs_count]-cs_temp;
cs_count++;
}
cs_temp=csh*0x100+csl;
lch_count++;
if(lch_count==8) licheng++;
cs_flag=0;
}
//////////////////////////////////////////////////////////////
//定义: void sub_chesu(void) //
//描述: 计算车速值,结果Km/h/byte,填写报文 //
//////////////////////////////////////////////////////////////
void sub_chesu(void)
{
unsigned char i;
unsigned char break_count=11;
unsigned int cstemp;
unsigned long data_temp;
if(cs_count==11)
{
pulse_flag=1; //排序,小--》大
while(pulse_flag)
{
pulse_flag=0;
break_count--;
if(break_count!=0)
{
for(i=0;i<9;i++)
{
if(cs[i]>cs[i+1])
{
pulse_flag=1;
cstemp=cs[i];
cs[i]=cs[i+1];
cs[i+1]=cstemp;
}
}
}
}
data_temp=cs[4]+cs[5];
data_temp=data_temp/2; //取中间两个的平均作为车速信号周期
cstemp=(unsigned int)data_temp;
if(cstemp<165) cstemp=170; //频率不大于378HZ
else
{
data_temp=data_temp*16;
data_temp=0xf4240/data_temp; //计算车速信号周期
cstemp=(unsigned int)data_temp;
cstemp=cstemp*9/20; //车速=(频率×3600)÷(8×1000)
// cstemp=cstemp*72/129; //Km/h/b
}
// CAN_data2.Byte=(unsigned char)cstemp;
cs_count=0;
}
}
//***********************定时器1中断服务函数***********************************
//100ms
void interrupt 6 TIM1_INTSVR(void)
{
T1SC_TOF=0; //清溢出中断标志
if(zs_flag&&zs_count!=21)
{
//zs=0;
zs_count=0;
}
zs_flag=1;
}
//***********************转速(T1CH1)中断服务函数*****************************
void interrupt 5 Capture_zhuansu(void)
{
unsigned char zsh,zsl;
T1SC1_CH1F=0; //清捕捉中断标志
zsh=T1CH1H;
zsl=T1CH1L;
zs[zs_count]=zsh*0x100+zsl;
zs[zs_count]=zs[zs_count]-zs_temp;
zs_count++;
if(zs_count==21) T1SC1=0x00;
zs_flag=0;
}
//////////////////////////////////////////////////////////////
//定义: void sub_zhuansu(void) //
//描述: 计算转速值,结果20rpm/byte,填写报文 //
//////////////////////////////////////////////////////////////
void sub_zhuansu(void)
{
unsigned char i;
unsigned char break_count=21;
unsigned int zstemp;
unsigned long data_temp;
if(zs_count==21)
{
pulse_flag=1; //排序,小--》大
while(pulse_flag)
{
pulse_flag=0;
break_count--;
if(break_count!=0)
{
for(i=0;i<19;i++)
{
if(zs[i]>zs[i+1])
{
pulse_flag=1;
zstemp=zs[i];
zs[i]=zs[i+1];
zs[i+1]=zstemp;
}
}
}
}
data_temp=zs[8]+zs[9]+zs[10]+zs[11];
data_temp=data_temp/4;//取平均值
zstemp=(unsigned int)data_temp;
if(zstemp<168) data_temp=6002; //3000转
else
{
data_temp=0xf4240/data_temp; //
data_temp=data_temp*120/119;//60*2; //求转速 //
// data_temp=data_temp/119; //0.5rpm/b
zstemp=(unsigned int)data_temp;//强制转换
}
// CAN_data5.Byte=(unsigned char)zstemp;
// CAN_data4.Byte=(unsigned char)(zstemp/0x100);
zs_count=0; //计数器清零
T1SC1=0x48;//开中断
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -