#definecs_dirPTA_PTA1//车速表1-反转0-正转
#definecs_sigPTA_PTA0//车速表0->1驱动
sys_data_type_motor_flags0;
#definecs_dir_flag_motor_flags0.Bit.BIT0//正反转方向标志位
unsignedcharcs_fcan;//CAN_WKD2.Byte
//车速
unsignedcharcs_last=0;//上一次数据
unsignedintcs_stepall=0;//实时总步数
unsignedintcs_step_change=0;//要走的步数
unsignedintcs_step_diff;//步数差值
unsignedcharcs_dec_speed;//指针速度参数
unsignedcharcs_dec_count=0;//速度变量
//******************************
//函数:voidcs_step_count(void)
//描述:车速步数计算
//参数:none
//返回值:none
//******************************
voidcs_step_count(void)
{
unsignedintyb_temp;
unsignedcharcs_speed_temp;
if(cs_fcan>162)cs_fcan=162;
if(cs_fcan!=cs_last){
cs_last=cs_fcan;
yb_temp=cs_fcan;
if(yb_temp>18)yb_temp+=2;//补偿
yb_temp=yb_temp*12*14/10;//计算转动步数12微步*14度/10(Km/h)
/*160Km/h<->224度1Km/h<->224*12/160*/
if(yb_temp<cs_stepall){//反
cs_step_diff=cs_stepall-yb_temp;
cs_dir_flag=1;
}
else{//正
cs_step_diff=yb_temp-cs_stepall;
cs_dir_flag=0;
}
cs_step_change=yb_temp;
}
//以下为速度控制(1)
if(cs_step_diff>400)cs_speed_temp=1;
elsecs_speed_temp=(unsignedchar)(800/cs_step_diff);
if(cs_step_diff<40)cs_speed_temp=20;
cs_dec_speed=cs_speed_temp;
}
//******************************
//函数:voidcs_step_oper(void)
//描述:车速操作
//参数:none
//返回值:none
//******************************
voidcs_step_oper(void){
//unsignedcharyb_temp0;
//if(cs_step_change!=cs_stepall){
cs_dec_count++;
//以下为速度控制(2)
/*if(cs_step_diff>36){cs_dec_speed=1;}//3度
else{//计算速度参数
yb_temp0=(unsignedchar)(cs_step_diff>>2);
cs_dec_speed=10-yb_temp0;
}*/
if(cs_dec_count==cs_dec_speed){
cs_step_diff--;
cs_dir=cs_dir_flag;//1=反转
cs_dec_count=0;
cs_sig=0;
if(cs_dir_flag){cs_stepall--;}//反转
else{cs_stepall++;}//正转
cs_sig=1;
}
//}
}
比较
速度控制方法(1)可以认为是按时间变化控制这种控制方法的特点是控制的范围比较大(事例为400步内)速度变化cs_speed_temp=(unsignedchar)(800/cs_step_diff)随cs_step_diff变化越来越快指针抖动小转动平缓速度控制较为理想
速度控制方法(2)按步数变化控制控制速度变化在一个很小的范围内对于指针大范围的转动控制效果不好无法降低转动惯性的影响