PWM은 pulse with modulation의 약자이다. 아마;
아날로그 신호를 내보낼 수 없는 디지탈 회로의 특성상 (DAC는 많이 않다) 그 세기를 변화시켜야 하는 LED나 모터의 구동에서 쓰인다.
pwm에는 주파수와 duty비 만 정해주면 되는데 이를 위해서는 먼저 그 개념을 알 필요가 있다. 주파수는 파형이 high low로 떨리는 정도를 뜻하고 듀티비는 하이로 유지되고 있는 정도를 뜻한다. 100%라면 계속 하이일테고 0%라면 계속 로우일 것이다.
개념 자체는 매우 간단하다. 이를 구현하기 위해서는
1. 타이머를 설정하고
2. 타이머를 Output Compare와 연동시키고 (주파수가 여기서 결정)
3. Max Count값을 설정한다. (듀티비는 = compare값 / Max값)
Output Compare Registers
OCxCON(x는 숫자)
bit31-16
Reserved
bit15
ON: Output Capture Peripheral On bit
1: Output Compare 를 사용한다.
0: Output Capture 를 사용하지 않는다.
bit14
FRZ: Freeze in Debug Exception Mode bit
1: 디버그 모드에서 멈춘다.
0: 디버그 모드에서 계속 작동
bit13
SIDL: Stop in IDLE Mode bit
1: IDLE 모드에서 멈춘다.
0: IDLE 모드에서 계속 작동
bit12-6
Reserved
bit5
OC32: 32-bit Compare Mode bit
1: OCxR<31:0> 과 OCxRS<31:0> 을 사용한다.
0: OCxR<15:0> 과 OCxRS<15:0> 을 사용한다.
bit4
OCFLT: PWM Fault Condition Status bit
1: 문제 상황이 생겼다.
0: 문제가 없다.
bit3
OCTSEL: Output Capture Timer Select bit
<타이머2,3은 input capture에서도 쓰인다.>
1: 타이머3을 사용
0: 타이머2를 사용
bit2-0
OCM<2:0>: Output Capture Mode Select bits
111: PWM 모드; Fault pin 사용
110: PWM 모드; Fault pin 사용 안함
101: OCx 핀을 low로 초기화; OCx 핀에 계속 펄스 내보냄
100: OCx 핀을 low로 초기화; OCx 핀에 한번 펄스 내보냄
011: 비교 이벤트가 OCx핀을 toggle
010: OCx 핀을 high로 놓고; 비교 이벤트가 핀을 low로 내린다.
001: OCx 핀을 low로 놓고; 비교 이벤트가 핀을 high로 올린다.
000: 사용 안함
타이머 2의 주기는 4000 -> 80MHz로 동작하므로 20KHz로 동작한다. : OC1, 2
-> OCxRS 가 0이면 0%, 4001이면 100% 의 듀티비
타이머 3의 주기는 25000 -> 80MHz로 동작하므로 3.2KHz로 동작한다. : OC3,4,5
-> OCxRS 가 0이면 0%, 25001이면 100% 의 듀티비
< pic32_icap.c >
void Init_pwm() { //PWM 초기화 (Output capture) 5개 PORTSetPinsDigitalOut(IOPORT_D, BIT_0|BIT_1|BIT_2|BIT_3|BIT_4); OpenTimer2(T2_ON | T2_IDLE_CON | T2_PS_1_1 , PERIOD); //현재는 4000 OpenOC1 (OC_ON | OC_TIMER2_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE ,0x0000, 0); OpenOC2 (OC_ON | OC_TIMER2_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE ,0x0000, 0); OpenOC3 (OC_ON | OC_TIMER3_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE ,0x0000, 0); OpenOC4 (OC_ON | OC_TIMER3_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE ,0x0000, 0); OpenOC5 (OC_ON | OC_TIMER3_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE ,0x0000, 0); } //사용 SetDCOC1PWM((int32)val); SetDCOC2PWM((int32)val); SetDCOC3PWM((int32)val); SetDCOC4PWM((int32)val); SetDCOC5PWM((int32)val); //컴파일러 제공 (선언할 필요 없음) #ifdef _OCMP1 #define SetDCOC1PWM(dutycycle) (OC1RS = (dutycycle)) #endif #ifdef _OCMP2 #define SetDCOC2PWM(dutycycle) (OC2RS = (dutycycle)) #endif #ifdef _OCMP3 #define SetDCOC3PWM(dutycycle) (OC3RS = (dutycycle)) #endif #ifdef _OCMP4 #define SetDCOC4PWM(dutycycle) (OC4RS = (dutycycle)) #endif #ifdef _OCMP5 #define SetDCOC5PWM(dutycycle) (OC5RS = (dutycycle)) #endif
'Enginius > Firmware' 카테고리의 다른 글
PIC32 - TIMER (0) | 2010.04.13 |
---|---|
PIC32 - SPI (0) | 2010.04.13 |
PIC32 - Input Capture (0) | 2010.02.19 |
PID 제어 (1) | 2010.02.18 |
PIC32 - I2C (0) | 2010.02.17 |