📄 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;
void Init_TIM(void)
{
//车速
T1SC=0x46; //64分频 524280us
T1SC1=0x48; //下降沿捕捉中断
//转速
T2SC=0x43; //0x43 //8分频 65535us
T2SC1=0x48; //下降沿捕捉中断
}
//***********************定时器1中断服务函数***********************************
void interrupt 6 TIM1_INTSVR(void)
{
T1SC_TOF=0; //清溢出中断标志
if(cs_flag&&cs_count!=11)
{
CAN_DATA2.Byte=0;
cs_count=0;
}
cs_flag=1;
}
//***********************车速(T1CH1)中断服务函数*****************************
void interrupt 5 Capture_chesu(void)
{
unsigned char csh,csl;
T1SC1_CH1F=0; //清捕捉中断标志
csh=T1CH1H;
csl=T1CH1L;
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)
{
lch_count=0;
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*8;
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;
}
}
//***********************定时器2中断服务函数***********************************
//100ms
void interrupt 9 TIM2_INTSVR(void)
{
T2SC_TOF=0; //清溢出中断标志
if(zs_flag&&zs_count!=21)
{
CAN_DATA1.Byte=0;
CAN_DATA0.Byte=0;
zs_count=0;
}
zs_flag=1;
}
//***********************转速(T2CH1)中断服务函数*****************************
void interrupt 8 Capture_zhuansu(void)
{
unsigned char zsh,zsl;
T2SC1_CH1F=0; //清捕捉中断标志
zsh=T2CH1H;
zsl=T2CH1L;
zs[zs_count]=zsh*0x100+zsl;
zs[zs_count]=zs[zs_count]-zs_temp;
zs_temp=zsh*0x100+zsl;
zs_count++;
if(zs_count>=21) T2SC1=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=zs[9]+zs[10];//
data_temp=data_temp/4;///4取平均值
zstemp=(unsigned int)data_temp;
if(zstemp<336) zstemp=6002; //3000转
else
{
data_temp=0xf4240/data_temp;//data_temp=0x7a120/data_temp; //
data_temp=data_temp*240/119;//60*2; //求转速 //
// data_temp=data_temp/119; //0.5rpm/b
zstemp=(unsigned int)data_temp;//强制转换
}
//zstemp=(unsigned int)data_temp;
CAN_DATA1.Byte=(unsigned char)(zstemp%0x100);
CAN_DATA0.Byte=(unsigned char)(zstemp/0x100);
zs_count=0; //计数器清零
T2SC1=0x48;//开中断
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -