当前位置:网站首页>Final of the 12th Blue Bridge Cup embedded design and development project

Final of the 12th Blue Bridge Cup embedded design and development project

2022-06-22 12:33:00 However, naturally

Competition questions

 Insert picture description here

CubeMX To configure

ADC

 Insert picture description here
 Insert picture description here

Input capture

 Insert picture description here
 Insert picture description here

A serial port

 Insert picture description here
 Insert picture description here

Part of the code

Key function

void KEY_function(void)
{
    
	uint8_t key;
	
	key=KEY_scan();
	
	if(key)
	{
    
		if(key==1)	// Interface switching 
		{
    
			FLAG.display_mode=!FLAG.display_mode;
			
			LCD_Clear(Black);
			if(FLAG.display_mode)	// Parameter setting interface &
			{
    
				FLAG.display_Refresh|=LCD_Line1|LCD_Line2|LCD_Line3|LCD_Line4;
				sprintf((char *)LCD_Line_buf[1]," PARA ");
				sprintf((char *)LCD_Line_buf[2]," Pax:%2d ",DATA.Pax);
				sprintf((char *)LCD_Line_buf[3]," Pbx:%2d ",DATA.Pbx);
				sprintf((char *)LCD_Line_buf[4]," Pf:%-5d ",DATA.Pf);
			}
			else					// Data display interface 
			{
    
				FLAG.display_Refresh|=LCD_Line1|LCD_Line2|LCD_Line3|LCD_Line4|LCD_Line6|LCD_Line7|LCD_Line8;
				sprintf((char *)LCD_Line_buf[1]," DATA ");
				sprintf((char *)LCD_Line_buf[2]," a:%-4.1f ",DATA.a);
				sprintf((char *)LCD_Line_buf[3]," b:%-3.1f ",DATA.b);
				sprintf((char *)LCD_Line_buf[4]," f:%-dHz ",DATA.f);			
			}
		}
		else if(key==2)
		{
    
			if(FLAG.display_mode)	// It only takes effect in the parameter setting interface 
			{
    
				if(DATA.Pax+=10,DATA.Pax>60) DATA.Pax=10;
				if(DATA.Pbx+=10,DATA.Pbx>60) DATA.Pbx=10;
				
				if(DATA.ax>DATA.Pax) led_state&=(~LD1);
				else 				 led_state|=LD1;					

				if(DATA.bx>DATA.Pbx) led_state&=(~LD2);
				else 				 led_state|=LD2;	
				
				sprintf((char *)LCD_Line_buf[2]," Pax:%2d ",DATA.Pax);
				sprintf((char *)LCD_Line_buf[3]," Pbx:%2d ",DATA.Pbx);
				FLAG.display_Refresh|=LCD_Line2|LCD_Line3;				
			}
		}
		else if(key==3)
		{
    
			if(FLAG.display_mode)	// It only takes effect in the parameter setting interface 
			{
    
				if(DATA.Pf+=1000,DATA.Pf>10000)	DATA.Pf=1000;
				sprintf((char *)LCD_Line_buf[4]," Pf:%-5d ",DATA.Pf);
				FLAG.display_Refresh|=LCD_Line4;
			}
			else	// In the data display interface , Switch trigger mode  
			{
    
				DATA.mode=(DATA.mode=='A')?'B':'A';
				
				if(DATA.mode=='A') led_state&=(~LD4);
				else led_state|=LD4;
				
				LCD_Line_buf[8][8]=DATA.mode;
				FLAG.display_Refresh|=LCD_Line8;
				FLAG.ADC_state=0;
			}
		}
		else if(key==4)
		{
    
			if(DATA.mode=='A')	// In mode only A( Key trigger ) Effective under 
			{
    
				FLAG.measure_pwm|=0x03;	// Trigger an angle data refresh 
			}
		}
	}
}

Serial function

u8 buf[35]={
    0};
	
// Return value : 0- Data error 
// 1- The data is correct 
u8  USART_Data_handle(void)
{
    

	memset(buf,0,35);
	
	if(UART2_len>3)	return 0;
	
	if( (UART2_len==2) && (UART2_buf[1]=='?') )	// Query the current angle data 
	{
    
		if(UART2_buf[0]=='a')
		{
    
			sprintf((char *)buf,"a:%-4.1f",DATA.a);
		}
		else if(UART2_buf[0]=='b')
		{
    
			sprintf((char *)buf,"b:%-4.1f",DATA.b);
		}
		else return 0;
	}
	else if( (UART2_len==3) && (UART2_buf[2]=='?') )// Query historical angle data 
	{
    
		if(UART2_buf[0]=='q')	// Data arrangement output 
		{
    
			if(UART2_buf[1]=='a')
			{
    			
				ShellSort(DATA.a_buf_Size,5);
				sprintf((char *)buf,"qa:%-4.1f-%-4.1f-%-4.1f-%-4.1f-%-4.1f",
					DATA.a_buf_Size[0],DATA.a_buf_Size[1],DATA.a_buf_Size[2],DATA.a_buf_Size[3],DATA.a_buf_Size[4]);				
			}
			else if(UART2_buf[1]=='b')
			{
    
				ShellSort(DATA.b_buf_Size,5);
				sprintf((char *)buf,"qb:%-4.1f-%-4.1f-%-4.1f-%-4.1f-%-4.1f",
					DATA.b_buf_Size[0],DATA.b_buf_Size[1],DATA.b_buf_Size[2],DATA.b_buf_Size[3],DATA.b_buf_Size[4]);					
			}
			else return 0;
		}
		else if(UART2_buf[0]==UART2_buf[1])	// Time ordered output 
		{
    
			if(UART2_buf[0]=='a')
			{
    
				sprintf((char *)buf,"aa:%-4.1f-%-4.1f-%-4.1f-%-4.1f-%-4.1f",
					DATA.a_buf[0],DATA.a_buf[1],DATA.a_buf[2],DATA.a_buf[3],DATA.a_buf[4]);
			}
			else if(UART2_buf[0]=='b')
			{
    
				sprintf((char *)buf,"bb:%-4.1f-%-4.1f-%-4.1f-%-4.1f-%-4.1f",
					DATA.b_buf[0],DATA.b_buf[1],DATA.b_buf[2],DATA.b_buf[3],DATA.b_buf[4]);				
			}
			else return 0;
		}
		else return 0;
	}
	else return 0;
	
	HAL_UART_Transmit_DMA(&huart1,buf,35);
	return 1;
}

void USART_function(void)
{
    	
	if(UART2_over_flag)
	{
    
		UART2_over_flag=0;
 
		if(!USART_Data_handle())	// Serial port data processing 
		{
    
			HAL_UART_Transmit_DMA(&huart1,"error",5);		
		}
		HAL_UART_Receive_DMA(&huart1,UART2_buf,UART2_LEN_MAX);	// Re enable the serial port DMA receive 
	}
}

Input capture function

void TIM_IN_function(void)
{
    
	u8 a;
	float data;
	static u8 TIM_IN_flag=0;
	
	//TIM2 CH2
	if(!TIME_TASK.TIM_IN[0])
	{
    
		if(TIM2_IN.flag[1]==0)
		{
    
			TIM2_IN.flag[1]++;
			TIM2->CNT=0;
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
			HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);

			TIME_TASK.OVERTIME[0]=1000;				
		}
		else if(TIM2_IN.flag[1]==3)
		{
    
			TIM_IN_flag++;
			TIM2_IN.flag[1]=0;
			
			TIM2_IN.FRQ[1]=TIM2_IN.TIME_TWO[1]-TIM2_IN.TIME_OEN[1];
			if(TIM2_IN.FRQ[1]) TIM2_IN.FRQ[1]=1000000/TIM2_IN.FRQ[1];
			
			DATA.f=TIM2_IN.FRQ[1];
	
			if(DATA.f>DATA.Pf)	led_state&=(~LD3);
			else 				led_state|=LD3;
			
			if(FLAG.display_mode==0)
			{
    
				sprintf((char *)LCD_Line_buf[4]," f:%dHz ",DATA.f);
				FLAG.display_Refresh|=LCD_Line4;			
			}
			
			TIME_TASK.TIM_IN[0]=TIM_IN_TIME;
		}
		else
		{
    				
			if(!TIME_TASK.OVERTIME[0])
			{
    
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);
				TIM2_IN.TIME_OEN[1]=0;
				TIM2_IN.TIME_TWO[1]=0;
				TIM2_IN.flag[1]=3;
			}
		}
	}
	//TIM3 CH1/2 
	for(a=0;a<2;a++)
	{
    
		if(FLAG.measure_pwm&(0x01<<a))
		{
    
			if(TIM3_IN.flag[a]==0)	// Start 
			{
    
				TIM3_IN.flag[a]++;
// TIM3->CNT=0;
				if(!a)
				{
    
					__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
					HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);					
				}
				else
				{
    
					__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
					HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);					
				}

				TIME_TASK.OVERTIME[a+1]=1000;				
			}
			else if(TIM3_IN.flag[a]==4)	// end , The result of the calculation is 
			{
    
				TIM3_IN.flag[a]=0;
				
				TIM3_IN.zkb[a]=(TIM3_IN.TIME_TWO[a]-TIM3_IN.TIME_OEN[a])*100;
				if(TIM3_IN.zkb[a]) TIM3_IN.zkb[a]/=(TIM3_IN.TIME_THREE[a]-TIM3_IN.TIME_OEN[a]);
				
				if(!a)
				{
    
					if(TIM3_IN.zkb[a]<=10) data=0.0;
					else if(TIM3_IN.zkb[a]>=90) data=180.0;
					else
					{
    
						data=(TIM3_IN.zkb[a]-10)*2.25;	//180-(90-10)=2.25
					}
					
					if(DATA.a>data) DATA.ax=DATA.a-data;
					else DATA.ax=data-DATA.a;
					DATA.a=data;
					
					if(DATA.ax>DATA.Pax) led_state&=(~LD1);
					else 				 led_state|=LD1;			
					
					sprintf((char *)LCD_Line_buf[2]," a:%-4.1f ",DATA.a);
					sprintf((char *)LCD_Line_buf[6]," ax:%-3d ",DATA.ax);
					
					if(FLAG.display_mode==0) FLAG.display_Refresh|= LCD_Line2|LCD_Line6;
				}
				else
				{
    
					if(TIM3_IN.zkb[a]<=10) data=0.0;
					else if(TIM3_IN.zkb[a]>=90) data=90.0;
					else
					{
    
						data=(TIM3_IN.zkb[a]-10)*1.125;	//90-(90-10)=2.25
					}
					
					if(DATA.b>data) DATA.bx=DATA.b-data;
					else DATA.bx=data-DATA.b;
					DATA.b=data;

					if(DATA.bx>DATA.Pbx) led_state&=(~LD2);
					else 				 led_state|=LD2;

					// Included angle between lifting rope and lifting arm 
					if(DATA.a<(90+DATA.b))	DATA.ab=90-DATA.a+DATA.b;
					else					DATA.ab=DATA.a-90-DATA.b;
					
					if(DATA.ab<10) led_state&=(~LD5);
					else 		   led_state|=LD5;

					if(!DATA.Flag) // Before power on acquisition 5 Time 
					{
    
						DATA.a_buf[DATA.num]=DATA.a;
						DATA.b_buf[DATA.num]=DATA.b;
						
						DATA.a_buf_Size[DATA.num]=DATA.a;
						DATA.b_buf_Size[DATA.num]=DATA.b;
						if(++DATA.num==5) {
    DATA.num=0;DATA.Flag=1;}
					}
					else
					{
    
						Shift_array_left(DATA.a_buf,5);
						Shift_array_left(DATA.b_buf,5);
						DATA.a_buf[4]=DATA.a;
						DATA.b_buf[4]=DATA.b;
						
						DATA.a_buf_Size[DATA.num]=DATA.a;
						DATA.b_buf_Size[DATA.num]=DATA.b;
						if(++DATA.num==5) {
    DATA.num=0;}						
					}
					
					sprintf((char *)LCD_Line_buf[3]," b:%-4.1f ",DATA.b);
					sprintf((char *)LCD_Line_buf[7]," bx:%-3d ",DATA.bx);
					
					if(FLAG.display_mode==0) FLAG.display_Refresh|= LCD_Line3|LCD_Line7;			
				}
				
				FLAG.measure_pwm&=(~(0x01<<a));	
			}
			else	// Overtime 
			{
    				
				if(!TIME_TASK.OVERTIME[a+1])
				{
    
					if(!a) 
					{
    
						HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
						if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6))	{
    TIM3_IN.TIME_TWO[a]=1;TIM3_IN.TIME_THREE[a]=1;}	
						else	{
    TIM3_IN.TIME_TWO[0]=0;}						
					}
					else
					{
    
						HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_2);
						if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7))	{
    TIM3_IN.TIME_TWO[a]=1;TIM3_IN.TIME_THREE[a]=1;}	
						else	{
    TIM3_IN.TIME_TWO[0]=0;}						
					}				
					TIM3_IN.TIME_OEN[a]=0;
					TIM3_IN.flag[a]=4;
				}
			}			
		}		
	}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    
	if(htim==(&htim2))
	{
    
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		{
    
			if(TIM2_IN.flag[1]==1)
			{
    
				TIM2_IN.flag[1]++;
				TIM2_IN.TIME_OEN[1]=TIM2->CCR2;
			}
			else if(TIM2_IN.flag[1]==2)
			{
    
				TIM2_IN.flag[1]++;
				TIM2_IN.TIME_TWO[1]=TIM2->CCR2;				
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2);
			}
		}
	}
	if(htim==(&htim3))
	{
    
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		{
    
			if(TIM3_IN.flag[0]==1)
			{
    
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);
				TIM3_IN.flag[0]++;
				TIM3_IN.TIME_OEN[0]=TIM3->CCR1;				
			}
			else if(TIM3_IN.flag[0]==2)
			{
    
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
				TIM3_IN.flag[0]++;
				TIM3_IN.TIME_TWO[0]=TIM3->CCR1;				
			}
			else if(TIM3_IN.flag[0]==3)
			{
    
				HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
				TIM3_IN.flag[0]++;
				TIM3_IN.TIME_THREE[0]=TIM3->CCR1;							
			}
		}	
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		{
    
			if(TIM3_IN.flag[1]==1)
			{
    
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING);
				TIM3_IN.flag[1]++;
				TIM3_IN.TIME_OEN[1]=TIM3->CCR2;				
			}
			else if(TIM3_IN.flag[1]==2)
			{
    
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
				TIM3_IN.flag[1]++;
				TIM3_IN.TIME_TWO[1]=TIM3->CCR2;				
			}
			else if(TIM3_IN.flag[1]==3)
			{
    
				HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_2);
				TIM3_IN.flag[1]++;
				TIM3_IN.TIME_THREE[1]=TIM3->CCR2;							
			}
		}		
	}
}

Program download

Download link :
link :https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
Extraction code :qy2o

原网站

版权声明
本文为[However, naturally]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/173/202206221158137193.html