【学習】LanqiaoCupEmbedded:8番目の予備テストの質問—シミュレーションリフティングコントローラー

はじめ
に8番目の予備テストの質問について。オシロスコープを持っていないので、PWM部分を書きましたが、デバッグしませんでした。したがって、システム全体で、PWM_Set部分に注釈が付けられているので、大きな問題なく使用できます(ただし完全ではありません)。 。この記事は、メモを取り、コミュニケーションを取り、学習するためのものですが、まだ改善の余地があります。質問や洞察がある場合は、コメント領域にメッセージを残すことができます。

1.トピックの言い換え

ここに画像の説明を挿入

関数の説明
ここに画像の説明を挿入
ここに画像の説明を挿入

2.システム設計分析

全体的なアイデアはグレードで実現され、最初に小さな機能を実現し、次に徐々に改善されます。
1.ボタンフレーム:

void KEY_Cmd_Judge(void)
{
    
    
	key_cmd_flag = KEY_Read();
	
	if(key_cmd_flag == 1)
	{
    
    
		KEY_1_Processing();
	}
	else if(key_cmd_flag == 2)
	{
    
    
		KEY_2_Processing();
	}
	else if(key_cmd_flag == 3)
	{
    
    
		KEY_3_Processing();
	}
	else if(key_cmd_flag == 4)
	{
    
    
		KEY_4_Processing();
	}
}

主な機能の内訳

static void KEY_1_Processing(void)
{
    
    
	key_1_flag = 1; //标志位(预留),实际并未用到,仅用到了“平台标志位”
	platform[1] = 1; //平台标志位
	LED_Ctrl(LED_0,ON);
}
static void KEY_2_Processing(void)
{
    
    
	key_2_flag = 1;
	platform[2] = 1;
	LED_Ctrl(LED_1,ON);
}
static void KEY_3_Processing(void)
{
    
    
	key_3_flag = 1;
	platform[3] = 1;
	LED_Ctrl(LED_2,ON);
}

static void KEY_4_Processing(void)
{
    
    
	key_4_flag = 1;
	platform[4] = 1;
	LED_Ctrl(LED_3,ON);
}
对于绝大多数的功能,我选择在定时器中断中完成(可能导致定时不精确)

2、SysTick_Handler(void)

void SysTick_Handler(void)
{
    
    
	fulid_count++;
	Fulid();

	Handler_count++;
	time_count++;
	Time_Display();
	if(TimeDelay_ms != 0)
	{
    
    
		TimeDelay_ms--;
	}
	if(time_count == TIME_s)
	{
    
    
		time_count = 0;
		Time_s++;
	}
	if(TimeElevator_ms != 0)
	{
    
    
		TimeElevator_ms--;
		Elevator_Operation(); //进行开关门等操作
	}
	if(Handler_count % 20 == 0) //20ms 一次 判断
	{
    
    
		KEY_Cmd_Judge();
		LCD_Display();
	}
}

3. LCD_Display(void)
LCDも非常にシンプルで、デバッグに便利です。ステータス表示機能を追加しましたが、後で削除できます。

void LCD_Display(void)
{
    
    
	LCD_DisplayStringLine(Line2, (uint8_t*)"       Current  ");
	sprintf(LCD_Txt,"          %d",elevator_current);
	LCD_DisplayStringLine(Line4,(uint8_t*)LCD_Txt);
	sprintf(LCD_Txt,"       %d:%d:%d   ",Time_h,Time_m,Time_s);
	LCD_DisplayStringLine(Line6,(uint8_t*)LCD_Txt);
	if(open_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Open   ");
	}
	else if(close_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Close   ");
	}
	else if(up_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Up     ");
	}
	else if(down_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Down    ");
	}
	else	if(wait_flag == 1)
	{
    
    
		sprintf(LCD_Txt,"         Wait     ");
	}
	else
	{
    
    
		sprintf(LCD_Txt,"         Wait     ");
	}
	LCD_DisplayStringLine(Line8,(uint8_t*)LCD_Txt);
}

4. Time_Display(void)
時間は次のように処理されます

void Time_Display(void)
{
    
    
	if(Time_s == 60)
	{
    
    
		Time_s = 0;
		Time_m += 1;
	}
	if(Time_m == 60)
	{
    
    
		Time_m = 0;
		Time_h += 1;
	}
	if(Time_h == 24)
	{
    
    
		Time_h = 0;
	}
}

5.フルイド(ボイド)
ウォーターランプモジュール
タイマーにすべての機能を実装することを選択したため、遅延を使用する場合は、カウント変数を宣言してから個別に処理する必要があります。

void Fulid(void)
{
    
    
	if((up_flag == 1) && (fulid_count%Fluid_Time == 0))
	{
    
    
		fulid_i++;
		if(fulid_i == 1)
		{
    
    
			LED_Ctrl(LED_4,1);
		}
		else if(fulid_i == 2)
		{
    
    
			LED_Ctrl(LED_4,0);
			LED_Ctrl(LED_5,1);
		}
		else if(fulid_i == 3)
		{
    
    
			LED_Ctrl(LED_5,0);
			LED_Ctrl(LED_6,1);
		}
		else if(fulid_i == 4)
		{
    
    
			LED_Ctrl(LED_6,0);
			LED_Ctrl(LED_7,1);
		}
		else if(fulid_i == 5)
		{
    
    
			LED_Ctrl(LED_7,0);
			fulid_i = 0;	
		}
	}
	else if((down_flag == 1)&& (fulid_count%Fluid_Time == 0))
	{
    
    
		fulid_i++;
		if(fulid_i == 1)
		{
    
    
			LED_Ctrl(LED_7,1);
		}
		else if(fulid_i == 2)
		{
    
    
			LED_Ctrl(LED_7,0);
			LED_Ctrl(LED_6,1);
		}
		else if(fulid_i == 3)
		{
    
    
			LED_Ctrl(LED_6,0);
			LED_Ctrl(LED_5,1);
		}
		else if(fulid_i == 4)
		{
    
    
			LED_Ctrl(LED_5,0);
			LED_Ctrl(LED_4,1);
		}
		else if(fulid_i == 5)
		{
    
    
			LED_Ctrl(LED_4,0);
			fulid_i = 0;
		}
	}
}

6、Elevator_Working(void)
エレベーター作業の主な機能

void Elevator_Working(void)
{
    
    
	elevator_sum = 0;
	for(elevator_i=0; elevator_i<Platform_num; elevator_i++)
	{
    
    
			elevator_sum += platform[elevator_i];// 1234
	}
	if(elevator_sum != 0)
	{
    
    
		//搜索当前楼层以上的需求 然后 搜索下面楼层
		for(elevator_i=Platform_num-1; elevator_i>elevator_current;elevator_i--)
		{
    
    
			if(platform[elevator_i]==1)
			{
    
    
				elevator_temp = elevator_i;//搜寻最近需求
			}
		}

			
		if(elevator_temp > elevator_current)
		{
    
    

			up_flag = 1;
			down_flag = 0;
			close_flag = 0;
			open_flag = 0;
			wait_flag = 0;
			
			GPIO_SetBits(Elevator_GPIO_PORT,Elevator_GPIO_PIN);
			//PWM_Set(1000,80,1);
			TimeElevator_ms = Elevator_TIME*(elevator_temp - elevator_current);
			while(TimeElevator_ms);
			elevator_current = elevator_temp;
			open_flag = 1;
			TimeElevator_ms = Door_TIME;
			while(TimeElevator_ms);
			elevator_current = elevator_temp;
			LED_Close(elevator_current-1);
			wait_flag = 1;
			TimeElevator_ms = Wait_TIME;
			while(TimeElevator_ms);
			close_flag = 1;
			TimeElevator_ms = Door_TIME;
			while(TimeElevator_ms);
		}
		else//确定楼上没有需求
		{
    
    
//				//搜索当前楼层以下的需求 然后 搜索下面楼层
			for(elevator_i=0; elevator_i<elevator_current;elevator_i++)
			{
    
    
				if(platform[elevator_i]==1)
				{
    
    
					elevator_temp = elevator_i;//搜寻最近需求
				}
			}
			if(elevator_temp < elevator_current)
			{
    
    
				up_flag = 0;
				down_flag = 1;
				close_flag = 0;
				open_flag = 0;
				wait_flag = 0;
				GPIO_ResetBits(Elevator_GPIO_PORT,Elevator_GPIO_PIN);
				//PWM_Set(1000,60,1);
				TimeElevator_ms = Elevator_TIME*(elevator_current - elevator_temp);
				while(TimeElevator_ms);
				open_flag = 1;
				TimeElevator_ms = Door_TIME;
				while(TimeElevator_ms);
				elevator_current = elevator_temp;
				LED_Close(elevator_current-1);
				wait_flag = 1;
				TimeElevator_ms = Wait_TIME;
				while(TimeElevator_ms);
				close_flag = 1;
				TimeElevator_ms = Door_TIME;
				while(TimeElevator_ms);
				
			}
		}
	}
}
	

7、Elevator_Operation(void)
フラグビットによって決定される必要があるいくつかの操作

void Elevator_Operation(void)
{
    
    
		if(open_flag == 1)
		{
    
    
			Elevator_Open();
		}
		else if(close_flag == 1)
		{
    
    
			Elevator_Close();
		}
		else if(up_flag == 1)
		{
    
    
			Elevator_UP();
		}
		else if(down_flag == 1)
		{
    
    
			Elevator_DOWN();
		}
}

void Elevator_DOWN(void)
{
    
    
	
	//Fluid_LED(DOWN);
	if(TimeElevator_ms == 0) 
	{
    
    
		down_flag = 0;
		platform[elevator_current] = 0;
	}
}
void Elevator_UP(void)
{
    
    
	
	//Fluid_LED(UP);
	if(TimeElevator_ms == 0) 
	{
    
    
		up_flag = 0;
		platform[elevator_current] = 0;
	}
}

void Elevator_Open(void)
{
    
    
	GPIO_SetBits(Elevator_GPIO_PORT,Door_GPIO_PIN);
	//PWM_Set(2000,50,2);
	if(TimeElevator_ms == 0) 
	{
    
    
		open_flag = 0;
		wait_flag = 0;
	}
}

void Elevator_Close(void)
{
    
    
	GPIO_ResetBits(Elevator_GPIO_PORT,Door_GPIO_PIN);
	//PWM_Set(2000,60,2);
	if(TimeElevator_ms == 0) 
	{
    
    
		close_flag = 0;
		wait_flag = 0;
	}
}
void Elevator_Operation(void)
{
    
    
		if(open_flag == 1)
		{
    
    
			Elevator_Open();
		}
		else if(close_flag == 1)
		{
    
    
			Elevator_Close();
		}
		else if(up_flag == 1)
		{
    
    
			Elevator_UP();
		}
		else if(down_flag == 1)
		{
    
    
			Elevator_DOWN();
		}
}

フレームワークは非常に明確であり、交換して議論することを歓迎します

プロジェクトのソースコード:

链接:https://pan.baidu.com/s/1M4jUBj8PNrhiD8uJRq5qrQ 
提取码:zzfs 

都合がよければ、ワンクリックで3回連続で励ますことができます。

おすすめ

転載: blog.csdn.net/qq_45689790/article/details/115270547