[STM32G4]エンベデッドブルーブリッジカップの準備---実際の戦闘---第12回エンベデッドシミュレーションコンペティション


序文

スペースを削減するために、各モジュールの初期化はモジュール構成にあり、いつでもブログを読むことができ、関数内の関数は表示されなくなり、スクリーンショットのみが表示されます。

1.トピック

一般的に、シミュレーションコンテストは非常に単純であり、今年のテストの質問は単純である(純粋に推測)ことを示している可能性があります
。それでも、テストの準備は慎重に行う必要があります。

機能概要

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.モジュールの初期化と機能分析

1.モジュールの初期化

必要なモジュール:LCD、4つのボタン、LED、ADC(PB15)、TIM

2.モジュール機能分析

LCD:ディスプレイ-----》 Display();
ボタン:パラメータの調整-----》 KEY_Handle(); KEY_Scan();
LED:プロンプト機能-----》 LED();
ADC(PB15):温度センサーから出力された信号を読み取ります-----》 Get_ADC();
TIM(PA1):異なる周波数の方形波を出力します

3、関数の実装

1.void Display(void);

void Display(void)
{
    
    
	
	if(mode == 0)
	{
    
    
		LCD_DisplayStringLine(Line1,"      Data");
		sprintf((char *)arr, " V:%.2fV",Volt);
		LCD_DisplayStringLine(Line3,arr);
		sprintf((char *)arr, " A:%d",Condition);
		LCD_DisplayStringLine(Line4,arr);
	}
	else if(mode == 1)
	{
    
    
		LCD_DisplayStringLine(Line1,"      Para");
		sprintf((char *)arr, " Vmax:%.1fV",Volt_Range[1]);
		LCD_DisplayStringLine(Line3,arr);
		sprintf((char *)arr, " Vmin:%.1fV",Volt_Range[0]);
		LCD_DisplayStringLine(Line4,arr);
	}
}

2.uint8_t KEY_Scan(uint8_tモード);

uint8_t KEY_Scan(uint8_t mode)
{
    
    
	static uint8_t flag=1;
	if(mode)	flag = 1;
	if(flag &&(KEY_B1 == 0 || KEY_B2	== 0 || KEY_B3 == 0 ||	KEY_B4== 0 ))
	{
    
    
		HAL_Delay(10);
		flag = 0;
		if (KEY_B1 == 0)	return B1_Press;
		else if (KEY_B2 == 0) return B2_Press;
		else if (KEY_B3 == 0) return B3_Press;
		else if (KEY_B4 == 0) return B4_Press;
	}else if(KEY_B1 == KEY_B2 == KEY_B3 == KEY_B4 == 1)	flag = 1;
	return 0;
}

3.void KEY_Handle(uint8_t key);

3つのボタンについて、異なるボタンは異なる操作に対応します。
このシミュレーションの質問では、誤操作防止は1つだけです。B1が押されたときの電圧範囲を記録するだけで済みます。

void KEY_Handle(uint8_t key)
{
    
    
	static float i, j;
	if(key == B1_Press)
	{
    
    
		if(mode == 0)
		{
    
    
			i = Volt_Range[0];
			j = Volt_Range[1];
			mode = 1;
		}
		else
		{
    
    
			if(Volt_Range[1] - Volt_Range[0] < 0.5f)
			{
    
    
				Volt_Range[0] = i;
				Volt_Range[1] = j;
			}
			mode = 0;
		}
		LCD_Clear(White);
	}
	else if(key == B2_Press && mode == 1)
	{
    
    
		if(Volt_Range[1] == 0)
			Volt_Range[1] = 3.3f;
		else
			Volt_Range[1] = Volt_Range[1] - 0.1f;
		
	}
	else if(key == B3_Press && mode == 1)
	{
    
    
		if(Volt_Range[0] == 3.3f)
			Volt_Range[0] = 0;
		else
			Volt_Range[0] = Volt_Range[0] + 0.1f;
	}
}

4.uint16_t Get_ADC(void);

電圧値を読み取ります。電圧値はGet_ADC()* 3.3 / 4096です。

uint16_t Get_ADC(void)
{
    
    
	uint16_t temp = 0 ;
	HAL_ADC_Start(&hadc2);
	temp = HAL_ADC_GetValue(&hadc2);
	HAL_ADC_Stop(&hadc2);
	
	return temp;
}

5.int main(void);

ここに画像の説明を挿入します

初期化;

	LCD_Init();
	LCD_Clear(White);
	LCD_SetTextColor(Black);

	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_ADC_Init(&hadc2);

	Volt_Range[0] = 1;
	Volt_Range[1] = 3;
	Condition = 1;
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);

while(1);

ここに画像の説明を挿入します
タイマー出力PWM波の説明を次に示します
。ARRはロード値、PSCはプリスケーラー係数、CCR1はチャネル1の比較値です。
つまり、CCR1がハイ(ロー)を出力するまでカウントされ、CCR1からARRは次のようになります。低(高)、ここでは構成モードによって異なります

		Display();
		key = KEY_Scan(0);
		KEY_Handle(key);
		Volt = Get_ADC()*3.3/4096;
		
		if(Volt < Volt_Range[0])
			Condition_Stay = 1;
		else if(Volt > Volt_Range[1])
			Condition_Stay = 3;
		else
			Condition_Stay = 2;
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		/* 输出要求 */
		if(Condition_Stay == 1 && Condition_Stay != Condition)
		{
    
    
			Condition = Condition_Stay;
			TIM2->ARR = 1000-1;
			TIM2->PSC = 800-1;
			TIM2->CCR2 = 500;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_10
                          |GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		else if(Condition_Stay == 2 && Condition_Stay != Condition)
		{
    
    
			Condition = Condition_Stay;
			TIM2->ARR = 1000-1;
			TIM2->PSC = 80-1;
			TIM2->CCR2 = 800;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		else if(Condition_Stay == 3 && Condition_Stay != Condition)
		{
    
    
			Condition = Condition_Stay; 
			TIM2->ARR = 1000-1;
			TIM2->PSC = 8-1;
			TIM2->CCR2 = 200;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
  }

総括する

シミュレーションコンテストに参加するのは初めてですが、ジオはまだ違う気がします。
私は昨日それを終えました、私は書く時間がありませんでした、私を許してください、へへ。
それのように、私は最近それが好きではありません、それはさわやかです。┭┮﹏┭┮

おすすめ

転載: blog.csdn.net/qq_47877230/article/details/115009003