๐ŸงŠ STM32

[STM32] 8. ์Šค์œ„์น˜ ์ฑ„ํ„ฐ๋ง (์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฐ”์šด์‹ฑ)

18์ง„์ˆ˜ 2024. 11. 18. 23:58

์Šค์œ„์น˜ ์ฑ„ํ„ฐ๋ง

ํ‘ธ์‰ฌ ๋ฆฌํ„ด ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅผ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ์ด์ฆˆ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์‹ ํ˜ธ๋กœ ์ธํ•ด ์Šค์œ„์น˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ˆŒ๋ ธ๋‹ค๊ณ  ์ธ์‹๋˜๋Š” ํ˜„์ƒ์„ "์ฑ„ํ„ฐ๋ง" ๋˜๋Š” "๋””๋ฐ”์šด์‹ฑ" ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋””๋ฐ”์šด์‹ฑ ํ•„ํ„ฐ๋ง์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋””๋ฐ”์šด์‹ฑ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํ•˜๋“œ์›จ์–ด์  ๋ฐฉ๋ฒ•๊ณผ ์†Œํ”„ํŠธ์›จ์–ด์  ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฐ”์šด์‹ฑ์„ ํ†ตํ•ด ์ฑ„ํ„ฐ๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋ ค ํ•œ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฐ”์šด์‹ฑ์€ ์ฝ”๋“œ๋กœ ๋””๋ฐ”์šด์‹ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์•„๋‹ค. ์ฃผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‹ ํ˜ธ๊ฐ€ ์•ˆ์ •์ ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๐Ÿ”— 1. ์ฝ”๋“œ

/* USER CODE BEGIN PTD */
#define DEBOUNCE_DELAY 30 /* 30ms */
/* USER CODE END PTD */

...

/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

volatile uint32_t lastInterruptTime = 0;
/* USER CODE END 0 */

...

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == BTN_Pin)
	{
		 uint32_t currentTime = HAL_GetTick(); /* check current time */
		 if ((currentTime - lastInterruptTime) > DEBOUNCE_DELAY){ /* check filtering 30ms time */
			 lastInterruptTime = currentTime; /* update interrupt time */
			 if (HAL_GPIO_ReadPin(GPIOA, BTN_Pin) == GPIO_PIN_SET){
				 HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, GPIO_PIN_SET);
			 }else{
				 HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, GPIO_PIN_RESET);
			 }
		 }
	}
}
/* USER CODE END 4 */
  • ํƒ€์ด๋จธ ์‚ฌ์šฉ: HAL_GetTick() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์‹œ์Šคํ…œ์ด ๋ถ€ํŒ…๋œ ์ดํ›„์˜ ๋ฐ€๋ฆฌ์ดˆ(ms) ๋‹จ์œ„ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋””๋ฐ”์šด์‹ฑ ์ ์šฉ: ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ๋งˆ์ง€๋ง‰ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜์—ฌ ๋””๋ฐ”์šด์‹ฑ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ฒ„ํŠผ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ๋””๋ฐ”์šด์‹ฑ ์‹œ๊ฐ„ ์„ค์ •: DEBOUNCE_DELAY ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฐ”์šด์‹ฑ ์‹œ๊ฐ„์„ ์„ค์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 50ms๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

๐Ÿ“Œ 2. ํŠน์ง•

  • ๋””๋ฐ”์šด์‹ฑ ์‹œ๊ฐ„ ์„ ํƒ: ๋„ˆ๋ฌด ์งง์œผ๋ฉด ์ฑ„ํ„ฐ๋ง์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๊ณ , ๋„ˆ๋ฌด ๊ธธ๋ฉด ๋ฒ„ํŠผ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์‘๋‹ต์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ 10ms์—์„œ 50ms ์‚ฌ์ด์˜ ๊ฐ’์ด ์ ์ ˆํ•˜๋‹ค.
  • ํƒ€์ด๋จธ ์‚ฌ์šฉ: ์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฐ”์šด์‹ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ํƒ€์ด๋จธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ํ›„ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๋ฒ„ํŠผ ์ž…๋ ฅ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒํƒœ ํ™•์ธ: ๋ฒ„ํŠผ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ด ๋ฒ„ํŠผ์˜ ์ฑ„ํ„ฐ๋ง ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฐ”์šด์‹ฑ์€ ์ฝ”๋“œ๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด volatile ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์€ volatile ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ด๋ณด๋ ค ํ•œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•