상세 컨텐츠

본문 제목

[TMS320F28388D] SYS/BIOS 7부 - CLA 생성하기 with Hwi & Task

TMS320F28388D 공부

by Zin9 2023. 9. 2. 00:58

본문

728x90
 

[TMS320F28388D] SYS/BIOS 6부 - CLA 생성하기 + 되새김

[TMS320F28388D] SYS/BIOS 5부 - Hwi 생성하기 [TMS320F28388D] SYS/BIOS 4부 - Timer 생성하기 [TMS320F28388D] SYS/BIOS 3부 - Swi 생성하기 [TMS320F28388D] SYS/BIOS 2부 - Task 생성하기 [TMS320F28388D] SYS/BIOS 1부 - 인트로, 프로젝트

zin9.tistory.com

 

자 이제 실습의 정점에 도달했다.

여기까지 하면 왠만한 제어 시스템을 만드는 데 큰 어려움이 없을 것이다.

 

이번 시간에서 우리가 서보제어시스템을 만든다고 가정해보자.

1. 전류루프를 32kHz로 동작하도록 만든다.

    → 정확하게 32kHz로 제어루프를 구동하기 위하여 Hwi를 사용한다.

    → 또한, Hwi를 통해 PWM을 이용할 것이다.

2. 전류루프에서 복잡한 연산이 필요하여 CLA를 이용한다.

3. Swi, Hwi와 CLA 동작을 확인하기 위해 LED 토글를 이용한다.

    (Swi는 보너스)

 

자, 이제 코드를 작성해보자.

 

cmd 파일은 이전 포스팅을 참고한다(맨위에 링크로 들어가보자).

 

코드 소개에 앞서, 위에서 작성한 3가지를 상세하게 펼쳐보겠다

 

1. 전류루프를 32kHz로 동작하도록 만든다.

    → 정확하게 32kHz로 제어루프를 구동하기 위하여 Hwi를 사용한다.

    → 또한, Hwi를 통해 PWM을 이용할 것이다.

    코드 작성(EPwm1Regs와 ClkCfgRegs 레지스터) + cfg 설정으로 32kHz를 만들어준다.

2. 전류루프에서 복잡한 연산이 필요하여 CLA를 이용한다.

     CLA가 실행될 때마다 카운트 변수가 1씩 증가하도록 만든다.

     카운트 변수는 main_CPU1.c 에서 공유메모리에 할당한다.

3. Swi, Hwi와 CLA 동작을 확인하기 위해 LED 토글를 이용한다.

     Hwi에서 CLA가 실행될 때마다 카운트가 증가하며, 일정 카운트에 도달하면 LED1이 토글한다.

     Swi가 실행될 때마다 카운트가 증가하며, 일정 카운트에 도달하면 LED2가 토글한다.

 

※ 이 떄, 인터럽트에서 GPIO제어(LED제어)를 하게 되면 LED제어가 정상적으로 되지 않는 현상이 있다.

    따라서, Task에서 변수를 전달받아서 LED 제어를 실행한다.

 

이제 코드를 살펴보자.

 

Swi는 1ms마다 실행되도록 설정되어 있으며, 500ms마다 LED2가 토글하도록 변수를 제어한다.

Hwi는 31.25us마다 실행되도록 설정되어 있으며, Hwi가 실행될 때마다 CLA의 Task1을 실행한다.

CLA의 Task1은 100ms마다 LED1을 토글하도록 변수를 제어한다.

<그림 1. Swi와 Hwi 인터럽트 함수>
<그림 2. CLA의 Task1 함수>

 

 

Hwi가 32kHz로 동작하도록 하는 방법은??

 

1. cfg 파일에서 Hwi를 설정한다.

(인터럽트 번호 48은 지난 번에 소개했기에 넘어간다)

<그림 3. cfg 파일에서 Hwi 설정>

 

2. EPWM 코드를 작성한다.

 

2-1. EPWM 주기 설정

우리는 시스템클럭을 200MHz로 설정했었다.

32kHz로 동작하기에 업카운트로만 한다면 PWM 카운트는 꼭지점에서 6250일 것이다.

하지만, 우리는 업다운 카운트로 할 것이기에 2로 나눈 값인 3125를 TBPRD에 할당해야 한다.

 

2-2. 카운트 방식 설정

그림 4의 320줄을 보자.

우리는 업-다운 카운트를 사용한다.

 

2-3. Hwi 인터럽트 활성화

그림 4의 333~335줄을 살펴보자.

 

이렇게 그림 4처럼 설정하면 EPWM 기능을 동작할 것이다.

EPWM으로 LED 제어하는 것은 나중에 하도록 한다.

 

<그림 4. EPWM1 설정>

 

마지막으로 TaskA와 TaskB에서 LED를 제어한다.

LED 제어 변수를 받아서 LED를 제어한다.

<그림 5. Task설정>

 

 

디버깅 모드를 실행하면 그림 5와 같다.

그런데 그림 5를 보면, CLA의 Task1와 Hwi(EPwm_ISR함수)의 실행 횟수에 차이가 발생한다.

즉, 실행률은 47.3%이다.

 

<그림 5. Swi, Hwi, CLA 실행 1>

 

그래서 EPWM의 주기를 16kHz로 바꿔보았다.

실행률은 91.9%로 올랐다.

<그림 6. Swi, Hwi, CLA 실행 2>

 

마지막으로 EPWM의 주기를 8kHz로 바꿔보았다.

이번엔 오히려 EPWM보다 CLA의 실행 횟수가 많아졌다.

이게 무슨 일인가?

<그림 7. Swi, Hwi, CLA 실행 3>

 

EPWM과 CLA 중 어느 것이 비정상적인 횟수로 실행되었을까?

결론부터 말하면, 그림 5~7에서 CLA의 실행횟수가 옳지 않다.

EPWM은 Timer, Task와 비교하면 정상적으로 실행됨을 알 수 있다.

 

이번 시간에는 이 현상을 해결하지 않고 다음에 알아보도록 한다.

 

cmd파일과 cla 파일은 Step7의 것으로 사용한다.

 

GitHub - Zin9s/TMS320F28388D

Contribute to Zin9s/TMS320F28388D development by creating an account on GitHub.

github.com

 

728x90

관련글 더보기