본문 바로가기
카테고리 없음

[7월] 7/25 월요일 STM32CubeIDE PWM 제어

by 9루트 2022. 7. 25.

STM32H743 칩 기반의 Nucleo 보드를 사용

 

CANFD 통신 및 모터 제어까지의 과정을 해보기로 한다.

 

모델명: NUCLEO-F446ZE

메뉴얼

file:///C:/Users/rndpq/Downloads/um1974-stm32-nucleo144-boards-mb1137-stmicroelectronics.pdf

에서 참조

 

 


1. 개발 환경 구축하기

 

 

https://www.st.com/en/development-tools/stm32cubeide.html

에서 윈도우 버전에서 다운로드 받았다.

 

 

워크스페이스의 디렉토리를 설정한다. 

 

 

 

파일을 열면 자동으로 소프트웨어 패키지가 다운로드 된다.

그리고 다음과 같은 화면이 나오게 된다.


2. GPIO 제어하기

이제 보드 상에 이미 부착되어 있는 LED를 제어해볼 것dlek.

1. 어느 LED에 접근 가능한지 manual을 찾아 확인해보자

 

PB7에 연결해주면 된다.

이렇게 하는 게 맞겠지 ㅎㅎ

 

 

 

OK

 

NO

 

 


3. 외부 인터럽트 사용하기

 

보드 상에 이미 부착되어 있는 스위치와 LED를 제어해볼 거싱다.

1. 메뉴얼을 봐 보자.

BUTTON 핀을 찾아보자.

GPIO PC13에 연결해보자

 

Pin Out  View에서 PC13을 GPIO_EXTI13으로 설정해준다.

GPIO 탭을 누르면 PC13 핀을 설정할 수 있는 창이 나온다.

   외부 인터럽트이기 때문에 Edge 설정이 필요하다.

   pull-up/down 설정이 가능하다.

   튜토리얼에서는 상승엣지, pull-up/downno로 설정한다.

   Label은 지정해줄 것을 권장한다.

 

 

 

5. NVIC 탭 - Interupt Enable로 설정

6. 모든 설정이 완료되었다면

 Project – Generate Code 클릭

 

7. MX_GPIO_Init 함수에 내용이 추가된 것을 확인할 수 있다.

 

8. 스위치를 누를 때마다 LED 토글 시키기

8-1. 외부 인터럽트 콜백함수를 찾는다.

 

Stm32g4xx_it.c 파일을 열어보면 최하단에 다음 그림과 같은 함수가 생성되어 있다.   

*콜백함수 : 특정 이벤트에 호출되는 함수를 말함

 

 

8-2. Ctrl을 누른 채로 HAL_GPIO_EXTI_IRQHandler함수를 클릭한다.  

 

 

8-3. 함수가 정의된 파일로 이동됐다면, 다시 Ctrl을 누른 채로 HAL_GPIO_EXTI_IRQHandler함수를 클릭한다.  

 

 

 

8-4. ‘__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)’ 함수에 도착했다면 함수 전체를 복사 ( Ctrl + C ) 할 것!

 

 

8-5. main.c 파일로 돌아와서 다음과 같이 붙여넣기(ctrl+v) 진행

이 때 /* USER COD BEGIN 4*/ 밑에 붙여 넣을 것! 그래야 후에도 사라지지 않음

 

8-6. ‘__weak’ 와 함수 내의 내용들을 모두 지워준다.

8-7. 다음과 같이 함수 내용을 채워 넣는다. 그리고 이전 센션에서 작성한 while 문 내의 내용은 모두 지워준다.

8-8. microUSB2USB 선을 이용하여 PC와 보드를 연결한 후, Run.


4. 타이머 인터럽트 사용하기

타이머 인터럽트는 보장된 제어주기를 구현하기 위해 반드시 필요한 기능이다.

1..ioc 파일로 돌아가서 ‘Clock Configuration’ 탭으로 들어간다.
2.HCLK 160MHz로 설정해준다. 이에 따라 APB1APB2160MHz로 변경된다.
3.만일 APB1 또는 APB2의 클럭을 변경하고 싶다면 prescaler로 낮출 수 잇다

 

 

 

4. TIM1을 사용하기로 한다.

G474RE 칩의 TIM1은 하나의 타이머 설정으로 두개의 핀에 PWM을 생성할 수 있으며, 두 신호는 서로 뒤집혀있다. 이는 모터제어 시 아주 유용하며, 튜토리얼에서는 이 기능을 사용하기로 한다.

5. 타이머 인터럽트와 마찬가지로 Internal clock으로 설정하고 PWM Generation CH1 CH1N으로 설정한다. Auto-reload preload enable

기존 설정

 

변경 후 설정

 

6. 설정이 완료되면 자동으로 핀 배치가 완료된다.

7. Counter Period2048-1 지정한다. (임의로 변경해도 상관없다.)

 
 

 


stm32g474re’ 파일에 칩 구조가 나와있다.

 

 

5. APB1 APB2는 각각 다른 타이머 채널을 담당하는 것을 알 수 있다.

튜토리얼에서는 타이머2를 사용할 것이기에 APB1 신경쓴다.

다시 Pinout & Configuration 탭으로 돌아와서 좌측의 Timer 탭을 클릭한다. TIM2 클릭.

 

 

 

6. 다음과 같이 파라미터 세팅을 한다.

Clock Source의 경우 Internal Clock으로 세팅하면 ‘APB1’ 클럭을 사용한다는 것이다.

Channel 1Output Compare No Output으로 세팅하면 GPIO 또는 PWM으로 출력하지 않고 내부에서만 사용하겠다는 것이다.

 

Prescaler의 경우 ‘APB1’ 클럭이 몇 번 진동해야 1회 카운트를 진행할지 설정해주는 것이다. 0으로 할 경우 1번의 진동을 1회로 간주하겠다는 뜻이며 그림과 같이 160-1로 설정한 경우 160번의 진동을 1회 카운트로 간주하겠다는 것이다. 따라서 1회 카운트는 160/160M (sec)가 되겠다.

Counter Period는 몇 번의 카운트가 진행되어야 인터럽트를 발생시킬지 지정하는 파라미터이다. 1000-1로 설정한 경우 1ms마다 타이머 인터럽트가 발생한다.

Auto-reload preload는 지정된 카운트가 지나면 자동으로 0부터 카운트하게 해주는 설정이다. Enable 한다.

원래 설정 Prescaler는 0 이었다.

 

7. 인터럽트를 사용할 것이기에 NVIC Setting으로 이동하여 인터럽트를 활성화 해준다.

 

 

8. 모든 설정이 완료되었다면

 Project – Generate Code 클릭

 

9. main.c 파일에 MX_TIM2_Init 함수가 추가된 것을 확인할 수 있다.

10. Delay 함수를 사용하지 않고 timer InteruptLED 1초마다 토글하기

10-1. 인터럽트를 사용하기 위해 stm32g4xx_hal_tim.c 파일로 이동하여 다음 함수를 찾는다.

10-2. ‘__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)’ 함수 전체를 복사 ( Ctrl + C ) 할 것!

 

Yes를 눌러준다.
일단 default 값으로 apply 해준다.

함수를 찾는다.

 

10-3. main.c 파일로 돌아와서 다음과 같이 붙여넣기(ctrl+v) 진행

이 때 /* USER COD BEGIN 4*/ 밑에 붙여 넣을 것! 그래야 후에도 사라지지 않음

10-4. ‘__weak’ 와 함수 내의 내용들을 모두 지워준다.

 

10-5. 다음과 같이 함수 내용을 채워 넣는다. 그리고 이전 센션에서 작성한 외부 인터럽트의 콜백 함수 내용은 모두 지워준다.

 

1초마다 토글된다!

 

10-6. main.c 파일의 main 함수 위에 다음과 같이 변수 하나를 선언해준다. 반드시 /* USER CODE BEGIN 0 */ 아래에 작성할 것.

10-7. 이전 섹션에서 다루었던 외부 인터럽트 콜백 함수에 다음과 같이 내용을 채워 넣는다.

 

10-8. microUSB2USB 선을 이용하여 PC와 보드를 연결한 후, Run.

 

스위치를 누르면 타이머 시작/멈춤 

 

 

 

 


5. PWM 생성하기

모터 구동을 위해서는 PWM 신호 생성이 필수이다.

1..ioc 파일로 돌아가서 ‘Clock Configuration’ 탭으로 들어간다.
2.HCLK 160MHz로 설정해준다. 이에 따라 APB1APB2160MHz로 변경된다.

 

3.만일 APB1 또는 APB2의 클럭을 변경하고 싶다면 prescaler로 낮출 수 잇다
 

으잉?? 일단 NO

이전과 같은 설정.

9. 스위치를 누를 때마다 Duty rate 증가시키기

9-1. Duty rate을 결정해줄 변수 선언

9-2. main 함수에  ‘HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);’ 구문 추가

9-3. 외부인터럽트 콜백함수를 다음과 같이 작성한다.

스위치를 누를 때마다 Duty rate이 증가/감소함.

2048을 최대 카운트로 했기 때문에 Duty rate은 다음과 같이 결정됨

CCR/2048 *100 (%)

 

TIM1 PWM Generation CH1으로 설정하기

 

 

 

 

9-4. microUSB2USB 선을 이용하여 PC와 보드를 연결한 후, Run.

 오실로스코프에 선 연결하기

file:///C:/Users/rndpq/Downloads/um1974-stm32-nucleo144-boards-mb1137-stmicroelectronics.pdf 35p 참조

 

 


6. CANFD  통신하기

 

 

통신하자

1..ioc 파일로 돌아가서 ‘Clock Configuration’ 탭으로 들어간다.
2.APB1 Prescaler2로 해준다. CANFD 최대 클럭은 80MHz.


3. 다시 Pinout & Configuration 으로 돌아가서 FDCAN1 클릭 – MODEFD로 설정 핀이 자동으로 배치됨

하지만 CANFD가 없다 ㅠㅜㅠ

지원하지 않는 모델이라고 한다.

 

 

4. 파라미터들을 세팅하기 위해서는 CANFD 통신에서 요구되는 사항들을 공부해야하나,튜토리얼에서는 생략하고 다음장으로 넘어간다.

 

 

6. 반드시 샘플포인트는 75% 인 것으로 진행해야 함!

 

 

CANFD 통신을 위해서는 CANFD Tranciever 가 필요함. STM32 설정은 여기서 마침.

7. 마무리