본문 바로가기

Enginius/Firmware

PIC32 - PWM


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