마음 속 하늘은 항상 맑음~!
PWM 회로의 펌웨어 업데이트. 본문
기존의 PWM회로의 성능을 더 안정시킨 것으로, 전력 컨트롤 회로의 경우에는 확실히 높은 PWM 주파수를 써야 한다는 것을 깨달음. 1W 정도의 부하에서는 FET에서 미열조차 없어서 그냥 차가운 상태로 기존의 펌웨어에서 발열이 심하던 문제의 해결.
그리고 PWM을 약 1KHz로 조정해서 보다 나은 안정된 전압이 나오도록 함. 기존에는 64레벨로 미세전압 조정이 어려웠지만, 255레벨로 늘려서 더 미세 간격의 조절이 가능해짐.
출력 합선을 인지해서 전압을 낮추는 기능을 넣었고, 이 부분의 소스는 공개하지 않을 예정.
LED는 안정된 전압에 도달하면 깜박이는 속도가 느려지고, 평소에는 빠름.
PWM 인터럽트 부분의 소스만 공개하자만 다음과 같고, 응용하는데 크게 어렵지 않음.
// 상수 선언들.
const
c138 = 942; // 13.8 * 1024 / 15
{ 4MHz }
PWM_MAX = 255; // 1000000 / 4 / 255
PWM_LOW = 0;
TMR1L_LOAD=$38; // 1000000 / 1000
TMR1H_LOAD=$fc;
// 인터럽트 초기화 부분
OPTION_REG:=%11010001; // ~1KHz @ 4MHz, PSA->time 0, 001=> 1:4
TMR0IE_bit:=1;
PEIE_bit:=1;
TMR1CS_bit:=0;
TMR1IE_bit:=1;
TMR1L:=TMR1L_LOAD;
TMR1H:=TMR1H_LOAD;
TMR1ON_bit:=1;
GIE_bit:=1; // enable Interrupt
// 1ms 딜레이.
function Delay1ms(var t:byte; limit:byte):Boolean;
var
ts:byte;
begin
if limit>0 then begin
ts:=TICK_1000;
if t<=ts then
ts:=ts-t
else
ts:=255-t+1+ts;
Result:=ts>=limit;
end else
Result:=True;
if Result then
t:=TICK_1000;
end;
// 인터럽트 핸들러
procedure Interrupt(); iv 0x0004; ics ICS_AUTO;
begin
if T0IF_bit=1 then begin
{ PWM MAX 96% }
if PWM_SIG=1 then begin
ON_PWM:=VOL_PWM;
if ON_PWM=0 then
TMR0:=ON_PWM
else begin
TMR0:=PWM_MAX-ON_PWM;
PWM_SIG:=0;
end;
end else begin
TMR0:=ON_PWM;
PWM_SIG:=1;
end;
T0IF_bit:=0;
end;
if T1IF_bit=1 then begin
Inc(TICK_1000);
TMR1L:=TMR1L_LOAD;
TMR1H:=TMR1H_LOAD;
T1IF_bit:=0;
end;
end;
타이머 1을 이용해서 1밀리초를 체크하도록 수정했고, 타이어 0로 PWM을 컨트롤. 소프트웨어 PWM이라 한계가 있는데, 최대 PWM이 96%정도.
간단하게 실험한 결과, 부하가 걸리면 전압강하로 본래 패널의 전압이 나오지 않고 상당히 하락함. 위의 펌웨어에서는 0.6v미만이면 합선으로 간주하던 것을 0.3v로 더 내린 펌웨어.
12f675-PwmFet-firmware-03v.zip
5v PWM 옵션을 추가. 2번핀을 접지시키면 5v출력으로 조정됨.
12f675-PwmFet-firmware-03v-add5v.zip
'하드웨어' 카테고리의 다른 글
LM2576-5.0을 이용한 PWM buck 컨버터. (0) | 2015.06.18 |
---|---|
N채널 FET의 Bootstrap. (1) | 2015.06.16 |
납축전지 충방전 컨트롤러. (0) | 2015.05.31 |
PWM 레귤레이터. (0) | 2015.05.29 |
KiCAD r5640 32비트. (0) | 2015.05.24 |