이전 PWM 포스팅에서는 PWM 개념과 2837xD MCU의 PWM Sub-module에 대해서 알아보았습니다. 이번 포스팅에서는 실제로 PWM 신호를 생성하고 측정해보는 테스트 과정을 다루겠습니다.
PWM 개념에 대해 다시 한번 정리하고 시작하도록 하겠습니다.
PWM(Pulse Width Modulation)
펄스 폭 변조는 디지털 소스를 사용하여 아날로그 신호를 생성하는 데 사용되는 기술입니다. 펄스열의 펄스 폭을 변경하여 장치에 공급되는 전력을 제어합니다. 부하에 공급되는 전압(및 전류)의 평균값은 공급과 부하 사이의 스위치를 빠른 속도로 켜고 끄는 방식으로 제어됩니다. 스위치가 꺼진 상태에 비해 켜져 있는 시간이 길어질수록 부하에 공급되는 총 전력은 더 높아집니다.
*ePWM : 향상된 펄스 폭 변조는 일반적으로 PWM의 고급 버전을 나타냅니다. 여기에는 더 나은 제어 및 효율성을 위한 추가 기능이 포함되어 있습니다. 여기에는 향상된 분해능, 더 높은 정확도, 보다 유연한 제어 옵션(예: 위상 변이 기능) 및 특정 애플리케이션에 특정한 추가 기능(예: 모터 제어)이 포함될 수 있습니다.
아래 사진들은 PWM 신호 생성에 사용된 코드입니다.
InitEPwmxModule() 함수에 작성된 내용 중 언급하고 넘어갈 내용이 있습니다.
TBCLK = 100MHz ↔ Period : 10ns
PWM_CARRIER = 100kHz ↔ Period : 10us (1K 개의 Timer Ticks)
Ticks : Pwm 주기에 해당하는 클록 사이클 수
- Pwm 한 사이클을 완료하는데 필요한 타이머 틱 수 (N)
- DSP에서 사용되는 개별 시간 측정 단위(ex. 샘플링 속도, 클럭 사이클, 타임 스탬프…)
N / 5 = 200
- 200 * 10ns = 2us
- 360 / 5 = 72
1. 코드 작성 중 유의할 점
- 정적 값과 동적 값: 작업 중인 값이 static하고 프로그램 실행 전체에서 변경할 필요가 없는 경우 #define 상수를 사용하는 것으로 충분함.
#define은 컴파일 타임에 해당 값으로 대체되는 symbolic constants를 만드는 것. - 메모리 및 유형 고려 사항: #define 상수는 컴파일 타임에 대체되므로 변수처럼 메모리의 저장 공간을 차지하지 않는다. 이는 메모리가 제한된 환경에서 고려 가능하다. 그러나 type 안전성이 부족하고 컴파일러가 symbolic 정보를 유지하지 않기 때문에 디버깅이 더 어려울 수 있다.
- 유연성 및 확장성: float32(실제 변수)를 사용하면 유연성이 더욱 향상된다. 프로그램 실행 중에 매개변수 값을 조정하거나 계산해야 할 가능성이 있는 경우 변수를 사용하는 것이 더 나은 선택이다. 또한 코드의 확장성을 높이고 향후 변경 사항에 적응할 수 있다.
- 복잡성과 가독성: #define 상수를 사용하면 값이 실제 상수(예: 수학 상수, 고정 구성 값)일 때 코드의 특정 측면을 더 간단하고 더 읽기 쉽게 만들 수 있다. 그러나 '#define'을 과도하게 사용하면 코드 디버깅 및 유지 관리가 어려워질 수 있다. 특히 이러한 상수가 여러 곳에서 사용되고 해당 값이 설명이 필요하지 않은 경우 더욱 그렇다.
- #define 상수와 변수 중에서 선택하는 것은 런타임에 이러한 값을 변경하는 기능이 필요한지 여부와 메모리, 유형 안전성, 복잡성 및 유지 관리 가능성을 고려한 사항에 따라 달라진다. 변경되지 않는 순수 상수 값의 경우 '#define'이 적합하다. 값이 변경될 수 있거나 type 안전성과 유연성이 중요한 경우 float32(실제 변수)가 더 나은 선택이다.
2. PWM 신호 생성 Test1. Single-Channel 100kHz, Duty-Ratio 0.5(50%)
- Vpp = 3.3
- Freq = 100kHz
- Duty_Ratio = 50%
- Vmax ~= 3.8V
- Ay = 3.808V
3. PWM 신호 생성 Test2. 2-ch & 4-ch, Complementary Signal
4. PWM 신호 생성 Test3. 4-ch, Complementary Signal + Phase Shift + Dead Band
- PWM Frequency : 100kHz
- Duty Ratio : 50%
- Phase Shift : 2us(72°)
- TBCLK = 100MHz ↔ Period : 10ns
- PWM_CARRIER = 100kHz ↔ Period : 10us
- 1K 개의 Timer Ticks(N)
N / 5 = 1K / 5 = 200 - 200 * 10ns = 2us
- 360 / 5 = 72°
- PWM Frequency : 50kHz
- Duty Ratio : 50%
- Dead Band : 5%
- Phase Shift : 4us
추가로 Dead-Band Value(Dead Time)에 대해서 설명하고 오늘 포스팅을 마무리하겠습니다.
Dead Time: 보완 채널(A, B)의 전환 사이에 삽입되는 짧은 지연.
- 스위칭 장치 간 충돌 방지
- 동시에 High가 되는 것을 방지
- 특정 어플리케이션에서 단락을 방지하는 데 사용
2837xD MCU에서는 (DBRED | DBRED) * (TBCLK Period) 값이 Dead-Band Value로 입력됩니다.
아래는 DB값을 정하는 일련의 과정입니다.
이때 DBxED에서 R은 Rising, F는 Falling 입니다.
- PWM Frequency = 50kHz ↔ Period = 20us
- TBCLK Frequency = 100MHz ↔ Period = 10ns
- 20us, 5% = 1us
- (DBRED | DBFED) * (TBCLK Period) = 1us
- (DBRED | DBFED) * (10ns) = 1us
- DBRED, DBFED = 100
이것으로 PWM 신호 생성 테스트 포스팅을 마치겠습니다.
읽어주셔서 감사합니다.