/* * user.c * * Created on: Jun 24, 2024 * Author: 10425 */ #include "user.h" uint8_t usart_count = 0; //串口接收数据个数 uint8_t RxBuff[BUFF_LEN] = {0}; //串口接收缓冲区 uint8_t TXBuff[BUFF_LEN] = {0}; //串口发送缓冲区 uint8_t uBuff[BUFF_LEN] = {0}; uint16_t adcBuff[ADCBUFF_LEN] = {0}; uint16_t lineData[128]; uint8_t font[] ="电压脉宽频率单次重复"; enum CODER_MODE coder_mode = voltage_mode; enum OUTPUT_MODE output_mode = none; int16_t voltage = 0; //单片机时钟频率60Mhz,定时器3时钟分频3.定时器计数一次是50ns; int16_t pulse = 2; int16_t frequency = 1; int16_t coder_number =0; //编码器值 uint8_t draw_flag =0; //曲线标记,之前的曲线已经被覆盖,才需要重新画 void user_init(void) { __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE); __HAL_UART_CLEAR_FLAG(&huart3,UART_FLAG_TC); //清除发送完成标志 __HAL_UART_CLEAR_IDLEFLAG(&huart3); //清除空闲中断标志 bsp_InitTimer(); Init_Key(); for(uint8_t i =0;i<128;i++) { lineData[i] = 0; if(3240)voltage =40; LCD_setInt(0x0001,voltage); temp = voltage*83.4*4095/3300; if(temp>4095)temp=4095; HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); } //调脉宽 else if(coder_mode == pulse_mode) { if(coder_number>0) { if(pulse<20) { pulse+=2*coder_number; if(pulse>20)pulse=20; } else if(pulse<2000) { pulse+=20*coder_number; if(pulse>2000)pulse =2000; if(flag_uinit == 0) { uint8_t *a =(uint8_t*) " 50us"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =1; } } if(pulse ==20) { uint8_t *a =(uint8_t*) "us"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); } else if(coder_number<0) { if(pulse<=20 && pulse >2) { pulse+=2*coder_number; if(pulse<2)pulse=2; } else if(pulse>20) { pulse+=20*coder_number; if(pulse <20)pulse = 20; if(pulse <=20) { if(flag_uinit == 1) { uint8_t *a =(uint8_t*) "500ns"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =0; } } } if(pulse ==18) //一个计数50ns { uint8_t *a =(uint8_t*) "ns"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); } } else if(coder_mode == frequency_mode) { frequency+=coder_number; if(frequency<1)frequency =1; else if(frequency>500)frequency =500; LCD_setInt(0x0003,frequency); __HAL_TIM_SET_AUTORELOAD(&htim2, 10000/frequency-1); } coder_number=0; } void key_slave(void) //按键处理 { uint8_t key_code; static uint8_t flag_uinit = 0; //用于标记曲线的横坐标 key_code = bsp_GetKey(); if(key_code == KEY_NONE)return; switch(key_code) { //编码器按键 case KEY_BM4_DOWN: LCD_setBell(100); coder_mode++; if(coder_mode>=enum_CodeNum)coder_mode = 0; LCD_setFont(0x0020,coder_mode); break; //脉宽增加按钮,pulse计数一次,50ns case KEY_PULSE_UP_DOWN: if(pulse<20) { pulse+=2; } else if(pulse<2000) { pulse+=200; pulse = pulse/100*100; if(flag_uinit == 0) { uint8_t *a =(uint8_t*) " 50us"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =1; } } if(pulse ==20) { uint8_t *a =(uint8_t*) "us"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); break; //脉宽减少按钮 case KEY_PULSE_DN_DOWN: if(pulse<=20 && pulse >2) { pulse-=2; } else if(pulse>20) { pulse-=200; if(pulse ==0)pulse = 20; if(pulse <=20) { if(flag_uinit == 1) { uint8_t *a =(uint8_t*) "500ns"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =0; } } } if(pulse ==18) { uint8_t *a =(uint8_t*) "ns"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); break; //频率加调节 case KEY_FREQ_UP_DOWN: if(frequency<100)frequency +=10; else if(frequency<500) { frequency +=50; } frequency = frequency/10*10; LCD_setInt(0x0003,frequency); __HAL_TIM_SET_AUTORELOAD(&htim2, 10000/frequency-1); break; //频率减 case KEY_FREQ_DN_DOWN: if(frequency>100)frequency -=50; else if(frequency>1) { frequency -=10; } frequency = frequency/10*10; if(frequency == 0)frequency=1; LCD_setInt(0x0003,frequency); __HAL_TIM_SET_AUTORELOAD(&htim2, 10000/frequency-1); break; //异常检测开关按下 case KEY_ERR_DOWN: HAL_GPIO_WritePin(OUTPUTCTL_GPIO_Port, OUTPUTCTL_Pin, GPIO_PIN_RESET); break; //异常检测开关抬起 case KEY_ERR_UP: HAL_GPIO_WritePin(OUTPUTCTL_GPIO_Port, OUTPUTCTL_Pin, GPIO_PIN_SET); break; default:break; } } static uint16_t head,Length,order; //帧头,指令长度,指令 void uart_slave(void) //串口处理 { if(usart_count == 0)return; head = uBuff[0]<<8 | uBuff[1]; Length = uBuff[2]; order = uBuff[3]; static uint8_t flag_uinit = 0; //用于标记曲线的横坐标 if(head == 0xA55A && Length == 6 && order == 0x83) { uint16_t key_code; int32_t temp; key_code = uBuff[7]<<8 | uBuff[8]; switch(key_code) { case 1: //电压减 if(voltage>0)voltage-=5; voltage = voltage/5*5; LCD_setInt(0x0001,voltage); temp = voltage*83.4*4095/3300; if(temp>4095)temp=4095; HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); break; case 2: //电压加 if(voltage<40)voltage+=5; voltage = voltage/5*5; LCD_setInt(0x0001,voltage); temp = voltage*83.4*4095/3300; if(temp>4095)temp=4095; HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); break; case 3://脉宽减 if(pulse<=20 && pulse >2) { pulse-=2; } else if(pulse>20) { pulse-=200; if(pulse ==0)pulse = 20; if(pulse <=20) { if(flag_uinit == 1) { uint8_t *a =(uint8_t*) "500ns"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =0; } } } if(pulse ==18) { uint8_t *a =(uint8_t*) "ns"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); break; case 4://脉宽加 if(pulse<20) { pulse+=2; } else if(pulse<2000) { pulse+=200; pulse = pulse/100*100; if(flag_uinit == 0) { uint8_t *a =(uint8_t*) " 50us"; LCD_setChar(0x0010, a,5); HAL_Delay(1); flag_uinit =1; } } if(pulse ==20) { uint8_t *a =(uint8_t*) "us"; LCD_setChar(0x0005, a,2); } LCD_setInt(0x0002,Pulse_To_Time(pulse)); break; case 5://频率减 if(frequency>100)frequency -=50; else if(frequency>1) { frequency -=10; } frequency = frequency/10*10; if(frequency == 0)frequency=1; LCD_setInt(0x0003,frequency); __HAL_TIM_SET_AUTORELOAD(&htim2, 10000/frequency-1); break; case 6://频率加 if(frequency<100)frequency +=10; else if(frequency<500) { frequency +=50; } frequency = frequency/10*10; LCD_setInt(0x0003,frequency); __HAL_TIM_SET_AUTORELOAD(&htim2, 10000/frequency-1); break; case 7: //单次输出 if(output_mode != redo_mode) { HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pulse-1); PWM_Start_Once(); } else { HAL_TIM_Base_Stop_IT(&htim2); output_mode = none; LCD_setFont(0x0030,3); } break; case 8://重复输出 if(output_mode != redo_mode) { // HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2); // __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pulse-1); LCD_setFont(0x0030,4); draw_flag =1; if( pulse <= 20) //1us以内 { for(uint8_t i =0;i<128;i++) { lineData[i] = 0; if(32Instance == TIM2) { HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pulse-1); PWM_Start_Once(); } } uint16_t Pulse_To_Time(uint16_t pulse) { uint32_t a = pulse; a = a*50; if(a >= 1000)a =a/1000; return (uint32_t)a; } void PWM_Start_Once() { HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2); bsp_StartTimer(1, 300); if(draw_flag ==0) { draw_flag =1; if( pulse <= 20) //1us以内 { for(uint8_t i =0;i<128;i++) { lineData[i] = 0; if(32