본문 바로가기
하만 세미콘 아카데미/Embedded (STM32)

[Embedded] STM32 - US PWM

by smileww 2024. 5. 31.

이번 프로젝트는 초음파 센서를 PWM으로 제어하는 코드를 작성해보도록 하겠습니다.

 

마찬가지로 새 프로젝트를 생성해서 핀 지정과 설정을 먼저 하도록 하겠습니다.

 

 

 

 

 

 

 

 

이번 프로젝트에서는 트리거 신호가 GPIO로 쓰이지 않고 Timer로 쓰입니다.

 

에코 신호는 이전 프로젝트와 마찬가지로 마찬가지로 GPIO로 쓰입니다.

 

타이머3에서 채널2를 PWM 생성에 사용하고 있습니다. 이는  PWM 신호를 생성하여 초음파 센서의 트리거 핀을 제어합니다. Prescaler 및 Period 설정을 통해 PWM 신호의 주파수와 펄스 폭을 조정합니다. TIM_CHANNEL_2에서 PWM을 시작하여, 초음파 센서의 트리거 신호를 제공합니다. 이는 센서로부터 거리 측정 과정을 시작하기 위해 사용됩니다. PWM의 Pulse 값이 6으로 설정되어 있어, PWM 신호의 HIGH 상태가 짧은 시간 동안 유지됩니다. 이는 초음파 센서에 짧은 펄스를 전송하여 거리 측정을 시작하도록 합니다.

 

 

 

타이머5는 초음파 센서의 에코 신호로부터 시간을 측정하여 실제 거리 계산에 필요한 타이밍 정보를 제공합니다.

 

 

Prescaler 설정이 비교적 낮게 설정되어 있어, 더 빠른 카운트 속도를 갖습니다. 이를 통해 더 정밀한 시간 측정이 가능합니다. 에코 신호의 상승 에지와 하강 에지 사이의 시간 차이를 측정하여, 이를 거리 계산에 사용합니다.

 

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int ts = 0;  // Time_Echo_Start
double dist = 0.0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	int te = htim5.Instance->CNT;
	if(GPIO_Pin == Echo_Pin)
	{
		if(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin) == 1) ts = te;
		else dist = (te - ts) * 0.00017;
	}
}

/* USER CODE END 0 */

 

 

int te = htim5.Instance->CNT를 통 현재 타이머 5의 카운터 값(CNT)을 읽습니다. 타이머 5는 에코 신호의 타이밍을 측정하기 위해 사용됩니다.

 

if(GPIO_Pin == Echo_Pin) 에코 신호를 감지하는 핀에서 인터럽트가 발생했는지 확인합니다.

 

if(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin) == 1) ts = te; 코드는 에코 핀이 HIGH 상태로 전환되면, 현재 타이머 값(te)을 시작 시간(ts)으로 기록합니다. 이는 에코 신호가 시작된 정확한 시점을 포착하기 위함입니다.

 

else dist = (te - ts) * 0.00017; 코드는 에코 핀이 LOW 상태로 전환되면, 현재 타이머 값과 이전에 기록된 시작 시간(ts)의 차이를 계산하여 실제 거리를 계산합니다. 0.00017은 시간을 거리로 변환하기 위한 계수로, 속도와 단위 변환을 포함합니다.

 

거리 계산은 에코 신호의 지속 시간을 사용하여 수행됩니다. 이 시간은 초음파가 목표물에 도달하고 반사되어 돌아오는 데 걸린 시간입니다. 계산된 거리(dist)는 초음파의 속도와 시간을 곱하여 얻습니다. 여기서 사용된 0.00017 계수는 초음파의 속도 (대략 초당 340미터)와 시간 단위의 적절한 변환을 반영합니다.

 

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM3_Init();
  MX_TIM5_Init();
  /* USER CODE BEGIN 2 */

  ProgramStart("Ultra Sonic PWM");
  printf("\033[?25l\n");  // cursor off
  HAL_TIM_Base_Start(&htim5);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  double d = dist * 100;
	  printf("\033[10;10H\033#3Distance : %.2f cm    ", d);
	  printf("\033[11;10H\033#4Distance : %.2f cm    \n", d);
  }
  /* USER CODE END 3 */
}

 

 

 

TIM5는 기본 타이머 모드에서 시작되어 시간 측정을 위해 사용됩니다.

 

TIM3는 채널 2에서 PWM 신호를 생성하기 시작합니다. 이는 초음파 센서의 트리거 신호로 사용됩니다.

 

 

dist 변수에 저장된 거리(미터 단위)를 센티미터로 변환합니다.

 

printf()로 거리 정보를 시리얼 터미널의 특정 위치에 표시합니다. 사용된 ANSI 이스케이프 코드(\033[...)는 커서를 화면의 특정 위치로 이동시키고, 텍스트 모드를 변경하여 출력을 포맷팅합니다.

 

static void MX_TIM3_Init(void)
{
    ...
    htim3.Init.Prescaler = 140-1;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 40000-1;
    ...
    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
    {
        Error_Handler();
    }
    ...
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 6;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    ...
    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
    {
        Error_Handler();
    }
    ...
}

 

 

 

해당 부분은 직접 작성하지 않고 Generation 하면 설정한 값이 자동으로 생성되는 부분입니다. 타이머3의 채널2 PWM에 대한 내용이며 트리거 역할을 대신 수행합니다.

 

 

Run 실행 후 보드와 PC를 연결하여 초음파 센서가 잘 동작하는지 확인합니다.

 

 

 

 

'하만 세미콘 아카데미 > Embedded (STM32)' 카테고리의 다른 글

[Embedded] STM32 ADC - DMA  (0) 2024.05.31
[Embedded] STM32 - ADC - 1  (0) 2024.05.31
[Embedded] STM32 - US Interrupt  (0) 2024.05.31
[Embedded] STM32 - US GPIO  (0) 2024.05.31
[Embedded] STM32 - PWM  (0) 2024.05.31