UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA TECNOLOGIA EM AUTOMAÇÃO INDUSTRIAL Sistemas Digitais e Microcontrolados - PIC16F877A amauriassef@utfpr.edu.br 1
Características dos módulos CCP 2 módulos Capture/Compare/PWM CCP1 CCP2 Capture Registro de 16 bits Resolução máxima de 12,5 ns Compare Registro de 16 bits Resolução máxima de 200 ns PWM (Pulse Width Modulation) Modulação por largura de pulso Resolução máxima de 10 bits 2
Recurso dos Timers Capture No modo de Captura, os registros CCPR1H:CCPR1L capturam o valor de 16 bits do par de registradores TMR1 (Timer 1) quando um evento ocorre no pino RC2/CCP1 Um evento é definido como: Cada borda de descida Cada borda de subida Cada 4ª borda de subida Cada 16ª borda de descida 3
Compare No modo de Comparação, os registros CCPR1H:CCPR1L são constantemente comparados com o par de registradores TMR1 (Timer 1). Quando os valores coincidem o pino RC2/CCP1 pode ser: Setado Resetado Permanecer inalterado 4
PWM (Pulse Width Modulation) No modo PWM modulação por largura de pulso o pino CCPx gera uma saída PWM com resolução de 10 bits Como o CCP1 é multiplexado como o latch de dado do PORTC, o registro TRISC, bit 2, deve ser zerado para configurar o pino RC2/CCP1 como saída 5
Registrador de configuração do módulo CCPx CCPxX:CPxY: Bits LSB do PWM Utilizado somente no modo PWM CCPxM3:CCPxM0: Modo de seleção dos CCPx 0000 CCP desabilitado 0100 Capture a cada borda de descida 0101 - Capture a cada borda de subida 0110 - Capture a cada 4ª borda de subida 0111 - Capture a cada 16ª borda de subida 1000 Compare, seta saída 1001 Compare reseta saída 1010 Compare gera interrupção sem afetar o pino 1011 Compare trigger de evento especial (A/D) 11xx - PWM 6
Diagrama em blocos simplificado do PWM 7
Cálculo do período PWM O período do PWM é especificado escrevendo no registro PR2 O período pode ser calculado através da seguinte equação: Período PWM = [(PR2) + 1)]. 4. Tosc. TMR2 Prescaler Tosc é o período do oscilador (clock) 8
Exemplo de cálculo do período PWM Parâmetros Período de 50 μs (f = 20 khz) Frequência do cristal de 8 MHz (Tosc = 125 ns) Prescaler do Timer 2 igual a 1:1 Calcular o valor de carga do registro PR2 (banco 1) Período PWM = [(PR2) + 1)]. 4. Tosc. TMR2 Prescaler 50 μs = [(PR2 + 1)]. 4. 125ns. 1 PR2 = 99 9
Cálculo do duty cycle O duty cycle do PWM é especificado através da escrita nos registradores CCPR1L concatenado com o CCP1CON, bits 5 e 4, com resolução de 10 bits O duty cycle pode ser calculado através da seguinte equação: Duty Cycle PWM = (CCPR1L: CCP1CON <5:4>). Tosc. TMR2 Prescaler Tosc é o período do oscilador (clock) 10
Configuração do Timer 2 TOUTPS3:TOUTPS0: Seleção do postscale do Timer 2 0000 1:1... 1111 1:16 TMRON2: Bit para ligar o Timer 2 0 Timer 2 desligado 1 Timer 2 ligado T2CKPS1:T2CKPS0: Seleção do prescaler do Timer 2 00 1:1 01 1:4 1x 1: 16 11
Exemplo de hardware 12
Exemplo: 1) Escrever o firmware para gerar um sinal PWM no pino RC2/CCP1 com frequência de 20 khz (período = 50 μs)e duty cycle inicial de 20% (50 μs. 0,2 = 10 μs): 13
Programa principal (Assembly): INICIO Configura o PIC16F877A BANK1 MOVLW 0X00 MOVWF TRISC ; CONFIGURA PORTC COMO SAÍDA MOVLW B'00000000' ; TIMER 0 -> PRESCALER DE 1:2 MOVWF OPTION_REG BANK0 BANK1 MOVLW D'99' ; VALOR PARA PERÍODO DE 50us (20kHz) MOVWF PR2 BANK0 MOVLW D'20' ; 80/4 = 20%, PARA NÃO UTILIZAR 2 BITS MOVWF CCPR1L ; DA PARTE BAIXA 14
Continuação: CLRF TMR2 MOVLW B'00000100' ; -> T2CKPS0 - PRESCALE - 00 = 1:1 ; --> T2CKPS1 ; ---> TMR2ON ; ----> TOUTPS0 - POSTSCALE - 0000 = 1:1 ; -----> TOUTPS1 ; ------> TOUTPS2 ; -------> TOUTPS3 ; --------> NÃO IMPLEMENT. MOVWF T2CON MOVLW B'00001100' ; CONTROLE DO PWM ; -> CCP1M0 - SELEÇÃO DE MODO DO CCP1-11XX PARA PWM ; --> CCP1M1 ; ---> CCP1M2 ; ----> CCP1M3 ; -----> CCP1Y - PINOS LSB DO DUTY CYCLE DO PWM ; ------> CCP1X ; -------> NÃO IMPLEMENT. ; --------> NÃO IMPLEMENT. MOVWF CCP1CON GOTO $ END 15
Programa principal (C): unsigned short i; void main() { TRISC = 0x00; // PORTC COMO SAÍDA PORTC = 0x00; // VALOR INICIAL = 00 Pwm_Init(20000); Pwm_Start(); while(1) { for (i = 0; i <= 255; i++) { Pwm_Change_Duty(i); Delay_ms(5); } } } // INICIALIZA O MODULO PWM COM 20kHz // INICIA PWM // INCREMENTA O DUTY CYCLE A CADA 10ms 16