📄 main_ctl_test1.c
字号:
st_work_mode .power_alarm_state =CONST_LABEL_POWER_GREAT_THAN_43V;
//20070913(1-2)
flag_is_power_lower_flash =0;
//这里不能关闭Power灯,因为会影响找平中的闪烁显示,并且电压是不会使用中低->高电平的
//led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED, CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);
}
else if(word_tmp <=CONST_POWER_ADC_VALUE_OF_40V)
{ //<=4.0V
st_work_mode.power_alarm_state =CONST_LABEL_POWER_LESS_THAN_40V;
//先清除原来的指示灯和激光
led_and_beep_all_off();
//停止转动 20070905(1-2)
CODE_MOTOR_Z_MOVE_STOP;
//20070831(3-1) 告警时间延长到30s!
//点亮Power和Beep
led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED,CONST_FLAG_FLASH_IS_LED_BEEP_ON,30000/CONST_XU_HAO_OF_ALL_LED_AND_BEEP);
led_and_beep_operation(CONST_XU_HAO_OF_BEEP,CONST_FLAG_FLASH_IS_LED_BEEP_ON,30000/CONST_XU_HAO_OF_ALL_LED_AND_BEEP);
//提示结束后自动关电源,有Power按键也立即关闭电源 20070905(1-3)
while( (st_led_beep_op.on_time_count_beep !=0) && (CODE_GET_POWER_IN ==0) );
excute_power_off();
}
else
{ //电池电压=4V...4.3V
st_work_mode.power_alarm_state =CONST_LABEL_POWER_4V_TO_43V;
//Power灯闪烁
led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED, CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
//20070913(1-3)
flag_is_power_lower_flash =1;
}
}
#endif
//-------------------------------------------------------------
//4)位置开关的检测
//水平放置时,开关位置恒为'1'(断开),垂直放置时,应该为'0'(导通),由于震动会变成'1'!
if(detect_switch_is_horizontal_flag[1] <CONST_DETECT_POSITION_COUNT_ALL)
{
detect_switch_is_horizontal_flag[0] += st_work_mode.flag_is_horizontal;
detect_switch_is_horizontal_flag[1] ++;
}
else
{
if(st_work_mode.bak_flag_is_horizontal ==1)
{
if(detect_switch_is_horizontal_flag[0] <CONST_DETECT_POSITION_COUNT_ALL -10)
{
goto _prog_label_do_soft_reset;
}
}
else
{
if(detect_switch_is_horizontal_flag[0] >=CONST_DETECT_POSITION_COUNT_ALL -1)
{
_prog_label_do_soft_reset:
CODE_EXTERN_MODUL_POWER_ON;
_CLI();
soft_reset();
}
}
detect_switch_is_horizontal_flag[0] =0;
detect_switch_is_horizontal_flag[1] =0;
}
//-------------------------------------------------------------
//5)自动找平和自动控制过程(按照模式分别执行)
//输入:
// st_work_mode.flag_finding_level_mode =0,1,2,4,8=init,x,y,z,manual
//出厂参数设置模式 没有自动控制模式,一致进行自动找平过程!
finding_levels_or_auto_control();
//-------------------------------------------------------------
//6)进行各种工作模式下Z电机转动的启动
//按照标志 need_start_z_moving 进行操作
start_circus_of_all_work_mode();
//-------------------------------------------------------------
//7)按照模式分别执行按键操作 time=23us(没有按键时)
//st_z_motor_control.work_mode_set
dowith_keys_response_of_all_work_mode();
};
}
//============================================================================
// 子函数部分
//============================================================================
//----------------------------------------------------------------------------
//自动检测并设置旋转速度参数
//输入:
// st_z_motor_control.work_mode_set
//输出:
// st_eeprom_para_speed_pwm
//注意: 进入此函数前,INT0,INT1,TIMER2中断都没有开启!
//----------------------------------------------------------------------------
void Auto_Detect_To_Set_Circus_Speed(void)
{
uchar tmp;
uint return_set_pwm_val[3];
uchar ret;
uint word_tmp;
tmp =CONST_KEY_LAB_IDEL;
_prog_label_ss_wait_key_up:
//先清除原来的按键,再进行按键读入
st_judge_key.curr_get_key_value =CONST_KEY_LAB_IDEL;
//使用查询方式进行按键端口的输入!
if(key_local_judge_press() !=0)
{ //存在按键输入
//st_judge_key.curr_key_is_long;
//按键状态是低9bit有效!
tmp =change_and_get_key_label(st_judge_key.curr_get_key_value);
if(tmp ==CONST_KEY_LAB_Z_AND_SPEED_WITH_POWER)
{ //还是原来的按键 Power + Speed
goto _prog_label_ss_wait_key_up;
}
else if(tmp ==CONST_KEY_LAB_Z_AND_SPEED)
{ //电源按键已经弹起,仅仅是 SPEED
goto _prog_label_ss_power_key_has_up;
}
else
{ //没有按键 或者 其他非法按键
goto _prog_label_ss_set_error;
}
}
//标识已经松开电源按键!
_prog_label_ss_power_key_has_up:
_prog_label_ss_wait_speed_key_up:
tmp =CONST_KEY_LAB_IDEL;
//先清除原来的按键,再进行按键读入
st_judge_key.curr_get_key_value =CONST_KEY_LAB_IDEL;
//使用查询方式进行按键端口的输入!
if(key_local_judge_press() !=0)
{ //存在按键输入
//st_judge_key.curr_key_is_long;
//按键状态是低9bit有效!
tmp =change_and_get_key_label(st_judge_key.curr_get_key_value);
if(tmp ==CONST_KEY_LAB_Z_AND_SPEED)
{ //SPEED按键保持
goto _prog_label_ss_wait_speed_key_up;
}
else if(tmp !=CONST_KEY_LAB_IDEL)
{ //按键正确弹起
goto _prog_label_ss_start_set_speed;
}
else
{ //其他非法按键
goto _prog_label_ss_set_error;
}
}
_prog_label_ss_start_set_speed:
//停止timer0,直接使用引脚控制LED指示
//Timer2不变化
CODE_STOP_TIME0;
CODE_JI_GUANG_LED_ON;
//INT0已经是上/下沿中断
GIFR |= BIT(INTF0);
//关闭INT1中断
GICR &= ~BIT(INT1);
//关闭INT2中断
GICR &= ~BIT(INT2);
//20070817 使用灯闪烁
//以下开始依次设置3种速度
CODE_START_TIME0;
led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_60, &return_set_pwm_val[0]);
if(ret ==0)
{ //出错LED闪烁
goto _prog_label_ss_set_error;
}
//60cps 成功继续
led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);
led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_300, &return_set_pwm_val[1]);
if(ret ==0)
{ //出错LED闪烁
goto _prog_label_ss_set_error;
}
//300cps 成功继续
led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_OFF, 0);
led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
ret =now_set_one_speed_sub(CONST_CIRCU_SPEED_600, &return_set_pwm_val[2]);
if( (ret ==0) || (ret ==CONST_SET_SPEED_ADJUST_TIMES_MAX +1) )
{ //出错LED闪烁
//设置失败,x,y,z灯闪烁,等待关电处理,但是不更改eeprom中的PWM设置参数
//相关步骤的指示灯闪烁,蜂鸣器长响一声!
_prog_label_ss_set_error:
led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH_EVER, 0);
while(1)
{
if( (word_tmp =judge_read_local_and_ir_keys()) ==CONST_HAS_READ_KEY )
{
if(st_curr_key.local_key_label ==CONST_KEY_LAB_POWER)
{
excute_power_off(); //自动关机
}
}
};
}
else
{
_prog_label_ss_save_pwm_val_set:
//最后600cps设置成功
//成功: 仅仅是X,Y,Z三个闪烁一次,自动关机
//保存参数
st_eeprom_para_speed_pwm.eep_sets_lab_speed_pwm =CONST_EEPROM_PARA_HAS_SET;
st_eeprom_para_speed_pwm.eep_sets_stop_pwm_val =CONST_PWM_OCR1B_DATA_STOP_DEF;
st_eeprom_para_speed_pwm.eep_sets_60cps_pwm_val =return_set_pwm_val[0];
st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val =return_set_pwm_val[1];
st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val =return_set_pwm_val[2];
EEPROMWriteBytes(CONST_EEPROM_ADDR_OF_LAB_SPEED_PWM_VAL, (uchar *)&st_eeprom_para_speed_pwm, CONST_EEPROM_LENTH_OF_PARA_SPEED_PWM_SETS);
#if (DEBUG_ENABLE_NEGLET_TEST_PROG ==0)
tmp =0;
do{
delay_x250ms(4);
EEPROMReadBytes(CONST_EEPROM_ADDR_OF_LAB_SPEED_PWM_VAL, (uchar *)&st_eeprom_para_speed_pwm, CONST_EEPROM_LENTH_OF_PARA_SPEED_PWM_SETS);
st_serial_buff.send[0] =st_eeprom_para_speed_pwm.eep_sets_lab_speed_pwm;
st_serial_buff.send[1] =(st_eeprom_para_speed_pwm.eep_sets_stop_pwm_val >>8) &0xff;
st_serial_buff.send[2] =st_eeprom_para_speed_pwm.eep_sets_stop_pwm_val &0xff;
st_serial_buff.send[3] =(st_eeprom_para_speed_pwm.eep_sets_60cps_pwm_val >>8) &0xff;
st_serial_buff.send[4] =st_eeprom_para_speed_pwm.eep_sets_60cps_pwm_val &0xff;
st_serial_buff.send[5] =(st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val >>8) &0xff;
st_serial_buff.send[6] =st_eeprom_para_speed_pwm.eep_sets_300cps_pwm_val &0xff;
st_serial_buff.send[7] =(st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val >>8) &0xff;
st_serial_buff.send[8] =st_eeprom_para_speed_pwm.eep_sets_600cps_pwm_val &0xff;
st_serial_buff.send[9] =0x00;
st_serial_buff.tx_pos_start =1;
st_serial_buff.slen_needed =CONST_EEPROM_LENTH_OF_PARA_SPEED_PWM_SETS +1;
UDR =st_serial_buff.send[0]; //启动中断方式的发送
UCSRB |=BIT(UDRIE); //因为UDRIE中断回自我关断,以减少CPU负荷!
}while(++tmp <10);
#endif
led_and_beep_operation(CONST_XU_HAO_OF_X_AND_PAN_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
led_and_beep_operation(CONST_XU_HAO_OF_Y_AND_TILT_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
led_and_beep_operation(CONST_XU_HAO_OF_Z_AND_Z_SPEED_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
led_and_beep_operation(CONST_XU_HAO_OF_MANUAL_AND_AUTO_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
led_and_beep_operation(CONST_XU_HAO_OF_POWER_LED,CONST_FLAG_FLASH_IS_LED_BEEP_FLASH, 1);
while(st_led_beep_op.all_times_power_led_flashing !=0);
excute_power_off();
}
}
//----------------------------------------------------------------------------
//水平位置下的normal模式时的x,y的控制, 界限是static以下认为平衡,nor以上重新找平!
//输入:
// [x].curr_filter_dat
// [y].curr_filter_dat
//输出:
// control_motor_x_move
// control_motor_y_move
//X:key_left=0x0317, key_right=0x0017
//Y:key_up=0x0020, key_down=0x038A
//----------------------------------------------------------------------------
void control_on_normal_mode_at_horizontal(void)
{
if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].nor_up_delta) ||
(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].nor_down_delta) )
{ //超出范围, <=中心 -nor || >=中心 +nor
//标识 &=X,进入初始找平状态;
st_work_mode.flag_finding_level_mode &= ~(uchar)CONST_FLAG_IS_X_HAS_SEARCH_END_LEVEL;
//准备进入初始找平预处理,但是不能更改当前的操作模式
prepare_for_goto_finding_level();
}
else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].static_up_delta)
{ //>中心 +static
//x细步right down输出,数据要变小
control_motor_x_move(CONST_MOTOR_X_Y_MOVING_RIGHT_DOWN, CONST_MOTOR_X_MOVE_ONE_SMALL_STEP);
}
else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_X].static_down_delta)
{ //<中心 -static
//x细步left up输出,数据要变大
control_motor_x_move(CONST_MOTOR_X_Y_MOVING_LEFT_UP, CONST_MOTOR_X_MOVE_ONE_SMALL_STEP);
}
else
{ //>=中心 -static && <=中心 +static
//20070907(1-1)
control_motor_x_move(CONST_MOTOR_X_Y_MOVING_STOP,0);
}
if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].nor_up_delta) ||
(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].nor_down_delta) )
{ //超出范围, <=中心 -nor || >=中心 +nor
//标识 &=Y,进入初始找平状态;
st_work_mode.flag_finding_level_mode &= ~(uchar)CONST_FLAG_IS_Y_HAS_SEARCH_END_LEVEL;
//准备进入初始找平预处理,但是不能更改当前的操作模式
prepare_for_goto_finding_level();
}
else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].static_up_delta)
{ //>中心 +static
//y细步left up输出,数据要变小
control_motor_y_move(CONST_MOTOR_X_Y_MOVING_LEFT_UP, CONST_MOTOR_Y_MOVE_ONE_SMALL_STEP);
}
else if(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Y].static_down_delta)
{ //<中心 -static
//y细步right down输出,数据要变大
control_motor_y_move(CONST_MOTOR_X_Y_MOVING_RIGHT_DOWN, CONST_MOTOR_Y_MOVE_ONE_SMALL_STEP);
}
else
{ //>=中心 -static && <=中心 +static
//20070907(1-2)
control_motor_y_move(CONST_MOTOR_X_Y_MOVING_STOP,0);
}
}
//----------------------------------------------------------------------------
//垂直位置下的normal模式时的z(x)的控制
//输入:
// [z].curr_filter_dat
//输出:
// control_motor_x_move
// flag_finding_level_mode
//Z(x): key_Z(x)_left=0x0017, key_Z(x)_right=0x0360;
//----------------------------------------------------------------------------
void control_on_normal_mode_at_vertical(void)
{
if( (st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].curr_filter_dat >st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos +st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].nor_up_delta) ||
(st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].curr_filter_dat <st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].mid_pos -st_gdc_adc_sets_paras[CONST_ADC_CHANNEL_Z].nor_down_delta) )
{ //超出范围, <=中心 -nor || >=中心 +nor
//标识 &=Z,进入初始找平状态;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -