#include "app_scan.h" #include "bsp_rs2251.h" #include "main.h" #include "bsp_74hc595.h" #include "bsp_adc.h" #include "resi_math_lib.h" #include "string.h" #include "mx_serial.h" #include "app_soft.h" #include "bsp_can.h" #include "systick.h" #include "lib_cal_creep_resistance.h" #include "app_calibration.h" #include "mozen_protocol.h" #include "app_mozen_handler.h" #include "flash_port.h" #include "bsp_flash.h" enum scan_ad { changge_low, changge_low1, changge_low2, changge_low3, getAD_L0, getAD_L1, getAD_L2, getAD_L3, getAD_L4, getAD_L5, getAD_L6, getAD_L7, fast_l, changge_hig, changge_hig1, changge_hig2, changge_hig3, getAD_H0, getAD_H1, getAD_H2, getAD_H3, getAD_H4, getAD_H5, getAD_H6, getAD_H7, get_break }state; uint8_t hc595_ranks[] = {7,6,5,4,3,2,1,0,15,14,13,12};//初始化默认 int flag_send = 0; volatile uint8_t scan_num = 0; static uint16_t cailed_sensor_data[MT_AX_NUM][MT_AY_NUM];//放16bit的数组 static uint8_t frame8bit[MT_AX_NUM][MT_AY_NUM];//放8bit的数组 adc_value_frame_struct temp_adc_value; uint64_t task_tick = 0; uint8_t serial_tx_buffer[AX_NUM][AY_NUM] = {0};//原始数组 cal_creep_resistance_t creep_strength_value; uint8_t Matrix_Stab[AX_NUM][AY_NUM] = {0}; uint8_t Matrix_Creep[AX_NUM][AY_NUM] = {0}; uint8_t Matrix_Display[AX_NUM][AY_NUM] = {0}; mx_frame_struct mx_sensor_frame; int print_counter = 0; void Hc4051Delay(uint32_t num) { while(num --); } void usart_event_handler(void) { static uint16_t recv_len = 0; static uint8_t rx_buffer[1024] = {0x00}; recv_len = usart_rx_recv(USART_3_TR, rx_buffer, sizeof(rx_buffer)); if(recv_len > 0) { uint16_t i; for (i = 0; i < recv_len; i++) { mozen_protocol_feed_byte(&g_mozen_prot, rx_buffer[i], 0); } } } /* * @function: 发送数据 * @param: frame: 数据帧 * @param: len: 数据长度 * @return: 0:成功 -1:失败 */ static int mozen_uart_tx(const uint8_t *frame, uint16_t len) { if ((frame == NULL) || (len == 0U)) { return -1; } usart_tx_push(USART_3_TR, (uint8_t *)frame,len); return 0; } void app_user_map_init(void){ mx_sensor_frame.trantype = 0x01; mx_sensor_frame.type = 0x01; mx_sensor_frame.datalen = sizeof(serial_tx_buffer); creep_strength_value.x_max = AX_NUM; creep_strength_value.y_max = AY_NUM; creep_strength_value.matrix_stab = (uint8_t*)Matrix_Stab; creep_strength_value.matrix_creep = (uint8_t*)Matrix_Creep; creep_strength_value.matrix_display = (uint8_t*)Matrix_Display; app_mozen_init(mozen_uart_tx); flash_port_ops_t flash_ops = { .read = flash_read, .write = flash_write, .erase = flash_erase, .is_erased = bsp_flash_is_erased }; app_calibration_init(&flash_ops); } uint64_t time_tmr1; void AD_Sacn(){ // if(state >= get_break){ // return; // } switch(state){ case changge_low: REF_OUT(1);//低扫 ic_74hc595_clean_0(32); break; case changge_low1: break; case changge_low2: break; case changge_low3: break; case getAD_L0: temp_adc_value.sensor_iqr_ref_value[scan_num][0] = GetAdcValue(1); temp_adc_value.sensor_iqr_ref_value[scan_num][8] = GetAdcValue(0); Choose_AX_Channel(4); break; case getAD_L1: temp_adc_value.sensor_iqr_ref_value[scan_num][1] = GetAdcValue(1); temp_adc_value.sensor_iqr_ref_value[scan_num][9] = GetAdcValue(0); Choose_AX_Channel(2); break; case getAD_L2: temp_adc_value.sensor_iqr_ref_value[scan_num][2] = GetAdcValue(1); temp_adc_value.sensor_iqr_ref_value[scan_num][10] = GetAdcValue(0); Choose_AX_Channel(1); break; case getAD_L3: temp_adc_value.sensor_iqr_ref_value[scan_num][3] = GetAdcValue(1); temp_adc_value.sensor_iqr_ref_value[scan_num][11] = GetAdcValue(0); Choose_AX_Channel(7); break; case getAD_L4: temp_adc_value.sensor_iqr_ref_value[scan_num][7] = GetAdcValue(1); Choose_AX_Channel(5); break; case getAD_L5: temp_adc_value.sensor_iqr_ref_value[scan_num][6] = GetAdcValue(1); Choose_AX_Channel(3); break; case getAD_L6: temp_adc_value.sensor_iqr_ref_value[scan_num][5] = GetAdcValue(1); Choose_AX_Channel(0); break; case getAD_L7: temp_adc_value.sensor_iqr_ref_value[scan_num][4] = GetAdcValue(1); Choose_AX_Channel(6); state = fast_l; break; case fast_l: REF_OUT(1);//低扫 ic_74hc595_clean_0(32); break; case changge_hig: REF_OUT(0); ic_74hc595_io_write_1(hc595_ranks[scan_num]); break; case changge_hig1: break; case changge_hig2: break; case changge_hig3: break; case getAD_H0: temp_adc_value.sensor_iqr_raw_value[0] = GetAdcValue(1); temp_adc_value.sensor_iqr_raw_value[8] = GetAdcValue(0); Choose_AX_Channel(4); break; case getAD_H1: temp_adc_value.sensor_iqr_raw_value[1] = GetAdcValue(1); temp_adc_value.sensor_iqr_raw_value[9] = GetAdcValue(0); Choose_AX_Channel(2); break; case getAD_H2: temp_adc_value.sensor_iqr_raw_value[2] = GetAdcValue(1); temp_adc_value.sensor_iqr_raw_value[10] = GetAdcValue(0); Choose_AX_Channel(1); break; case getAD_H3: temp_adc_value.sensor_iqr_raw_value[3] = GetAdcValue(1); temp_adc_value.sensor_iqr_raw_value[11] = GetAdcValue(0); Choose_AX_Channel(7); break; case getAD_H4: temp_adc_value.sensor_iqr_raw_value[7] = GetAdcValue(1); Choose_AX_Channel(5); break; case getAD_H5: temp_adc_value.sensor_iqr_raw_value[6] = GetAdcValue(1); Choose_AX_Channel(3); break; case getAD_H6: temp_adc_value.sensor_iqr_raw_value[5] = GetAdcValue(1); Choose_AX_Channel(0); break; case getAD_H7: temp_adc_value.sensor_iqr_raw_value[4] = GetAdcValue(1); Choose_AX_Channel(6); break; case get_break: return; } state++; } void IRQ_Scan(adc_value_frame_struct *adc_raw_value){ static math_resi_cal_t math_resi_cal = {0}; static int math_scan_num = 0; __disable_irq(); math_scan_num = scan_num; memcpy(adc_raw_value->sensor_raw_value,adc_raw_value->sensor_iqr_raw_value,24); memcpy(adc_raw_value->sensor_ref_value,adc_raw_value->sensor_iqr_ref_value[math_scan_num],24); scan_num++; if(scan_num == AX_NUM) { scan_num = 0; flag_send= 1; print_counter++; if(print_counter == 10) { print_counter = 0; } } if(print_counter >= 9){ state = changge_low; } else state = fast_l; __enable_irq(); math_resi_cal.sensor_adc_value = adc_raw_value->sensor_raw_value; math_resi_cal.resi_adc_value = adc_raw_value->sensor_ref_value; math_resi_cal.math_number = AX_NUM; math_resi_cali_once(&math_resi_cal, adc_raw_value->sensor_resi_output, AX_NUM, SCAN_LOW_LEVEL); math_display_resi(adc_raw_value->sensor_resi_output, adc_raw_value->sensor_display_output, AX_NUM, RESI_BACKWARDS, SINGLE_BYTE); memcpy(adc_raw_value->sensor_voltage[math_scan_num],adc_raw_value->sensor_display_output,AX_NUM); } void scan_deal(void){ if(state >= get_break) { IRQ_Scan(&temp_adc_value); } } void TMR1_OVF_TMR10_IRQHandler(void) { // 检查溢出中断标志位,避免误触发 if(tmr_flag_get(TMR1, TMR_OVF_FLAG) != RESET) { AD_Sacn(); // 必须清除中断标志位,否则会无限触发中断 tmr_flag_clear(TMR1, TMR_OVF_FLAG); } } int counter_fps; int counter_fps1; void adc_deal(void){ if(flag_send == 1){ flag_send = 0; memcpy(frame8bit,temp_adc_value.sensor_voltage,144); mx_sensor_frame.data = (uint8_t *)frame8bit; mx_serial_tx_frame(USART_3_TR,&mx_sensor_frame); counter_fps++; } if((get_system_tick() - task_tick) >= 1000){ task_tick = get_system_tick(); counter_fps1 = counter_fps; counter_fps = 0; } }