503 lines
9.6 KiB
C
503 lines
9.6 KiB
C
|
/*
|
|||
|
* 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(32<i && i<64)
|
|||
|
{
|
|||
|
lineData[i] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void coder_slave(void) //按键处理
|
|||
|
{
|
|||
|
static uint8_t flag_uinit = 0; //用于标记曲线的横坐标
|
|||
|
if(coder_mode == voltage_mode)
|
|||
|
{
|
|||
|
int32_t temp;
|
|||
|
voltage=voltage+coder_number;
|
|||
|
if(voltage<0)voltage =0;
|
|||
|
if(voltage>40)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(32<i && i< 32+pulse*3.2)
|
|||
|
{
|
|||
|
lineData[i] = voltage;
|
|||
|
}
|
|||
|
}
|
|||
|
LCD_setLine(lineData, 125);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for(uint8_t i =0;i<128;i++)
|
|||
|
{
|
|||
|
lineData[i] = 0;
|
|||
|
if(32<i && i< 32+pulse*3.2/100)
|
|||
|
{
|
|||
|
lineData[i] = voltage;
|
|||
|
}
|
|||
|
}
|
|||
|
LCD_setLine(lineData, 125);
|
|||
|
}
|
|||
|
|
|||
|
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
|
|||
|
HAL_TIM_Base_Start_IT(&htim2);
|
|||
|
output_mode = redo_mode;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else {
|
|||
|
HAL_TIM_Base_Stop_IT(&htim2);
|
|||
|
output_mode = none;
|
|||
|
LCD_setFont(0x0030,3);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
usart_count =0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
|||
|
{
|
|||
|
if(GPIO_Pin == BM1_Pin)
|
|||
|
{
|
|||
|
if(HAL_GPIO_ReadPin(BM1_GPIO_Port, BM1_Pin) == GPIO_PIN_RESET)
|
|||
|
{
|
|||
|
if(HAL_GPIO_ReadPin(BM2_GPIO_Port, BM2_Pin) == GPIO_PIN_SET)
|
|||
|
{
|
|||
|
coder_number++;
|
|||
|
}
|
|||
|
else if(HAL_GPIO_ReadPin(BM2_GPIO_Port, BM2_Pin) == GPIO_PIN_RESET)
|
|||
|
{
|
|||
|
coder_number--;
|
|||
|
}
|
|||
|
}
|
|||
|
bsp_StartTimer(2, 100);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|||
|
{
|
|||
|
if(htim->Instance == 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<i && i< 32+pulse*3.2)
|
|||
|
{
|
|||
|
lineData[i] = voltage;
|
|||
|
}
|
|||
|
}
|
|||
|
LCD_setLine_ISR(lineData, 125);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for(uint8_t i =0;i<128;i++)
|
|||
|
{
|
|||
|
lineData[i] = 0;
|
|||
|
if(32<i && i< 32+pulse*3.2/100)
|
|||
|
{
|
|||
|
lineData[i] = voltage;
|
|||
|
}
|
|||
|
}
|
|||
|
LCD_setLine_ISR(lineData, 125);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void bsp_RunPer10ms(void)
|
|||
|
{
|
|||
|
bsp_KeyScan10ms();
|
|||
|
}
|