우리는 여기에서 PWM의 기본적인 개념과 블랙핀에서의 PWM대해 다루어 보고자 한다.
PWM은 프로세서의 디지털 출력으로 아날로그 회로를 제어하는 강력한 기법이다. PWM은 계측과 통신에서 전력제어와 전력변환에 이르기까지 광범위한 영역에서 사용되고 있다.
PWM은 펄스폭 변조이다. 스위칭 주파수, 튜티사이클등의 주요변수들이 있게 된다.
PWM을 이용한 제어의 원리에 간단히 설명하면
PWM은 스위치의 ON/OFF시간(Duty cycle)을 이용하여 대상을 제어한다.
예를 들면 9V 최대출력의 램프가 있다고 가정하면 50%듀티 사이클로 대상을 제어 할때는 4.5V의 효과를 나타낼것이다. 이때의 스위칭주파수는 램프의 ON/OFF에 대한 반응시간 보다 빨라야 할것이다. 만약 제어 대상이 모터이라면 해당 RPM(속도)가 스위칭주파수 설정에 중요한 변수가 될것이다. 제어대상의 상태를 체크하는 센서가 부착되면 우리는 폐루프제어를 통해 정확한 Duty Cycle를 찾는 부분이 필요할것이다.
따라서 우리의 관심은 대상의 상태변화감지와 이에 대한 스위칭 주파수 설정, 해당 Duty Cycle 계산 등이 될것이다.
보통의 MCU/DSP에서 PWM블록이 있다면 다음과 같은 조건을 만족해야 한다.
1. 사각형파 변조를 제공하는 칩에 내장된 타이머와 카운터의 길이를 설정
2. PWM레지스터의 ON-TIME을 설정
3. 범용 목적의 I/O핀인 PWM OUTPUT의 방향을 설정
4. 타이머시작
5. PWM컨트롤러를 가능으로설정
Blackfin에서의 PWM
PWM은 AC유도모터(ac induction motor)(ACIM), 영구자석동기모터(permanent magnet synchronous motor(PMSM)), BLDC,전기정류모터(electronically commutated motors(ECMs))등을 제어하는 3상 PWM패턴을 생성한다.
또한 PWM_CTRL의 PWM_SRMODE bit를 세팅함으로 switched reluctance motors (SRMs)을 위한 특정모드도 지원한다.
그림 1
블랙핀은 PWM 생성을 위해 6개의 UNIT으로 나누어진다.1. PWM SHUTDOWN AND INTERRUPT CONTROL UNIT
- /PWM_TRIP pin과 PWM_CTRL register에 의해서 다양한 PWM shutdown modes를
제공한다.
- Three-Phase PWM Timing Unit을 위한 정확한 reset signal과 Interrupt Control Unit
을 위한 interrupt signals를 생성한다.
2. PWM SYNC PULSE CONTROL UNIT
- 내부 PWM 동기화 pulse를 생성하고, 외부 PWM_SYNC pulse를 이용할 것인지를 제어
한다.
3. THREE-PHASE PWM TIMMING UNIT
- 3-pairs Complemented, center-based PWM signals와 PWM_SYNC signal을 생성한
다.
4. DEAD TIME CONTROL UNIT
5. OUTPUT CONTROL UNIT
- 6개의 PWM output signals 각각에 대해서 enabling/disabling을 할 수 있다.
6. GATE DRIVE UNIT
- PWM_CTRL register의 PWM_POLARITY bit의 state에 근거하여 정확한 극성을 가지는
PWM signals의 출력을 제공한다. 또한, 고주파 chopping waveform를 생성한다.
PWM Controller는 SCLK로 구동된다.
생성된 PWM patterns의 switching 주파수와 dead time은 PWM_TM과 PWM_DT
registers에 의해서 programming된다. 또한, 3개의 duty-cycle control registers
(PWM_CHA, PWM_CHB, 그리고, PWM_CHC)는 3-pairs PWM signals의 duty cycles를
직접 제어한다.
6개의 PWM output signals 각각은 PWM_SEG register의 독립적인 output enable bits에
의해서 enabled 또는 disabled될 수 있다.
16-bit read/write PWM period register(PWM_TM)는 PWM switching frequency를 제
어한다.
PWM_TM register에 작성되는 값은 실질적으로 PWM period의 절반에 대한
fundamental time increment(tsclk) clock 증가량이다.
예를 들어서, 원하는 PWM switching frequency(f PWM )의 함수로서 요구되는 PWM_TM의 값은 다음의 수식에 의해서 얻어진다.
PWMTM = fSCLK / (2 * fPWM) (수식 3-1)
그러므로, PWM switching period(Ts)는 다음 수식으로서 작성될 수 있다.
Ts = 2 *PWMTM * t SCLK (수식 3-2)
단, Ts = 1/ fPWM 인데 주의하자
예를 들어서 fSCLK = 100Mhz이고 원하는 fPWM = 10Khz 인경우 PWM_TM register에서loading될 정확한 값은 수식 3-1을 이용하여 계산하면 5000이 된다. 16진수로 1388이다.
16-bit PWM_TM register에 작성될 수 있는 가장 큰 값은 0xFFFF이고, fSCLK = 100Mhz 일 때, 최소 PWM switching frequency는 수식 3-1을 이용하여 계산하면 762[Hz]가 된다. 이는 PWM이 발생할수 있는 최소 스위칭 주파수이다.
예를 들어 PWM_TM register값이 4166이면 fPWM 은 120002가 되어 12Khz가 된다.
PWM_TMregister에 0,1은 세팅할수 없다. PWM outputs 또는 PWM sync가 enabling되어 있을 때는 지정하면 안 된다
다음으로 10-bit read/write PWM_DT register는 PWM output signals 3상에 삽입되는 dead time
을 제어한다. Dead time (Td )는 다음의 수식에 의해서 PWM_DT register안에 값을 지정
한다.
을 제어한다. Dead time (Td )는 다음의 수식에 의해서 PWM_DT register안에 값을 지정
한다.
Td = 2 *PWMDT * t SCLK (수식 3-3)
결국, dead time은 2t SCLK 의 단위로 programming 될 수 있다.
예를 들면, fSCLK = 100Mhz인 경우에는 20[ns]의 단위로 programming 될 수 있다.
PWM_DT register는 10-bit이므로 최대값은 0x3FF가 된다. 이를 수식 3-3으로 계산하면 20.5us가 나오게 된다. 식에 의하면 PWM_DT register에 0을 대입하면 Dead time이 0이 됨으로 시스템에 Short의 빌미가 될수 있기에 주의해야 한다. 물론 이를 원천 차단하는 회로가 포함되어 소프트웨어의 실수를 지원해 준다.
예를 들어 PWM_DT 가 0x0096이면 Td 는 수식 3-3의해 3[us]가 된다
왼쪽의 그림에서 노란색과 초록색의 falling과 rising의 간격이 dead time이다. PWM_CTRL register에서 PWM output polarity를 active high로 바꾸었다. 그리고,
3[us]의 dead time을 적용한 경우이다.
만일, PWM output polarity를 active low로 하면 극성이 반대가 되어서 나타난다.
3[us]의 dead time을 적용한 경우이다.
만일, PWM output polarity를 active low로 하면 극성이 반대가 되어서 나타난다.
그림 2
그림 3
그림 4
Typical PWM Outputs of Three-Phase Timing Unitin Single-Update Mode (Active-Low Waveforms)
일단, PWM_AH에 대한 on time과 off time을 SVPWM에 의해서 계산한다. 그
리고, 이 on time과 off time에 도달하기 위한 counter 값을 찾아서 PWM_CHA에 setting
해 준다. 그리고 나서, dead time을 첨가해 주면 원하는 PWM_AH pulse를 DSP PWM
port에서 발생하게 된다.
PWM_AL은 그것에 대한 not gate로 생성되고, PWM_SYNC
signal에 맞추어서 120도 phase delay된 PWM_BH, 그리고 또 다시 120도 phase delay된
PWM_CH pulse를 생성하게 된다.
위의 그림에서 보여준 것과 같이 예를 들어서, 외부 XTAL에서 30[MHz]를 공급한 경우
에 내부 PLL을 거쳐서 150[MHz]를 만든다. 그리고, 이것을 절반한 75[MHz]로 counter를
돌리면, 현재 10[KHz]의 switching frequency를 가지므로 하나의 switching period에 총 7500개의 pulse를 생성하게 된다.
그러나, BF506F의 경우, PWM_STAT register의 PWM_PHASE bit default 값은 clear이
고, 이때 오른쪽 그림과 같이 counter의 증가 및 감소 방향이 바뀌게 되는데, 주의하자. 즉,
3상 PWM Timing Unit은 +PWMTM/2로부터 -PWMTM/2까지 2의 보수 counting을 이용
하여 감소하고, 그리고 나서, count 방향이 바뀌어서 -PWMTM/2로부터 PWMTM/2 값으
로 증가하게 된다.
PWM_TM은 double-buffered이다. 즉, PWM switching period의 절반에서의 변화는 단지,
다음 절반 주기 기간안에 효과를 줄 것이다.
또한, 12channel 2MSPS의 ADC를 가지는 BF506F의 경우, [그림 5]에서 보는 것과 같
이 각각의 channel 마다 2MSPS/12 = 166.7kHz, 즉, 6[us]의 time 구간만 있으면, sample
& hold, ADC, buffering까지 끝나고, 이어서 SVPWM 및 여타 관련 code를 동작시키고,
마지막으로 [그림 4]와 같이 PWM pulses를 생성하는 데 걸리는 총 시간은 결코,
10[kHz]보다 크지 않다.
그림 5 ADC & PWM 생성 시간과 Switching 주파수와의 관계.
즉, [그림 5]에서 보듯이 매 PWMSYNC_out이 10[kHz]마다 interrupt를 발생시키고, 그
리고, 위와 같은 일련의 과정을 수행하여 PWM pulses를 생성하는 경우에 interrupt 구간이
PWM pulses를 생성하는 일련의 과정에 비해서 상당히 짧은 시간을 요구하므로 동작하는
데 아무런 문제가 될 것이 없다.
만일, [그림 4]에서 counter의 값을 7500개가 아닌, 7500*2=15000개로 setting하였다
면, switching 주파수는 10[kHz]가 아니라 계산에 의해서 5[kHz]가 되는데 주의하기 바란
다.
또한, 일반적으로 counter의 값은 음의 정수를 사용하지 않으며, 대부분의 IGBT/FET gate
driver 특성 때문에 low active switching을 사용하지만, 이것은 DSP PWM port와 관련
된 register에서 그 극성을 바꿀 수 있다.
3개의 16-bit read/write duty cycle registers(PWM_CHA, PWM_CHB, 그리고
PWM_CHC)는 PWM_AH/AL, PWM_BH/BL, PWM_CH/CL pins에 대한 6개의 PWM
output signals의 duty cycles를 제어한다.
duty cycle registers는 fundamental time unit(t SCLK )에 대한 2의 보수 정수 개수로
programming되고, 1/2 PWM period에 대해서 high-side PWM signal에 대한 원하는
on-time을 정의한다.
PWM_CHC)는 PWM_AH/AL, PWM_BH/BL, PWM_CH/CL pins에 대한 6개의 PWM
output signals의 duty cycles를 제어한다.
duty cycle registers는 fundamental time unit(t SCLK )에 대한 2의 보수 정수 개수로
programming되고, 1/2 PWM period에 대해서 high-side PWM signal에 대한 원하는
on-time을 정의한다.
각각의 duty cycle register 범위는 -PWMTM/2 - PWMDT ~ PWMTM/2 + PWMDT이
다. 정의에 의해서 결국, “0”의 값은 50% PWM duty cycle을 표현한다
PWM_CTRL안에 active low polarity를 programming 함에 의해서 PWM_DT register안
에 있는 programming 된 dead time 값을 적용하여 조정된다. 즉, programming 된 duty
cycles는 PWM_AH와 PWM_AL 양쪽의 PWM signals의 switching 순간들을 PWM_CHA
register에 의해서 조정된 순간으로부터 dead time을 합쳐서 PWM signals pair옮김으로
인해서 조정된다. 양쪽의 switching edges는 대칭 output patterns를 유지하기 위해서 동
일한 PWMDT × t SCLK 만큼 옮겨진다.
다. 정의에 의해서 결국, “0”의 값은 50% PWM duty cycle을 표현한다
PWM_CTRL안에 active low polarity를 programming 함에 의해서 PWM_DT register안
에 있는 programming 된 dead time 값을 적용하여 조정된다. 즉, programming 된 duty
cycles는 PWM_AH와 PWM_AL 양쪽의 PWM signals의 switching 순간들을 PWM_CHA
register에 의해서 조정된 순간으로부터 dead time을 합쳐서 PWM signals pair옮김으로
인해서 조정된다. 양쪽의 switching edges는 대칭 output patterns를 유지하기 위해서 동
일한 PWMDT × t SCLK 만큼 옮겨진다.
[그림 4]에서 PWM_SYNC pulse의 rising edge는 switching period의 시작을 나타내고,
그리고, PWM_SYNC의 폭은 PWM_SYNCWT register에 의해서 조정된다. 그리고,
PWM_STAT register의 PWM_PHASE bit는 동작이 PWM period의 첫 번째 절반 또는 두
번째 절반 cycle 중에서 어디에 있는지를 가리킨다.
[그림 4]에서 설명한 3상 PWM Timing Unit에 의해서 생성된 full PWM period에 대한
PWM signals의 주기적인 pulse의 active low 구간은 다음과 같이 계산될 수 있다.
TAH = (PWMTM+ 2*(PWMCHA-PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]
TAL = (PWMTM- 2*(PWMCHA+PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]
그러므로, 대응하는 duty cycles는 다음수식과 같다.
dAH = TAH/TS = 1/2 + (PWMCHA-PWMDT)/PWMTM
dAL = TAL/TS = 1/2 - (PWMCHA+PWMDT)/PWMTM
단, [그림 4]에서 보면 알 수 있듯이 switching period TS = 2 * PWMTM인데, 주의하
자.
3상 PWM Timing Unit이 PWM output pins에 가변 duty-cycle 값들로 PWM signals를
생성하는 경우, 변조의 끝에서 0% modulation(full off mode)과 100% modulation(full on
mode)이 발생할 수 있다.
1) Full On Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “on" 상태에 있을 때를 의미
한다. 여기서 ”on" 상태는 PWM_CTRL register의 PWM_POLARITY bit에 의해서 지정
된 active low 또는 active high에 대한 것임.
2) Full Off Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “off" 상태에 있을 때를 의미
한다.
3) Normal Operation :
PWM signals의 임의의 pair를 위한 PWM이 연속적인 PWM_SYNC 사이에 desired
output duty cycle이 0% 또는 100%와 다른 값을 가질 때를 의미한다.
[그림 4]로부터 유추 할 수 있듯이 PWM controller는 16-bit resolution을 가진다. 그
러나, 정확성은 PWM period에 의존한다.
PWM_CHA, PWM_CHB 그리고 PWM_CHC의 동일한 값들은 PWM 주기의 양쪽 절반안에
서 주기적으로 정의한다. 결국, PWM 생성과정에서 유효 정밀도는 2 × tSCLK 즉,fSCLK = 100MHz의 경우, 20[ns]가 된다. 그러므로, duty cycle registers 중에서 어느 하나를 “1”만큼 증가시키면, 각각의 절반 주기 안에서 tSCLK만큼 관련된 PWM signals를
주기적으로 바꾸어 준다.
[표 1]은 최소 얻을 수 있는 PWM 주파수와 bit resolution을 비교한 table이다.
단, SCLK=100[MHz]이다.
PWM 주파수는 다음과 같이 계산된 것이다. 즉,
8bits는 [그림 4]의 오른쪽 그림 부분에 나와 있듯이 PWM 주기의 절반에 대한
counting bits이므로 256개의 counting number를 가질 수 있다. 그러나, 나머지 절반도 대
칭적으로 동작하므로 결국, 각각의 counting number는 SCLK 100[MHz]에서 20[ns]를 필
요하게 되므로, 총 256개의 counting을 수행하는 데 필요한 시간은 256☓20[ns]=5.12[us]
가 된다. 이것이 하나의 PWM signal을 만들 때 필요한 시간이 되므로, 주파수는
1/5.12[us]=195.3125[kHz]가 된다.
일반적으로 10[kHz]를 switching 주파수로 사용하므로 12bit resolution을 가지는 counter
를 사용하여 PWM을 생성하면 된다.
PWM sync는 PWM_TM과 PWMSYNCWT register 값들의 함수로서 내부적으로 생성될
수 있거나 외부에서 입력으로 들어올 수 있다.
이 PWM SYNC pulse의 폭은 10bit read/write PWM_SYNCWT register에 의해서
programming 될 수 있다. PWM SYNC pulse의 폭은 다음과 같이 계산된다
그리고, PWM_SYNC의 폭은 PWM_SYNCWT register에 의해서 조정된다. 그리고,
PWM_STAT register의 PWM_PHASE bit는 동작이 PWM period의 첫 번째 절반 또는 두
번째 절반 cycle 중에서 어디에 있는지를 가리킨다.
[그림 4]에서 설명한 3상 PWM Timing Unit에 의해서 생성된 full PWM period에 대한
PWM signals의 주기적인 pulse의 active low 구간은 다음과 같이 계산될 수 있다.
TAH = (PWMTM+ 2*(PWMCHA-PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]
TAL = (PWMTM- 2*(PWMCHA+PWMDT)) * tSCLK
Rangeof TAH = [0,2*PWMTM*tSCLK]
그러므로, 대응하는 duty cycles는 다음수식과 같다.
dAH = TAH/TS = 1/2 + (PWMCHA-PWMDT)/PWMTM
dAL = TAL/TS = 1/2 - (PWMCHA+PWMDT)/PWMTM
단, [그림 4]에서 보면 알 수 있듯이 switching period TS = 2 * PWMTM인데, 주의하
자.
3상 PWM Timing Unit이 PWM output pins에 가변 duty-cycle 값들로 PWM signals를
생성하는 경우, 변조의 끝에서 0% modulation(full off mode)과 100% modulation(full on
mode)이 발생할 수 있다.
1) Full On Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “on" 상태에 있을 때를 의미
한다. 여기서 ”on" 상태는 PWM_CTRL register의 PWM_POLARITY bit에 의해서 지정
된 active low 또는 active high에 대한 것임.
2) Full Off Mode :
PWM signals의 임의의 pair를 위한 PWM이 3상 PWM Timing Unit에서 desired high
side output이 연속적인 PWM_SYNC rising edges 사이에 “off" 상태에 있을 때를 의미
한다.
3) Normal Operation :
PWM signals의 임의의 pair를 위한 PWM이 연속적인 PWM_SYNC 사이에 desired
output duty cycle이 0% 또는 100%와 다른 값을 가질 때를 의미한다.
[그림 4]로부터 유추 할 수 있듯이 PWM controller는 16-bit resolution을 가진다. 그
러나, 정확성은 PWM period에 의존한다.
PWM_CHA, PWM_CHB 그리고 PWM_CHC의 동일한 값들은 PWM 주기의 양쪽 절반안에
서 주기적으로 정의한다. 결국, PWM 생성과정에서 유효 정밀도는 2 × tSCLK 즉,fSCLK = 100MHz의 경우, 20[ns]가 된다. 그러므로, duty cycle registers 중에서 어느 하나를 “1”만큼 증가시키면, 각각의 절반 주기 안에서 tSCLK만큼 관련된 PWM signals를
주기적으로 바꾸어 준다.
[표 1]은 최소 얻을 수 있는 PWM 주파수와 bit resolution을 비교한 table이다.
단, SCLK=100[MHz]이다.
표 1
[표 1]에서 Single Update mode에서 resolution bits가 8bits일 때, 얻을 수 있는 최소PWM 주파수는 다음과 같이 계산된 것이다. 즉,
8bits는 [그림 4]의 오른쪽 그림 부분에 나와 있듯이 PWM 주기의 절반에 대한
counting bits이므로 256개의 counting number를 가질 수 있다. 그러나, 나머지 절반도 대
칭적으로 동작하므로 결국, 각각의 counting number는 SCLK 100[MHz]에서 20[ns]를 필
요하게 되므로, 총 256개의 counting을 수행하는 데 필요한 시간은 256☓20[ns]=5.12[us]
가 된다. 이것이 하나의 PWM signal을 만들 때 필요한 시간이 되므로, 주파수는
1/5.12[us]=195.3125[kHz]가 된다.
일반적으로 10[kHz]를 switching 주파수로 사용하므로 12bit resolution을 가지는 counter
를 사용하여 PWM을 생성하면 된다.
수 있거나 외부에서 입력으로 들어올 수 있다.
이 PWM SYNC pulse의 폭은 10bit read/write PWM_SYNCWT register에 의해서
programming 될 수 있다. PWM SYNC pulse의 폭은 다음과 같이 계산된다
그림 6 PWM_SYNCWT
TPWMSYNC = tSYNC *(PWM_SYNCWT +1)
결국, pulse의 폭은tSCLK로부터 1024× tSCLK 까지이다. 즉, fSCLK = 100MHz의 경우,10[ns] ~ 10.24[us]이다. default 값은 [그림 3-7]과 같이 0x03FF이다. 그러므로, fSCLK = 100MHz의 경우, 10.24[us]이다
PWM_SYNC로부터 PWM outputs안에서 결과까지의 latency는 동기화 mode에서는 3
SCLK cycles이고, 비동기화 mode에서는 5 SCLK cycles이다
SCLK cycles이고, 비동기화 mode에서는 5 SCLK cycles이다
/PWM_TRIP pin의 falling edge는 순간적으로 그리고 processor clock과 비동기적으로
PWM controller의 shutdown을 제공한다. 단, PWM_CTRL register의 PWM_TRIP_DSBL
bit가 disabling되지 않은 경우.
그러나, 만일, 이전에 PWM_SYNC가 enabling되어 있다면, PWM_SYNC pulse는 계속해서
발생하고, 그로 인한 interrupt도 계속해서 발생하여 ISR이 동작한다는 데 주의하기 바란다.
또한, trip이 발생하면, dead time counters는 reset되는 데 주의하기 바란다.
PWM controller의 shutdown을 제공한다. 단, PWM_CTRL register의 PWM_TRIP_DSBL
bit가 disabling되지 않은 경우.
그러나, 만일, 이전에 PWM_SYNC가 enabling되어 있다면, PWM_SYNC pulse는 계속해서
발생하고, 그로 인한 interrupt도 계속해서 발생하여 ISR이 동작한다는 데 주의하기 바란다.
또한, trip이 발생하면, dead time counters는 reset되는 데 주의하기 바란다.
댓글 없음:
댓글 쓰기