/* * user.c * * Created on: Nov 11, 2024 * Author: 10425 */ #include "user.h" volatile uint8_t usart1_count = 0; //串口接收数据个数 uint8_t RxBuff1[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t TXBuff1[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t uBuff1[BUFF_LEN] = {0}; volatile uint8_t usart3_count = 0; //串口接收数据个数 uint8_t RxBuff3[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t TXBuff3[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t uBuff3[BUFF_LEN] = {0}; uint16_t RegularConvData_Tab[ADCBUFF_LEN]; volatile struct REGISTER dev_reg ={0}; #define REGISTER_CNT 12 int16_t user_register[REGISTER_CNT] = {0}; //寄存器值 void ADC_MAX(void) { int16_t max_Mx ,max_My,max_Mz,max_Ez; int16_t min_Mx,min_My,min_Mz,min_Ez; static int16_t max_Mx1=0,max_My1=0,max_Mz1=0,max_Ez1=0; static int16_t min_Mx1=0,min_My1=0,min_Mz1=0,min_Ez1=0; int16_t REF; static int16_t last_x=0,last_y =0,last_z=0,last_e=0; static uint16_t number =0; int16_t i =0; max_Mx =RegularConvData_Tab[1]; min_Mx =RegularConvData_Tab[1]; max_My =RegularConvData_Tab[2]; min_My =RegularConvData_Tab[2]; max_Mz =RegularConvData_Tab[3]; min_Mz =RegularConvData_Tab[3]; max_Ez =RegularConvData_Tab[4]; min_Ez =RegularConvData_Tab[4]; for(i=5;imax_Mx) { max_Mx = RegularConvData_Tab[i]; } else if(RegularConvData_Tab[i]max_My) { max_My = RegularConvData_Tab[i]; } else if(RegularConvData_Tab[i]max_Mz) { max_Mz = RegularConvData_Tab[i]; } else if(RegularConvData_Tab[i]max_Ez) { max_Ez = RegularConvData_Tab[i]; } else if(RegularConvData_Tab[i]= 2 ) { number=0; max_Mx=max_Mx1/3; max_My=max_My1/3; max_Mz=max_Mz1/3; max_Ez=max_Ez1/3; min_Mx=min_Mx1/3; min_My=min_My1/3, min_Mz=min_Mz1/3, min_Ez=min_Ez1/3; dev_reg.electric_X = 0; dev_reg.electric_Y = 0; dev_reg.electric_Z = (max_Ez-min_Ez)*3300/4095; dev_reg.electric_Z = (dev_reg.electric_Z*0.1231-0.3242)*100; if(abs(dev_reg.electric_Z -last_e)<30) { dev_reg.electric_Z =last_e; } else { last_e=dev_reg.electric_Z; } dev_reg.electric_Z =dev_reg.electric_Z-120; if(dev_reg.electric_Z<0)dev_reg.electric_Z=0; dev_reg.electric_V = dev_reg.electric_Z; dev_reg.magnetic_X = (max_Mx-min_Mx)*3300/4095; dev_reg.magnetic_X =dev_reg.magnetic_X*1000*100/2/14640; if(abs(dev_reg.magnetic_X -last_x)<30) { dev_reg.magnetic_X =last_x; } else { last_x=dev_reg.magnetic_X; } dev_reg.magnetic_Y = (max_My-min_My)*3300/4095; dev_reg.magnetic_Y =dev_reg.magnetic_Y*1000*100/2/14640; if(abs(dev_reg.magnetic_Y -last_y)<30) { dev_reg.magnetic_Y =last_y; } else { last_y=dev_reg.magnetic_Y; } dev_reg.magnetic_Z = (max_Mz-min_Mz)*3300/4095; dev_reg.magnetic_Z =dev_reg.magnetic_Z*1000*100/2/14640; if(abs(dev_reg.magnetic_Z -last_z)<30) { dev_reg.magnetic_Z =last_z; } else { last_z=dev_reg.magnetic_Z; } dev_reg.magnetic_V = (int16_t)sqrt(pow(dev_reg.magnetic_X,2)+pow(dev_reg.magnetic_Y,2) +pow(dev_reg.magnetic_Z,2)); max_Mx1=0; max_My1=0; max_Mz1=0; max_Ez1=0; min_Mx1=0; min_My1=0, min_Mz1=0, min_Ez1=0; send_UI(7); } dev_reg.REF = REF*3300/4095; } void send_data(UART_HandleTypeDef*huart,uint8_t* data,uint16_t len) { if(huart->Instance == USART1) { HAL_GPIO_WritePin(TXEN_485_GPIO_Port, TXEN_485_Pin, GPIO_PIN_SET);//使能485芯片发送 HAL_UART_Transmit_DMA(huart, data, len); } else { HAL_UART_Transmit_DMA(huart, data, len); } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 发送完成后的处理逻辑 HAL_GPIO_WritePin(TXEN_485_GPIO_Port, TXEN_485_Pin, GPIO_PIN_RESET);//使能485芯片接收 } } void Usart_Receive() { if(usart3_count>0) { if( (uint16_t)uBuff3[0] == dev_reg.addr ) { switch(uBuff3[1]) { case 0x03: //读传感器数据 MODBUS_03H(); break; default:break; } } } if(usart1_count>0) { if( (uint16_t)uBuff1[0] == 1 ) { switch(uBuff1[1]) { case 0x03: //读传感器数据 change_addr(); break; case 0x10: //读传感器数据 MODBUS_10H(); break; default:break; } } } } /************************************************************ * Name: CRC-16/MODBUS x16+x15+x2+1 * Poly: 0x8005 * Init: 0xFFFF * Refin: True * Refout: True * Xorout: 0x0000 * Note: **********************************************************/ uint16_t crc16_modbus(uint8_t *data, uint16_t length) { uint8_t i; uint16_t crc = 0xffff; // Initial value while(length--) { crc ^= *data++; // crc ^= *data; data++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005 else crc = (crc >> 1); } } return crc; } void MODBUS_03H() { //接收到的数据帧 //485地址 功能位 寄存器地址 寄存器个数 crc低位 crc高位 uint8_t crch,crcl; uint16_t crcack; uint16_t addr = (uint16_t)uBuff3[2]<<8 | uBuff3[3]; //寄存器地址 uint16_t number = (uint16_t)uBuff3[4]<<8 | uBuff3[5]; //寄存器数量 uint16_t crc = crc16_modbus(uBuff3,6); //计算CRC crch = crc>>8; crcl = crc&0x00FF; int16_t *p = (int16_t*)&dev_reg; for(uint8_t i=1;i>8; TXBuff3[cnt++] = user_register[addr+i] & 0xFF; } crcack = crc16_modbus(TXBuff3,cnt); TXBuff3[cnt++] = crcack & 0xff; TXBuff3[cnt++] = crcack >>8; send_data(&huart3, TXBuff3, cnt); } } void send_UI(uint8_t a) { uint8_t cnt =0; uint16_t crcValue = 0; TXBuff1[cnt++] = 1; TXBuff1[cnt++] = 0x10; //功能位 TXBuff1[cnt++] = 0x1000>>8; //寄存器起始地址 TXBuff1[cnt++] = 0x1000&0xFF; TXBuff1[cnt++] = 0; //寄存器个数 TXBuff1[cnt++] = a; TXBuff1[cnt++] = a*2; //字节数 TXBuff1[cnt++] = dev_reg.magnetic_X>>8; TXBuff1[cnt++] = dev_reg.magnetic_X&0xFF; TXBuff1[cnt++] = dev_reg.magnetic_Y>>8; TXBuff1[cnt++] = dev_reg.magnetic_Y&0xFF; TXBuff1[cnt++] = dev_reg.magnetic_Z>>8; TXBuff1[cnt++] = dev_reg.magnetic_Z&0xFF; TXBuff1[cnt++] = dev_reg.magnetic_V>>8; TXBuff1[cnt++] = dev_reg.magnetic_V&0xFF; TXBuff1[cnt++] = dev_reg.electric_V>>8; TXBuff1[cnt++] = dev_reg.electric_V&0xFF; TXBuff1[cnt++] = dev_reg.tempe>>8; TXBuff1[cnt++] = dev_reg.tempe&0xFF; TXBuff1[cnt++] = dev_reg.humidness>>8; TXBuff1[cnt++] = dev_reg.humidness&0xFF; if(a ==8) { TXBuff1[cnt++] = dev_reg.addr>>8; TXBuff1[cnt++] = dev_reg.addr&0xFF; } crcValue = crc16_modbus(TXBuff1, cnt); TXBuff1[cnt++] = crcValue&0xFF; TXBuff1[cnt++] = crcValue>>8; send_data(&huart1, TXBuff1, cnt); } void MODBUS_10H() { uint8_t cnt =0; uint16_t crcValue =0; TXBuff1[cnt++] = 1; TXBuff1[cnt++] = 3; TXBuff1[cnt++] = 0x1007>>8; TXBuff1[cnt++] = 0x1007&0xFF; TXBuff1[cnt++] = 0; TXBuff1[cnt++] = 1; crcValue = crc16_modbus(TXBuff1, cnt); TXBuff1[cnt++] = crcValue&0xFF; TXBuff1[cnt++] = crcValue>>8; send_data(&huart1, TXBuff1, cnt); } void change_addr() { if(uBuff1[2] == 2) { int16_t data =uBuff1[3]<<8 |uBuff1[4]; if(data == 0) { send_UI(8); } else { if(data != dev_reg.addr) { dev_reg.addr =data; uint8_t parameters[2]; parameters[0] = data>>8; parameters[1] = data&0xFF; AT24C16_WriteBytes(0, parameters, sizeof(parameters)); } } } }