Escola Superior de Ciências
Náuticas
Configuração PWM e UART: Uso das bibliotecas
Aplicações de Microprocessadores I
Docente: Eng. Elso Guilengue Douglas André
Depart. De Rádio. 3R Milton Cuambe
Neyla Mussá
Palmira Chavana
Toní Manjate
Maputo, Maio de 2025
Configuração PWM
01
Uso Da Biblioteca PWm
02
00 03
Exemplos PWM
Introdução
Configuração UART
04
Biblioteca UART + Exemplos
05
Introdução
• O PIC16F877A é um microcontrolador de 8 bits amplamente utilizado
em projetos educacionais e industriais.
• Possui módulos internos para controle PWM (Pulse Width
Modulation) e comunicação UART (Universal Asynchronous Receiver
Transmitter).
• A capacidade de controlar sinais de saída com precisão e comunicar-
se com dispositivos externos torna esse microcontrolador
extremamente versátil.
• Este trabalho explora as configurações, códigos e simulações práticas
utilizando as ferramentas MikroC e Proteus.
Objectivos
• Demonstrar o uso prático da modulação por largura de pulso (PWM)
para controle de dispositivos como motores e LEDs.
• Explicar a comunicação serial assíncrona utilizando a interface UART.
• Apresentar como integrar leitura analógica (ADC) ao controle PWM
para aplicações dinâmicas.
• Implementar e validar a recepção de dados via UART utilizando
interrupções para melhorar a eficiência.
Configuração PWM
• PWM é uma técnica de controle que simula sinais analógicos utilizando
pulsos digitais de largura variável.
• Duty Cycle define a razão entre o tempo ligado (nível alto) e o tempo total
do ciclo:
• 0%: sinal sempre desligado
• 50%: metade do tempo ligado
• 100%: sinal sempre ligado
• É amplamente utilizada para controlar intensidade luminosa, velocidade de
motores, e potência em cargas resistivas.
Configuração PWM
• Ciclo de Trabalho e Tensão Média (PWM)
• Sinal com pico de 10 V e período de 1 s:
• Ciclo de 50%: ligado 0,5 s / desligado 0,5 s → Saída média: 5 V
• Ciclo de 75%: ligado 0,75 s / desligado 0,25 s → Saída média: 7,5 V
• No PIC16F877A, o ciclo de trabalho é ajustado por meio de registros
específicos de PWM.
Figura 1:Exemplo de PWM
Configuração PWM
Frequência e Módulo PWM no PIC16F877A
•Frequência (f) = 1 / Período (T)
• Ex: 1 Hz → LED visivelmente pisca
• Ex: 1 kHz → LED parece com brilho constante (sem cintilação)
• Frequência alta garante controle suave da intensidade de luz
• PWM no PIC16F877A
• 2 módulos CCP independentes: CCP1 e CCP2
• Cada módulo pode funcionar como:
• Captura de 16 bits
• Comparação de 16 bits
• PWM de 10 bits:
• PWM de 10 bits:8 bits no registo CCPxL
• 2 bits no registo CCPxCON
Configuração PWM
• O microcontrolador possui dois módulos CCP (Capture/Compare/PWM): CCP1
(pino RC2) e CCP2 (pino RC1).
• Utiliza o Timer2 como base de tempo para definir a frequência do sinal PWM.
• Duty Cycle é configurado nos registradores CCPR1L e nos bits menos
significativos de CCP1CON.
• A frequência é determinada pelo valor de PR2 em conjunto com o clock do
sistema.
• O MikroC oferece uma biblioteca que simplifica essa configuração, com funções
prontas como PWM1_Init(), PWM1_Set_Duty(), PWM1_Start() e
PWM1_Stop().
Configuração PWM
• Para inicializar o PWM neste microcontrolador, temos primeiro de analisar todos os
registos necessários para o configurar
Registos Descriçãp TMR2ON: bit de ativação do Timer2
T2CON Registo de controlo do Timer2, para definir o prescaler, 1 = Timer2 está ligado
o postscaler e ligar/desligar o Timer2.
0 = Timer2 está desligado
PR2 Registo de período Timer2, para definir o valor máximo
do contador.
T2CKPS1:T2CKPS0: Bits de seleção de
CCP1CON Este registo controla as operações do CCP1
prescaler do relógio do Timer2
TRISC Este registo é utilizado para definir PORTC como E/S 00 = Prescaler é 1
01 = Prescaler é 4
1x = Prescaler é 16
Configuração PWM
CCPxM3:CCPxM0: bits de seleção do modo CCPx
0000 = Captura/Comparação/PWM desativado (repõe o módulo CCPx)
0100 = Modo de captura, cada flanco descendente
0101 = Modo de captura, cada flanco ascendente
0110 = Modo de captura, a cada 4º flanco ascendente
0111 = Modo de captura, a cada 16º flanco ascendente
1000 = Modo de comparação, definir saída na correspondência (bit CCPxIF
definido)
1001 = Modo de comparação, limpar saída na correspondência (bit CCPxIF
definido)
1010 = Modo de comparação, gera interrupção de software na correspondência
(bit CCPxIF definido, o pino CCPx não é afetado)
1011 = Modo de comparação, aciona evento especial (bit CCPxIF definido, o pin
CCPx não é afetado); CCP1 reinicia TMR1; O CCP2 reinicia o TMR1 e inicia
uma conversão A/D (se o módulo A/D estiver activado)
11xx = modo PWM
01 Biblioteca PWM
• O MikroC PRO for PIC oferece uma biblioteca que simplifica totalmente a configuração do
PWM. Com apenas algumas funções, o módulo PWM pode ser inicializado e utilizado com
precisão.
• Principais funções:
• Função Descrição
• PWM1_Init(frequency); Inicializa o PWM1 com a frequência desejada em Hz
• PWM1_Set_Duty(duty); Define o duty cycle entre 0 e 255 (0–100%)
• PWM1_Start(); Inicia a geração do sinal PWM
• PWM1_Stop(); Interrompe o sinal PWM
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
void main() { 3
RA0/AN0 RB3/PGM
37
RA1/AN1 RB4
TRISC.F2 = 0; // Configura RC2 (CCP1) como 4
RA2/AN2/VREF-/CVREF RB5
38
5 39
saída 6
RA3/AN3/VREF+ RB6/PGC
40
RA4/T0CKI/C1OUT RB7/PGD
PWM1_Init(5000); // Inicializa PWM1 com 7
RA5/AN4/SS/C2OUT
15
frequência de 5 kHz 8
RE0/AN5/RD
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
16
PWM1_Start(); // Inicia o sinal PWM R2 9
RE1/AN6/WR RC2/CCP1
17
330R 10 18
RE2/AN7/CS RC3/SCK/SCL
PWM1_Set_Duty(127); // Define duty cycle em RC4/SDI/SDA
23
50% (127 de 255) 1
MCLR/Vpp/THV RC5/SDO
24 D1
25 LED-BLUE
RC6/TX/CK
26
RC7/RX/DT
while(1) { 19
RD0/PSP0
// O PWM está ativo automaticamente por RD1/PSP1
20
hardware RD2/PSP2
21 R1
22 330R
RD3/PSP3
} RD4/PSP4
27
28
RD5/PSP5
} RD6/PSP6
29
30
RD7/PSP7
PIC16F877A
while(1)
{
#define butt1 RB1_bit
if(!butt1)
#define butt2 RB2_bit
{
#define butt3 RB3_bit
delay_ms(40);
#define butt4 RB4_bit
duty1++;
CMCON = 0x07; PWM1_Set_Duty(duty1);
unsigned short duty1, duty2;
TRISB = 0xFF; }
TRISC = 0x00;
void main()
PORTB = 0xFF; if(!butt2)
{ PORTC = 0x00; {
delay_ms(40);
CMCON = 0x07; PWM1_Init(5000); duty1--;
TRISB = 0xFF; PWM2_Init(5000); PWM1_Set_Duty(duty1);
TRISC = 0x00; }
PORTB = 0xFF; duty1 = 127;
PORTC = 0x00; duty2 = 127; if(!butt3)
{
PWM1_Init(5000); PWM1_Start(); delay_ms(40);
PWM2_Init(5000); PWM2_Start(); duty2++;
PWM2_Set_Duty(duty2);
duty1 = 127; PWM1_Set_Duty(duty1); }
duty2 = 127; PWM2_Set_Duty(duty2);
if(!butt4)
PWM1_Start(); {
PWM2_Start(); delay_ms(40);
duty2--;
PWM1_Set_Duty(duty1); PWM2_Set_Duty(duty2);
PWM2_Set_Duty(duty2); }
}
Exemplo Avançado: PWM com ADC
void main() { while (1) {
ADCON1 = 0x80; // AN0 como analógico, Vref = Vdd adc_value = ADC_Read(0); // Valor ADC de 0 a
TRISA.F0 = 1; // RA0 (AN0) como entrada 1023 (10 bits)
TRISC.F2 = 0; // RC2 como saída (PWM1) pwm_value = adc_value; // PWM de 0 a 1023
// Configuração do PWM // Escreve os 8 MSBs em CCPR1L
T2CON = 0x04; // Timer2 ligado, prescaler = 1 CCPR1L = pwm_value >> 2;
PR2 = 124; // Período PWM (~5kHz para Fosc = 8 // Escreve os 2 LSBs em CCP1CON<5:4>
MHz) CCP1CON.B5 = (pwm_value >> 1) & 0x01;
CCP1CON = 0x0C; // Modo PWM (1100) CCP1CON.B4 = pwm_value & 0x01;
CCPR1L = 0; delay_ms(10); // Atraso pequeno
CCP1CON.B5 = 0; }
CCP1CON.B4 = 0; }
Exemplo Avançado: PWM com ADC
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
R2 RC0/T1OSO/T1CKI
15
RV1
10k 8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
50%
RC4/SDI/SDA
1
MCLR/Vpp/THV RC5/SDO
24 D1
25 LED-GREEN
RC6/TX/CK
26
RC7/RX/DT
1k
19
RD0/PSP0
RD1/PSP1
20 R1
21 220R
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A
Configuração UART
01
UART (Universal Asynchronous Receiver/Transmitter) é uma interface de comunicação serial
assíncrona utilizada para transmitir e receber dados digitais entre dois dispositivos, bit a bit, por
meio de apenas duas linhas:
•TX (Transmissão)
•RX (Recepção)
Diferentemente da comunicação síncrona, a UART não utiliza sinal de clock externo, pois
transmissor e receptor operam com base em uma taxa de transmissão (baud rate) pré-definida e
igual para ambos.
Recursos internos da UART no PIC16F877A
Registradores de controle:
TXSTA: Transmit Status and Control Register
RCSTA: Receive Status and Control Register
SPBRG: Baud Rate Generator (define velocidade)
Registradores de dados:
TXREG: Envia dados
RCREG: Recebe dados
Registo Descrição
TXSTA Transmitir o estado e o registo de controle
RCSTA Receber o estado e o registo de controle
SPBRG Gerador de taxa de transmissão USART
TXREG Registo de Transmissão USART. Contém os dados a
transmitir na UART
RCREG Registo de Transmissão USART. Contém os dados
recebidos da UART
Configuração UART
01
TXSTA
TXEN: Bit de Habilitação de Transmissão
1 = Transmissão ativada
7 6 5 4 3 2 1 0
0 = Transmissão desativada
CSRC TX9 TXEN SYNC - BRGH TRMT TX9D SYNC: Bit de Seleção do Modo USART
1 = Modo síncrono
CSRC: Bit de Seleção da Fonte de Relógio 0 = Modo assíncrono
Modo assíncrono: Não importa. BRGH: Bit de Seleção de Alta Taxa de Transmissão
1 = Alta velocidade
TX9: Bit de Habilitação de Transmissão de 9 bits 0 = Baixa velocidade
1 = Seleciona a transmissão de 9 bits TRMT: Bit de Estado do Registador de Deslocamento de Transm
0 = Seleciona transmissão de 8 bits 1 = TSR vazio
0 = TSR cheio
TX9D: 9º bit de Dados de Transmissão, pode ser bit de Paridade
• TRANSMISSÃO
• CSRC: Clock Source Select.
Para modo Assíncrono.
• TX9: Habilitar transmissão com 9 bits.
• TXEN: Transmit Enable Bit
• Para habilitar a transmissão de dados.
• SYNC: USART Mode Select Bit
Escolher comunicação Síncrona (1) ou Assíncrona (0).
• BRGH: High Baud Rate Select Bit
Para modo Assíncrono: Alta velocidade (1).
• TRMT: Transmit Shift Register Status Bit
Ele indica se o registador esta cheio ou não. Empty (1)
• RECEPÇÃO
• SPEN: Serial Port Enable Bit.
1 = Habilita o UART habilitando os pinos(RC7 e RC6).
• RX9: 9-bit Receive Enable bit.
• SREN: Habilitar Recepção Única.
• CREN: Habilitar Recepção continua.
• ADDEN: Habilita detecção de endereço (caso esteja em uso o nono bit)
• FERR: Framing error bit
1 = Erro de quadro
• OERR: Overrun error bit
Quando comunicação e muito rápida e há sobreposição de bits
1: Erro de sobreposição.
Configuração No MikroC
Biblioteca UART no MikroC
•MikroC fornece funções integradas para facilitar o uso da UART:
•UART1_Init(9600); inicializa a UART com baud rate de 9600
•UART1_Write('A'); envia um caractere
•UART1_Write_Text("Mensagem"); envia uma string completa
•UART1_Data_Ready(); verifica se há dado recebido
•UART1_Read(); lê o dado recebido
•Ideal para implementar menus interativos, comandos remotos ou feedback serial.
Configuração No MikroC -
Exemplos
Recepção UART por Interrupção:
Conceito e Implementação com
Exemplo
• A UART pode ser usada com interrupção para evitar o uso de polling
contínuo.
• O microcontrolador interrompe seu fluxo normal ao detectar
recepção.
• void interrupt()
• { if ([Link])
• { char c = UART1_Read();
• UART1_Write(c); }}
Recepção UART por Interrupção:
Conceito e Implementação com
Exemplo
C5
22pF
U4
X3 13
OSC1/CLKIN RB0/INT
33
CRYSTAL 14 34
OSC2/CLKOUT RB1
35
C6 2
RB2
36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
22pF 5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2 RXD
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL TXD
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO RTS
25
RC6/TX/CK
26
RC7/RX/DT CTS
R6 RD0/PSP0
19
10k 20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A