Browse Source

编码器逻辑修改完成, 删除了很多不需要的函数,更改编码器数据获取方式

new_pcb
tianjialong 2 years ago
parent
commit
b1ee4783bd
  1. 129
      usersrc/encoder.c
  2. 11
      usersrc/encoder.h
  3. 29
      usersrc/udpclient.c
  4. 36
      usersrc/usermain.c

129
usersrc/encoder.c

@ -12,8 +12,8 @@ static bool camera_encoder_light_state;
static bool driven_encoder_light_state;
static encoder_t m_encoders[] = {
{&camera_encoder, TIM_CHANNEL_1 | TIM_CHANNEL_2}, //
{&driven_encoder_gear, TIM_CHANNEL_1 | TIM_CHANNEL_2} //
{&camera_encoder, TIM_CHANNEL_1 | TIM_CHANNEL_2, 0, 0}, //
{&driven_encoder_gear, TIM_CHANNEL_1 | TIM_CHANNEL_2, 0, 0} //
};
void encoder_all_start(void)
@ -32,140 +32,33 @@ void encoder_all_stop(void)
}
}
bool encoder_clear_counter(encoder_usage_t encoder)
{
for (uint8_t i = 0; i < (sizeof(m_encoders) / sizeof(encoder_t)); i++)
{
if (encoder == i)
{
__HAL_TIM_GET_COUNTER(m_encoders[i].tim_handler) = 0;
return true;
}
}
return false;
}
void encoder_all_clear_counter(void)
{
for (uint8_t i = 0; i < (sizeof(m_encoders) / sizeof(encoder_t)); i++)
{
__HAL_TIM_GET_COUNTER(m_encoders[i].tim_handler) = 0; //
m_encoders[i].count = 0;
}
}
bool encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value)
void encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value)
{
bool get_encoder_value_flag = false;
switch (encoder)
{
case CAMERA_ENCODER:
*encoder_value += (short)__HAL_TIM_GET_COUNTER(m_encoders[encoder].tim_handler);
__HAL_TIM_GET_COUNTER(m_encoders[encoder].tim_handler) = 0; /* 清零 */
get_encoder_value_flag = true;
*encoder_value = m_encoders[CAMERA_ENCODER].count;
break;
case DRIVEN_ENCODER_GEAR:
*encoder_value += (short)__HAL_TIM_GET_COUNTER(m_encoders[encoder].tim_handler);
__HAL_TIM_GET_COUNTER(m_encoders[encoder].tim_handler) = 0; /* 清零 */
get_encoder_value_flag = true;
*encoder_value = m_encoders[DRIVEN_ENCODER_GEAR].count;
break;
default:
break;
}
return get_encoder_value_flag;
}
void encoder_light_schedule(void)
{
// if (camera_encoder_state == STANDBY)
// {
// if (sys_haspassedms(camera_encoder_lastprocess) > 500)
// {
// camera_encoder_lastprocess = HAL_GetTick();
// encoder_switch_toggle_on_off_state(CAMERA_ENCODER);
// }
// }
// if (driven_encoder_gear_state == STANDBY)
// {
// if (sys_haspassedms(driven_encoder_gear_lastprocess) > 500)
// {
// driven_encoder_gear_lastprocess = HAL_GetTick();
// encoder_switch_toggle_on_off_state(DRIVEN_ENCODER_GEAR);
// }
// }
}
void encoder_set_state(encoder_usage_t encoder, encoder_light_state_t state)
{
/* 主动上报的时候常亮,接收到触发指令直接翻转led,待机中0.5s周期闪烁 */
if (encoder == CAMERA_ENCODER)
{
camera_encoder_state = state;
if (state == STANDBY)
{
camera_encoder_lastprocess = HAL_GetTick();
encoder_switch_toggle_on_off_state(CAMERA_ENCODER);
}
else if (state == WORKING)
{
/* 如果工作状态的时候触发了genlock等,灯的状态不应该变成待机状态,只有同为待机的时候闪烁,上层写的时候需要加判断 */
encoder_light_switch_set_color_and_brightness(CAMERA_ENCODER, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
}
}
else if (encoder == DRIVEN_ENCODER_GEAR)
{
driven_encoder_gear_state = state;
if (state == STANDBY)
{
driven_encoder_gear_lastprocess = HAL_GetTick();
encoder_switch_toggle_on_off_state(DRIVEN_ENCODER_GEAR);
}
else if (state == WORKING)
{
encoder_light_switch_set_color_and_brightness(DRIVEN_ENCODER_GEAR, ENCODER_LIGHT_COLOR_BLUE, encoder_light_max_brightness);
}
}
}
encoder_light_state_t encoder_get_state(encoder_usage_t encoder)
{
if (encoder == CAMERA_ENCODER)
{
return camera_encoder_state;
}
else if (encoder == DRIVEN_ENCODER_GEAR)
{
return driven_encoder_gear_state;
}
return ENCODER_STATE_NUMBER_AND_ERR_STATE;
}
void encoder_all_encoder_clear_counter_and_structer_count(void)
{
udp_client_get_active_report_data_structer()->encoder1 = 0;
udp_client_get_active_report_data_structer()->encoder2 = 0;
encoder_all_clear_counter();
}
void encoder_switch_encoder_clear_count_and_structer_count(encoder_usage_t encoder)
{
switch (encoder)
{
case CAMERA_ENCODER:
udp_client_get_active_report_data_structer()->encoder1 = 0;
encoder_clear_counter(CAMERA_ENCODER);
break;
case DRIVEN_ENCODER_GEAR:
udp_client_get_active_report_data_structer()->encoder2 = 0;
encoder_clear_counter(DRIVEN_ENCODER_GEAR);
break;
default:
break;
}
}
/*
@ -299,3 +192,13 @@ void encoder_switch_toggle_on_off_state(encoder_usage_t encoder)
// error
}
}
encoder_t *encoder_get_camera_encoder_structer(void)
{
return &m_encoders[CAMERA_ENCODER];
}
encoder_t *encoder_get_driven_encoder_gear_structer(void)
{
return &m_encoders[DRIVEN_ENCODER_GEAR];
}

11
usersrc/encoder.h

@ -27,20 +27,19 @@ typedef struct
{
TIM_HandleTypeDef *tim_handler;
uint32_t tim_channel;
int32_t count;
uint16_t last_count;
} encoder_t;
#define encoder_light_max_brightness 1000
void encoder_all_start(void);
void encoder_all_stop(void);
bool encoder_clear_counter(encoder_usage_t encoder);
void encoder_all_clear_counter(void);
bool encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value);
void encoder_read_with_encoder(encoder_usage_t encoder, uint32_t *encoder_value);
void encoder_light_schedule(void);
void encoder_set_state(encoder_usage_t encoder, encoder_light_state_t state);
encoder_light_state_t encoder_get_state(encoder_usage_t encoder);
void encoder_all_encoder_clear_counter_and_structer_count(void);
void encoder_switch_encoder_clear_count_and_structer_count(encoder_usage_t encoder);
void encoder_light_switch_set_color_and_brightness(encoder_usage_t encoder, encoder_light_color_table_t color, uint16_t brightness);
void encoder_switch_close_light(encoder_usage_t encoder);
void encoder_switch_toggle_on_off_state(encoder_usage_t encoder);
encoder_t *encoder_get_camera_encoder_structer(void);
encoder_t *encoder_get_driven_encoder_gear_structer(void);

29
usersrc/udpclient.c

@ -58,20 +58,6 @@ static protocol_active_and_trigger_report_t active_report_data_structer;
static protocol_active_and_trigger_report_t trigger_report_data_structer;
static int active_report_cycle;
static void udp_client_all_encoder_light_set(encoder_light_state_t state)
{
if (state == STANDBY)
{
encoder_set_state(CAMERA_ENCODER, STANDBY);
encoder_set_state(DRIVEN_ENCODER_GEAR, STANDBY);
}
else if (state == WORKING)
{
encoder_set_state(CAMERA_ENCODER, WORKING);
encoder_set_state(DRIVEN_ENCODER_GEAR, WORKING);
}
}
/* ===================================================================== */
static void active_report_data_structer_init(void)
{
@ -324,7 +310,7 @@ void udp_client_parse(int recv_datalen)
if (checksum_flag)
{
/* 校验通过 */
encoder_all_encoder_clear_counter_and_structer_count();
encoder_all_clear_counter();
udp_client_clear_encoder_cmd_receipt(protocol_clear_encoder_cmd, PROTOCOL_STATUS_SUCCESS);
}
else
@ -354,14 +340,6 @@ void udp_client_parse(int recv_datalen)
if ((protocol_active_cmd->active_report_flag == AVTIVE_DISABLE) || (protocol_active_cmd->active_report_flag == ACTIVE_ENABLE))
{
udp_client_active_flag = protocol_active_cmd->active_report_flag;
if (udp_client_active_flag)
{
udp_client_all_encoder_light_set(WORKING);
}
else
{
udp_client_all_encoder_light_set(STANDBY);
}
}
if (protocol_active_cmd->report_cycle >= ACTIVE_MIN_REPORT_CYCLE)
@ -466,11 +444,6 @@ void udp_client_genlock_and_esync_active(void)
trigger_report_data_structer_update();
udp_client_trigger_report();
if (!udp_client_active_flag)
{
udp_client_all_encoder_light_set(STANDBY);
}
trigger_report_data_structer.index += 1;
// active_report_data_structer.time_stamp_s = 0;
genlock_and_esync_active_flag = false;

36
usersrc/usermain.c

@ -33,6 +33,8 @@ static zkey_t s_keys[] = {
static zkey_module_t s_key_module = ZMODULE_INIT(s_keys, onkey);
static uint16_t encoder_get_temp;
static void zkey_schedule()
{
static uint32_t lastprocess_key_ticket;
@ -98,6 +100,22 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
}
}
int32_t compute_uint16_t_minus_the_numbers(uint16_t now, uint16_t last)
{
int32_t diff1 = now - last;
int32_t diff2 = UINT16_MAX - abs(diff1);
int32_t diffreal = 0;
if (now > last)
{
diff2 = -diff2;
}
diffreal = abs(diff1) < abs(diff2) ? diff1 : diff2;
return diffreal;
}
void netif_link_up_user_func(void)
{
encoder_light_switch_set_color_and_brightness(CAMERA_ENCODER, ENCODER_LIGHT_COLOR_GREEN, encoder_light_max_brightness);
@ -110,10 +128,28 @@ void netif_link_down_user_func(void)
encoder_light_switch_set_color_and_brightness(DRIVEN_ENCODER_GEAR, ENCODER_LIGHT_COLOR_RED, encoder_light_max_brightness);
}
static void encoder_get_and_calculation(void)
{
encoder_get_temp = __HAL_TIM_GET_COUNTER(encoder_get_camera_encoder_structer()->tim_handler);
if (encoder_get_camera_encoder_structer()->last_count != encoder_get_temp)
{
encoder_get_camera_encoder_structer()->count += compute_uint16_t_minus_the_numbers(encoder_get_temp, encoder_get_camera_encoder_structer()->last_count);
encoder_get_camera_encoder_structer()->last_count = encoder_get_temp;
}
encoder_get_temp = __HAL_TIM_GET_COUNTER(encoder_get_driven_encoder_gear_structer()->tim_handler);
if (encoder_get_driven_encoder_gear_structer()->last_count != encoder_get_temp)
{
encoder_get_driven_encoder_gear_structer()->count += compute_uint16_t_minus_the_numbers(encoder_get_temp, encoder_get_driven_encoder_gear_structer()->last_count);
encoder_get_driven_encoder_gear_structer()->last_count = encoder_get_temp;
}
}
/* 重写了该函数,需要添加编码器采集部分的逻辑 */
void HAL_IncTick(void)
{
uwTick += uwTickFreq;
encoder_get_and_calculation();
}
void user_main()

Loading…
Cancel
Save