본문 바로가기

[Harman] 임베디드 시스템을 위한 sw 구조설계

[부산 인력개발원 Harman 과정]임베디드 시스템을 위한 sw 구조설계 6

오늘은 counter를 사용하여 PWM 파형을 생성하고 서보모터를 제어해볼 생각이다.

 

먼저 counter는 stm32f411RE 보드를 기준으로 최대 0 ~ 0Xffff 값까지 count 할 수 있고 counter를 위한 다양한 레지스터가 존재한다. 먼저

ARR(Auto Reload Register)는 Counter 하는 최대 값을 조절하는 레지스터이며 읽기 쓰기가 가능한 레지스터이다

 

IOC에서 Counter Period (AutoReload Register - 16 bits value ) 에서 설정해서 변경시킬 수 있다.

 

그리고 CCR 레지스터가 있다 CCR레지스터는 입력신호가 주어질 떄 카운터(CNT)값을 받아내는 capture 기능,

그리고 CNT 값이 CCR 값과 같아지는 순간(CNT == CCR) 인터럽트를 발생시키거나 출력 채널로 0 또는 1을 출력하여 PWM 파형을 생성할 수 있는 기능을 수행하는 레지스터이다.

 

그리고 프리스케일러(Prescaler)가 있는데 프리스케일러는 공급되는 클럭을 1~65,536 값으로 나누어서 카운터의 동작 클럭을 조절할 수 있는 분주기이다.

 

이렇게 CNT, ARR, CCR, 프리스케일러 을 통해서 PWM 파형을 생성하고자한다.

 

IOC에서 설정을 하면

먼저 우리는 Timer 3를 사용할 것이기에 Tim3 핀을 선택 -> Clock soource를 Internal Clock으로 설정 -> 파형을 출력하는 채널을 PWM Generation CH1으로 설정한다.

 

그리고 Clock Configuration에 들어가서 

 

HCLK 값을 계산하기 편하게 80MHz로 설정해준다.

 

그리고 parameter settings 에서 Prescaler를 8000으로 설정해서 Clock을 10Khz 설정해준다.

 

그리고 PWM신호의 주기를 설정하기 위해 Counter Period(ARR) 값을 500으로 설정해준다.

 

그리고 듀티비를 50%로 설정하기위해 Pulse(CCR)를 ARR값의 절반인 250으로 설정해주고 코드를 생성한다.

 

이렇게 하면 주파수는 20Hz, 듀티비는 50%의 파형이 생성된다.

(HCLK/Prescaler)/ARR = Frequency

 

 

 

이렇게 설정하고 코드를 생성한 후 main.c에

 

 

HAL library에서 제공하는 HAL_TIM_PWM_Start 라는 함수를 호출하여 매개변수로 사용하고자하는 타이머의 핸들러 타입, 출력하고자 하는 채널을 넣어주면 Channel 1과 연결된 핀에서 PWM 파형이 출력되게 된다.

 

 

이렇게 코드를 생성하고 run을 누르고 Channel 1에 연결된 핀인 PA6을 오실로스코프로 확인해보면

 

 

20Hz에 듀티비는 50%인 PWM 파형이 생성되는 것을 확인할 수 있다.

 

그럼 이런 PWM을 사용하여 제어를 하는 부품중 유명한 서보모터를 사용해보고자 한다.

 

먼저 서보모터는 50Hz에서 동작하는 모터이며  펄스 폭을 이용하여 모터의 각도를 조절하는 소자이다.

 

먼저 50Hz 주파수를 맞춰주기 위해 계산을 하면

ARR값을 200으로 설정하고 Pulse를 절반 값인 100으로 설정하고 코드 생성 후 실행해서 오실로스코프로 측정해보면

 

50Hz가 생성되는 것을 확인할 수 있다.

 

그럼 서보모터가 동작하기 위한 듀티비를 맞추기 위해 CCR 값을 10으로 설정하면

 

1ms의 펄스폭을 가진 pwm파형이 생성된다.

 

이제 스위치를 누르면 펄스폭이 변화하면서 서보모터의 각도를 조절하는 코드를 만들어보자

 

앞에서 실습해봤던 EXIT를 통해 펄스폭이 바뀌는 코드를 생성했다

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(degree)
	{
	case 0:
		htim3.Instance -> CCR1 = 10;
		degree++;
		break;
	case 1:
		htim3.Instance -> CCR1 = 15;
		degree++;
		break;
	case 2:
		htim3.Instance -> CCR1 = 20;
		degree++;
		break;
	case 3:
		htim3.Instance -> CCR1 = 25;
		degree = 0;
		break;




	}
}
/* USER CODE END 4 */

설정한 변수에 따라 CCR1 값이 변화하면서 펄스폭을 변경시키는 코드이다.

 

해당 코드를 추가하고 run을 했을 때 오실로스코프로 파형의 변화를 확인하였다.

 

 

 

 

 

펄스폭이 스위치를 누를때마다 1ms, 1.5ms, 2ms, 2.5ms로 4단계로 변경되는 것을 확인할 수 있다.

 

해당 PWM핀을 서보모터의 Signal 핀에 꼽고 동작을 시켜보면.

 

 

 

스위치를 누를때 마다 펄스폭이 변화하면서 서보모터 각도가 변하는 것을 확인할 수 있다.