마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 11) CCP 모듈의 PWM 모드에서의 사용법
첨부파일


CCP의 PWM 모드에서의 사용법 

【CCP, PWM란? 】

여기에서는, PIC에 내장하고 있는 「CCP 모듈」의 「PWM 모드」에서의
사용법을 설명하고 있습니다.

   CCP = Compare/Capture/PWM
   PWM = Pulse Width Modulation(펄스폭변조)

PWM(펄스폭변조)란 무슨 일입니까? 
기본적인 원리는, 주기를 일정하게 해, 펄스의 「1」(와)과「0」의 비율을 가변
(으)로 하는 것으로, 평균의 에너지를 가변 제어하려고 하는 것입니다.

용도로서는, 여러 가지 있습니다만, 아래와 같이등이 대표적인 것입니다.
  ·모터의 속도 제어
  ·모터의 회전수제어
  ·데이터 전송용의 변조 방식(와 이유가 다릅니다만)

【PWM의 원리】

여기에서는 모터의 속도 제어를 예에, 펄스폭변조의 원리를 설명합니다.
우선, PWM 신호는 밑그림과 같은 일정 주기의 신호가 되고 있습니다.

여기서(a)(b)를 비교하면(자), 예를 들면, 「H」의 구간에서 모터가 ON가 되어, 「L」
의 구간에서 OFF가 된다고 하면, 평균의 ON와하기 위한 에너지는
ON구간의 긴, 즉 듀티의 큰(b)(분)편이 많아집니다.

이 신호의 반복 주기가, 모터의 회전수보다 충분히 빠른 속도, 즉
높은 주파수이면, 모터의 회전 에너지로서는 평균 전력으로 고
얻을 수 있기 (위해)때문에, (b)(분)편이 고속 회전을 하게 됩니다.
이것을 이용해, 「H」의 구간의 폭을 제어하는 것으로, 평균 전력을 제어해
(이)라고 모터의 속도를 제어할 수가 있습니다.



【CCP의 설정과 동작】

CCP 모듈의 동작은, 그 시간의 제어는 모두 TIMER2에 의존
하고 있습니다. 따라서, CCP의 동작은 TIMER2와 함께 하고 생각할 필요
(이)가 있습니다.
이 관련을 그림으로 저술했던 것이 밑그림으로, 조금 복잡한 관계가 되어 있고
. 이것으로 동작을 설명합니다.


TMR2는 상시 PIC의 클락(Tosc)으로 카운트업 동작을 하고 있습니다.
프리스케이라의 지정이 있을 때는 TMR2의 전단에 프리스케이라가
삽입됩니다.

우선, PWM의 출력 펄스의 일정 주기는, PR2 레지스터로 설정합니다.
이 PR2와 TMR2의 상위 8비트는 항상 비교기로 비교되고 있어
양자의 값이 일치하면(자), 비교기(Period Comparator)의 출력으로,
TMR2는 0 클리어 되어 CCP의 출력은 「High」에 세트 됩니다.

동시에, 듀티를 설정하는 DC1 레지스터(10비트)의 내용이,
CCPRxH 레지스터에 카피되어 듀티가 초기화됩니다.
 (DC1 레지스터의 내용은 CCPRxL 레지스터에 CCPxCON의 2비트가
  부가된 것입니다. )
이 듀티 레지스터(CCPRxH)와 TMR2(10비트)도 상시 비교되고
(이)라고 내려 일치하면(자), 비교기(Duty Comparaotr)의 출력으로 CCP 출력이
「Low]에 리셋트 됩니다.
따라서, PR2보다 DC1의 상위 8비트의 값이 작으면, CCP 출력은
High와 Low를 일정 주기에 반복하게 됩니다.
이 때의 CCP 출력의 주기와 High와 Low의 비율(즉 듀티)의
관계는 밑그림과 같이 됩니다.



【실제의 펄스폭과 분해가능】

그럼, CCP 출력과 듀티의 실제의 설정 분해가능은 어떻게 된다
입니까?
이것에는 TMR2의 클락이 베이스가 됩니다. 프리스케이라가 설정
되어 있지 않은(즉 「1」)시에는, TMR2에 2비트의 PS가 부가되고
10비트의 카운터로서 동작해, 입력 클락은 Tosc가 됩니다만,
프리스케이라를 사용할 때에는, 프리스케이라가 부가된 카운터로 해
(이)라고 동작해, 입력 클락은 Tosc의 4배가 됩니다.
이것을 식에서 표현하면(자), 아래와 같이가 됩니다.

  주기=(PR2+1)×4Tosc×(TMR2의 프리스케이르치)

  듀티=DC1×Tosc×(TMR2의 프리스케이르치)

결과적으로, 실제의 값은 아래 표와 같이 됩니다.

(1) PIC의 클락이20MHz
   주기=256×4×0.05μsec×1=51. 2μsec=19. 53kHz

PWM의 주기(kHz)

1.22

4.88

19.53

39.06

78.12

156.3

208.3

프리스케이라치

16

4

1

1

1

1

1

PR2의 최대치

0xFF

0xFF

0xFF

0x7F

0x3F

0x1F

0x17

최대 분해가능(비트) *1

10

10

10

9

8

7

5.5

 *1 이 분해가능은 PR2보다 큰 값을 설정할 수 없기 때문에.
    PR2보다 큰 값을 DC1로 설정하면(자) 듀티는100%가 된다.

(2) PIC의 클락이
10MHz
  주기=256×4×0.1μsec×1=102.4μsec=9. 77kHz

PWM의 주기(kHz)

0.6

2.44

9.77

19.53

39.0

78.12

104.1

프리스케이라치

16

4

1

1

1

1

1

PR2의 최대치

0xFF

0xFF

0xFF

0x7F

0x3F

0x1F

0x17

최대 분해가능(비트)

10

10

10

9

8

7

5.5


상표와 같은 실제의 값이 되지만, 실용역으로서는, 상기 어느
경우에도, 황색의 테두리의 범위가 된다.


【모터의 PWM 제어의 실제】

실제의 모터의 속도 제어를 PWM로 실시하는 예를 설명합니다.
여기서 설명에 사용하는 모터 제어의 회로도는 밑그림과 같은 것입니다.
이 회로도는 필요한 부분밖에 그려져 있지 않으므로 주의.
이 그 밖에, 5 V전원 회로라든지, 그 외의 포토를 사용하는 회로라든지가 필요
(이)가 됩니다.
이 회로에서는, PIC16C73A를 사용해, 모터의 제어에는, MOSFET의
H브릿지 회로를 사용하고 있습니다.
이 MOSFET에 의한 방법은, FET에서의 전압 드롭을 매우 적고
하는 것이 가능해, 최대 효율로 모터를 드라이브 할 수가 있습니다.
또 PWM 제어에는 2 채널 있는 CCP 출력을 정회전과 역전용으로 그것
사용해, 제어 방법은, 아래와 같은님이 합니다.
 
  정회전때
   Q1를 ON(RC3를 High)로 해, Q4를 CCP1로 PWM 드라이브를 합니다.
   이것으로 모터에 오른쪽에서 왼쪽으로 전류가 흐르게 됩니다.
   Q2는 OFF, Q3는 CCP2의 듀티 0으로 OFF인 채로 합니다.

  역회전때
   Q2를 ON(RC4를 High)로 해, Q3를 CCP2로 PWM 드라이브를 합니다.
   이것으로 모터에 왼쪽에서 오른쪽으로 전류가 흐르게 되어 역방향으로
   회전합니다.
   Q1는 OFF, Q4는 CCP1의 듀티 0으로 OFF인 채로 합니다.
    (모터용의 전원은 외부로부터 Vm와 GND에 가세합니다)

 



 

【H브릿지 개량판】

윗 그림의 H브릿지에는 아래와 같은 결점이 있습니다.

(1) 모터용의 전원이 5 V이상으로 할 수 없다.
(2) 모터에 걸리는 전압은 ON게이트 전압이 2 V 필요하기 때문에, 5 V-2V
  의 최대 3 V 밖에 차지지 않기 때문에, 2 V분이 소용없게 되어 버린다.

상기 결점을 해결한 회로가 밑그림입니다. PWM의 제어용의 FET를
2 SK2231와 페어의 P형 MOS FET로 변경해, 한층 더 트랜지스터를 1단
추가해 PIC로부터 제어 할 수 있도록(듯이) 했습니다.
이렇게 하는 것으로, 모터용 전원 Vm의 전압에 제한이 없어지는 것과
모터에 걸리는 전압이 거의 전원 전압 Vm까지로 하는 것이 성과
. 이것으로 Vm를 유효하게 사용할 수가 있습니다.





【PWM 모드의 레지스터 설정 순서】

PWM 모드로 CCP 모듈을 사용할 때의 순서는 아래와 같은님이 합니다.
또 각 레지스터의 자세한 것은 그림과 같이 되어 있습니다.
아래와 같은 레지스터 명중의 「x」에는 1이나 2가 들어갑니다. 즉 2개 있다
CCP 모듈의 어느 쪽인지를 지정합니다.


(1) Bank1에 세트 한다

(2) TRISC 레지스터로 CCP 출력 포토를 출력 모드로 설정한다
  CCP1=RC2  CCP2=RC1 (와)과 대응합니다. 이 RC1, 2를 출력 모드
  (으)로 설정하지 않으면 CCP의 출력은 핀에 나타나지 않습니다.
  또 1으로 2가 역의 포토 번호가 되어 있으므로 주의.

(3) TMR2의 PR2 레지스터에 주기를 설정한다
  주기는 최대 8비트의 값입니다. 상표로부터 사용하는 설정치를 결정해 세트
  합니다.

(4) Bank0에 되돌린다

(5) CCPxCON 레지스터로 CCP의 사용 모드를 설정한다.
  사용 모드는 PWM이기 때문에, 하위 4비트에 11 xx를 설정합니다.
   (이 xx는 1에서도 0에서도 어디라도 좋다고 하는 의미입니다. )
  상위 4비트는 듀티치를 세트 하므로 나중에 세트 합니다.



(6) CCPRxL 레지스터와 CCPxCON 레지스터에 듀티치를 설정한다.
  듀티치는 최대 10비트의 값을 세트 합니다만, 우선 CCPRxL
  레지스터에는 듀티치의 상위 8비트를 세트 해, 하위 2비트는
  전항의 CCPxCON 레지스터의 상위 2비트에 세트 합니다.



(7) TMR2의 프리스케이르치를 설정해 타이머를 스타트 시킨다.
   PWM 모드에서는 포스트스켈러는 사용하지 않습니다. 프리스케이라만
   설정합니다. 동시에 TMR2ON 비트도 1으로서 타이머를 스타트
   시키면(자) CCPx가 동작을 개시합니다.


【프로그램예】

이하는 실제의 모터 속도 제어를 위한 제어 부분의 프로그램예
입니다.

(1) 초기화 부분
  CCP를 PWM 모드로 사용하기 위한 초기설정입니다.
  주기는 최대의 FF, 타이머 2는 프리스케이르치 1으로 설정합니다.


;*******************************
; Initialize
;*******************************
INIT
    BSF   STATUS, RP0   ;Bank1로 전환하고
    MOVLW  081H      ;RC1~RC4를 출력 모드에
    MOVWF  TRISC     
;**** PWM setting ****
    MOVLW  0FFH      ;주기 레지스터에 FF를 세트
    MOVWF  PR2      
    BCF   STATUS, RP0   ;Bank0에 되돌린다
;**** H bridge set to stop mode *****

  BCF   PORTC, 3     ;H브릿지를 Off로 한다
  BCF   PORTC, 4

;**** PWM mode setting ****
    MOVLW  0CH       ;PWM 모드 설정 데이터
    MOVWF  CCP1CON     ;CCP1CON의 설정
    MOVWF  CCP2CON     ;CCP2CON의 설정
;**** PWM DUTY initialize ****
    CLRF  CCPR1L     ;CCP1를 듀티 0 설정
    CLRF  CCPR2L     ;CCP2를 듀티 0 설정
;**** TIMER2 setting and start ****
    MOVLW  04H       ;TIMER2 on prescale=1
    MOVWF  T2CON      ;TIMER2 스타트

  이 이후는 다른 프로그램이 계속된다



(2) 회전 제어 부분
  이 모터의 회전 제어는 써브루틴이 되고 있습니다.
  회전수의 데이터를 부호부 2바이트로, SPDH와 SPDL에 격납하고 나서,
  이 써브루틴을 CALL 합니다.
  다만, PWM의 듀티의 분해가능은 10비트이기 때문에, SPDL의
  하위 5비트는 사용되지 않고, SPDH의 하위 7비트와 SPDL의 상위 3비트
  의 합계 10비트만이 사용됩니다.
  써브루틴의 처리로서는, 우선 일단 모든 H브릿지의 4개의
  소자를 모두 OFF로서로부터, SPDH의 부호에 의해, 정회전이나 역회전
  인지를 판단해 각각의 처리를 실시합니다.

;***************************************
; Motor direction control subroutine
; Speed data are set in SPDH and SPDL
; 2 bytes data with sign.
; SPDH= sign + 7 bits data
; SPDL= 3 bits data + not used data
;***************************************
MOTOR
;**** 우선 일단 모든 것을 OFF로 한다 *****
    BCF   PORTC, 3     ;set Q1 off
    BCF   PORTC, 4     ;set Q4 off
    CLRF  CCPR1L     ;set CCP1 to 0
    BCF   CCP1CON, CCP1X
    BCF   CCP1CON, CCP1Y
    CLRF  CCPR2L     ;set CCP2 to 0
    BCF   CCP2CON, CCP2X
    BCF   CCP2CON, CCP2Y
;**** SPDH의 부호의 체크 ***
    BTFSS  SPDH, 7     ;check sign
    GOTO  NORMAL
    GOTO  REVERSE

;**** 역회전 제어 ****
REVERSE
;**** set new speed ****
    RLF   SPDL, W     ;shift SPDL
    RLF   SPDH, W     ;shift with carry
    MOVWF  CCPR2L     ;set CCP2

    BTFSS  SPDL, 6     ;test 1 or 0
    BCF   CCP2CON, CCP2X 
    BTFSC  SPDL, 6
    BSF   CCP2CON, CCP2X
    BTFSS  SPDL, 5
    BCF   CCP2CON, CCP2Y
    BTFSC  SPDL, 5
    BSF   CCP2CON, CCP2Y
;***** 회전 개시 ****   
    BSF   PORTC, 4     ;set Q4 on
    RETURN

;******* 정회전 제어 ***
NORMAL
;**** set new speed data ****
    RLF   SPDL, W     ;shift SPDL
    RLF   SPDH, W     ;shift with carry
    MOVWF  CCPR1L     ;set CCP1

    BTFSS  SPDL, 6
    BCF   CCP1CON, CCP1X
    BTFSC  SPDL, 6
    BSF   CCP1CON, CCP1X
    BTFSS  SPDL, 5
    BCF   CCP1CON, CCP1Y
    BTFSC  SPDL, 5
    BSF   CCP1CON, CCP1Y
;**** 회전 개시 *****
    BSF   PORTC, 3     ;set Q1 on
    RETURN

목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com