Buscar

Tema 3 Periféricos Integrados

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 50 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 50 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 50 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

DESCRIÇÃO
Os periféricos internos essenciais dos microcontroladores, as formas de acioná-los por meio de programação para
realização de sistemas de monitoração e controle na plataforma Arduino e com microcontroladores da família PIC.
PROPÓSITO
Compreender o uso dos dispositivos internos dos microcontroladores, auxiliares da Unidade Central de
Processamento (UCP) na criação de sistemas de monitoração e controle − fator essencial para a formação do
projetista de sistemas embarcados.
PREPARAÇÃO
Antes de iniciar o conteúdo deste tema, tenha instalado o compilador CCS, o ambiente MPLAB e o simulador
PicSimLab, além de um cadastro no simulador Tinkercad.
OBJETIVOS
MÓDULO 1
Empregar as portas de entrada e saída dos microcontroladores para a interação com dispositivos externos
MÓDULO 2
Aplicar conversores analógico-digitais para criação de sistemas de aquisição de dados com microcontroladores
MÓDULO 3
Identificar a importância do uso de temporizadores e contadores para o desenvolvimento de sistemas de tempo
real com microcontroladores
MÓDULO 4
Esquematizar o uso da Modulação por Largura de Pulso (PWM) para o controle de dispositivos externos
INTRODUÇÃO
Os microcontroladores têm mais dispositivos internos além de uma UCP, RAM e memória de programa. Eles
contêm circuitos que são usados para interagir com sistemas fora do microcontrolador, bem como interagir direta e
indiretamente com seus arredores no mundo por meio de sensores, acionadores de motor ou interfaces humanas
− como mostradores, teclados ou botões. Esses componentes são conhecidos coletivamente como periféricos.
Alguns periféricos são úteis porque permitem que um desenvolvedor descarregue o processamento para eles,
evitando ter que lidar com tudo no software.
Semelhante a como um desenvolvedor de desktop descarregaria o processamento gráfico em uma placa de vídeo,
os desenvolvedores de sistemas embarcados podem descarregar algumas tarefas nos periféricos, permitindo que
a CPU gaste seu tempo fazendo outra coisa importante ou não fazendo nada para economizar energia.
Neste tema, veremos os periféricos internos mais comuns de um microcontrolador, estudando as técnicas para
configurá-los e acioná-los usando registradores específicos, além de aprender sobre as limitações dos mesmos.
Dessa forma, veremos como utilizar instruções em C para controlar periféricos internos em projetos de sistemas
embarcados, com exemplos para as plataformas Arduino e PIC de microcontroladores.
MÓDULO 1
 Empregar as portas de entrada e saída dos microcontroladores para a interação com dispositivos
externos
PORTAS DIGITAIS DE ENTRADA E SAÍDA
Os microcontroladores precisam ter a capacidade de monitorar e controlar um dispositivo externo a ele, sendo esta
a sua principal característica como dispositivo de controle. Vamos, primeiramente, verificar as portas digitais
usadas como entrada e saída (E/S).
 
Fonte: Golubovy/Shutterstock.com
Os pinos de E/S digital de um microcontrolador podem ser acessados individualmente. Mas, geralmente, são
agrupadas também em portas de 8 pinos, que podem ser acessadas com um único byte. Os pinos podem ser
apenas de entrada, apenas de saída ou, mais comumente, bidirecionais − ou seja, capazes de entrada e saída.
Além de seus recursos de E/S digital, a maioria dos pinos tem uma ou mais funções alternativas para manter o
chip pequeno. Assim, muitos módulos do microcontrolador que requerem pinos de E/S, como um módulo de
comunicação ou um temporizador, podem usar funções alternativas dos pinos de E/S digitais.
 SAIBA MAIS
O programador do aplicativo pode selecionar qual função deve ser usada para o pino, habilitando a funcionalidade
dentro do módulo apropriado. Obviamente, se um pino for usado para um módulo de comunicação, ele será
perdido para E/S digital e vice-versa. Portanto, o projetista do hardware deve escolher cuidadosamente quais pinos
usar para quais funções.
Vamos nos concentrar na capacidade de E/S digital dos pinos, mas, antes, vamos relembrar o que queremos dizer
com “digital”.
Digital descreve a tecnologia eletrônica que gera, armazena e processa dados em termos de dois estados ou
níveis lógicos: positivo e não positivo (ou zero). Positivo é expresso ou representado pelo número 1 e não positivo,
pelo número 0.
Assim, os dados transmitidos ou armazenados com tecnologia digital são expressos como uma sequência de 0's e
1's. Cada um desses dígitos de estado é o nosso conhecido bit. Então, quando falamos sobre E/S digital,
queremos dizer que o valor do pino, da perspectiva do controlador, é de nível lógico 0 ou 1.
 
Fonte: SkillUp/Shutterstock.com
As portas de E/S digitais, assim como os demais periféricos, são conectadas ao microcontrolador por alguns
registradores especiais. Os diferentes registradores podem ser de dois tipos:
REGISTRADORES DE DADOS
Que contêm alguns dados, digamos, o byte que representa o estado de uma porta.
REGISTRADORES DE STATUS E CONTROLE
São usados para configurar o periférico de acordo com sua necessidade e para controlá-lo a partir de seu
programa. Por exemplo, o registrador que controla se os pinos de uma porta serão usados como entrada ou saída.
É desejável que se configure os pinos de um microcontrolador na direção desejada (entrada ou saída) no início do
software que é executado quando ele é ligado ou reinicializado. Os registradores para esse propósito podem ser
configurados na programação por funções específicas dentro de um ambiente, como a função pinMode() para
Arduino.
Depois de configurar qualquer pino de E/S, é possível ler seu estado (se for um pino de entrada) ou alterar seu
estado lógico (se for um pino de saída). Funções específicas também são usadas para alterar o registrador
corresponde a um pino. Assim, o valor que é escrito para, ou lido desse registrador, especifica o estado lógico dos
pinos correspondentes (alto ou baixo).
LENDO DOS PINOS DIGITAIS
A funcionalidade de entrada digital é utilizada sempre que queremos monitorar um sinal e interpretá-lo
digitalmente, ou seja, quando esse sinal muda apenas entre os dois estados: alto (correspondendo à lógica 1) e
baixo (correspondendo a 0).
A leitura do estado lógico de um pino de entrada requer conexões de hardware adicionais para garantir um
comportamento estável do sistema.
Sabemos que um pino típico pode ser conduzido para nível alto ou baixo, no entanto, não se deve deixar um pino
de E/S flutuando, desde que seja usado como uma entrada para o sistema. Por esse motivo, os pinos de entrada
geralmente são puxados para baixo (pino em pull-down) ou para cima (pino em pull-up).
 SAIBA MAIS
Existem microcontroladores que, ao terem um pino configurado como entrada, podem selecionar esta para a
configuração pull-up internamente, não necessitando de ligação externa para garantir a mesma.
Confira as características dos pinos de entrada:
PINOS DE ENTRADA EM PULL-UP
PINOS DE ENTRADA EM PULL-DOWN
PINOS DE ENTRADA EM PULL-UP
Nessa configuração, o pino é sempre puxado para o nível alto (lógica 1) até que ocorra um evento para acioná-lo
para nível baixo (lógica 0). Tudo que é preciso é ter um resistor conectado entre o pino de entrada e o VSS (+ 5V),
como mostrado na Figura 1a. O estado lógico do pino é sempre 1 até que o botão seja pressionado, ocasião em
que é ligado diretamente com o terra e se torna 0. Isso é chamado de entrada de lógica negativa, pois a ação do
usuário (pressionando o botão) transfere o estado do pino digital de alto para baixo.
PINOS DE ENTRADA EM PULL-DOWN
Nesta configuração, o pino é sempre baixado (lógica 0) até que ocorra um evento para acioná-lo como nível alto
(lógica 1). Tudo que é necessário é um resistor conectado entre o pino de entrada e o terra como mostrado na
Figura 1b. O estado lógico do pino é sempre 0 até o botão ser pressionado, então ele é ligado diretamente com
VCC (+ 5V) e se torna 1. Isso é chamado de entrada lógica positiva, pois a ação do usuário (pressionando o botão)
transfere ao pino o estadode baixo para alto.
Você consegue comparar a configuração dos pinos de entrada observando a imagem abaixo:
 
Fonte: EnsineMe
 Figura 1: Configuração dos pinos de entrada em pull-up e pull-down. 
Fonte: EnsineMe
ESCREVENDO NOS PINOS DIGITAIS
A funcionalidade de escrita digital é usada para definir os pinos de saída para determinados níveis de tensão. Os
níveis correspondentes a alto e baixo são novamente especificados pelo microcontrolador e dependem da tensão
de operação deste.
Assim, sempre que um pino é definido como de saída, o microcontrolador o aciona de acordo com o valor
fornecido no registrador correspondente.
Um pino de saída deve ser conectado a algum dispositivo externo − que pode ser referido como uma carga − para
fazer algo útil.
CARGA
Uma carga real pode ser um LED, uma lâmpada, um relé ou algum outro elemento do circuito.
Geralmente, existem duas maneiras de conectar um pino de saída a uma carga. A primeira é onde o
microcontrolador − referido como a fonte − fornece a corrente elétrica para acionar o dispositivo. A corrente flui do
microcontrolador para o pino de saída (P0), através da carga e para o GND, a referência do circuito. Essa
configuração é mostrada na figura abaixo.
javascript:void(0)
 
Fonte: EnsineMe
 Figura 2: Microcontrolador fornecendo corrente para a carga. 
Fonte: EnsineMe
Em outra configuração, o pino do microcontrolador consome corrente conforme mostrado na Figura 3. A corrente
flui da fonte de alimentação (5V) através da carga e através do pino P0 para o GND. É importante que a carga seja
conectada à mesma linha de fonte de alimentação que o microcontrolador, ou este pode ser destruído.
 
Fonte: EnsineMe
 Figura 3: Microcontrolador consumindo corrente de uma fonte. 
Fonte: EnsineMe.
Os pinos, quando usados com saída, são mais críticos do que quando usados como entrada no sentido de que
dependem muito da proteção de corrente externa. Afinal, seria possível conectar um pino de saída diretamente ao
GND e, em seguida, defini-lo como 1, criando, assim, um curto-circuito.
Embora os controladores tendam a tolerar esses curtos-circuitos por um breve período de tempo (geralmente
menos de um segundo), isso acabará por destruir o circuito de saída desse pino do microcontrolador, até mesmo
inviabilizando o chip. Portanto, o projetista deve garantir que o hardware externo não produza um curto-circuito.
Os microcontroladores, portanto, são dispositivos um tanto delicados, e as linhas de E/S podem carregar apenas
uma quantidade relativamente pequena de corrente. O limite atual dependerá do tipo de microcontrolador e do
pino específico.
Geralmente, haverá uma corrente total máxima que os pinos de uma única porta de 8 bits podem suportar, bem
como um limite para todas as saídas de todo o microcontrolador. Exceder os limites irá destruí-lo . A maioria deles
pode manipular apenas 20 a 25 mA (miliampère). Isso é suficiente para acender um LED, mas os circuitos que
exigem mais corrente devem isolar a carga de corrente mais alta dos pinos de E/S do microcontrolador.
 EXEMPLO
Em aplicações industriais, por exemplo, a maioria dos níveis de fornecimento e lógica ainda estão em + 24V.
Essas tensões maiores são usadas em ambientes operacionais ruidosos onde é necessária alta imunidade a ruído
elétrico para que a interface tolere picos de corrente alta, interferência magnética, descarga estática etc.
Em muitos casos pode haver um fator de 10 em termos de corrente ou tensão entre o microcontrolador e o mundo
industrial. Isso representa um desafio para o projetista de hardware isolar e traduzir o nível de sinal entre os dois
mundos. Significa mudar os níveis lógicos do microcontrolador de tão baixo quanto + 3,3V para + 24V nas saídas
ou na outra direção para as entradas. Para isso, são usados conversores de nível lógico.
PORTAS ANALÓGICAS
Um nível de tensão aplicado a uma porta digital de um microcontrolador será percebido como um valor discreto 0
ou 1.
Por exemplo, para microcontroladores que funcionam com 5V, uma entrada a partir de 2,7V será levada para o
valor lógico 1. Abaixo de 0,7V, como 0. Valores entre 0,7V e 2,7V serão indeterminados, podendo ser percebidos
como 0 ou 1.
Embora isso já seja muito útil, existem situações em que a tensão real da linha transporta informações.
 EXEMPLO
Por exemplo, ao usar um foto-transistor como sensor de luz: a queda de tensão produzida em sua saída é
diretamente proporcional à quantidade de luz que incide sobre o transistor e, para avaliar adequadamente a saída
do sensor, o microcontrolador deve lidar com o valor analógico.
Por outro lado, o microcontrolador é inerentemente digital, portanto, precisamos de meios apropriados para
converter sinais analógicos no mundo digital e vice-versa. Esse problema é resolvido por portas analógicas do
microcontrolador.
Assim, uma entrada analógica é uma entrada que pode ler uma tensão variável, tipicamente de 0 volts até a
tensão máxima que alimenta o próprio microcontrolador.
Portas analógicas também podem ser de saída. Nesses casos, o microcontrolador deve possuir um circuito
chamado conversor digital-analógico (DAC). Esse circuito gera uma tensão em um pino que é proporcional a um
valor digital.
 SAIBA MAIS
Os DACs podem ser usados para acionar pequenos motores ou drivers, que geram correntes mais altas. Eles não
são comuns na maioria das famílias de microcontroladores, por isso uma solução alternativa aos DACs são as
saídas com modulação por largura de pulso (PWM).
PROGRAMANDO E/S DIGITAIS EM
MICROCONTROLADORES
Vamos exemplificar a programação de portas de E/S digitais em dois microcontroladores distintos:
PIC
Em microcontroladores da família PIC usaremos o simulador PicSimLab. Ele funciona a partir do arquivo
executável para o microcontrolador, um arquivo com extensão .hex (hex de hexadecimal) que é gerado na
compilação dos arquivos fonte que iremos mostrar nos exemplos. Então, para gerá-los , teremos que usar um
compilador C para PIC.
Os programas fontes que serão apresentados foram criados para o compilador CCS C, da empresa CSS (Custom
Computer Services), de soluções para microcontroladores PIC. Esse foi um dos primeiros e é um dos melhores
compiladores para iniciantes, pois inclui muitas bibliotecas integradas que permitem programar um
microcontrolador PIC sem profundo conhecimento de sua arquitetura interna. O compilador CCS C é acionado a
partir de uma IDE (Integrated Development Environment ou Ambiente de Desenvolvimento Integrado). O IDE
usado para desenvolver aplicativos embutidos em microcontroladores PIC nos nossos exemplos será o MPLAB.
AVR ATMega
Em microcontroladores da família AVR ATMega, utilizados pela plataforma Arduino, poderemos usar o simulador
online Tinkercad. Os arquivos fonte dos exemplos podem ser compilados e executados no ambiente online do
Tinkercad, que apresentará a simulação de uma placa Arduino Uno diretamente na janela do navegador.
Existem diferenças na forma de configurar os microcontroladores e nas funções usadas em cada família. Essas
diferenças serão uma constante no aprendizado da programação para esses dispositivos.
 ATENÇÃO
É fundamental durante o aprendizado a flexibilidade em se passar de uma plataforma para outra, aprendendo
funções específicas de cada compilador para cada família de microcontrolador.
Isso porque na vida profissional será muito comum o trabalho com diferentes microcontroladores, e estar
familiarizado e com a adaptabilidade para pesquisar e desenvolver códigos para plataformas diferentes será
sempre necessário.
CONFIGURAÇÃO DO MICROCONTROLADOR VIA
SOFTWARE
Como em qualquer projeto − um projeto gráfico, por exemplo −, existem alguns ajustes que devem ser feitos no
início, como dimensões, fundo, cores etc. Esses ajustes são chamadas de configurações, que, idealmente, não
serão alterados até o final.
Da mesma forma, no projeto de software embarcado (firmware), também existem algumas configurações para
cada microcontrolador usadoem todo o projeto.
 EXEMPLO
Por exemplo, o tipo de oscilador do clock (interno/externo), se será utilizado um watchdog ou não; se haverá um
pino de reinicialização ou não, e assim por diante.
WATCHDOG
Peça de hardware que pode ser usada para detectar erros de software.
Essas configurações são controladas por meio de registradores específicos no microcontrolador.
Cada bit nesses registradores controla um recurso específico e, por isso, são frequentemente chamados de bits de
configuração. Alguns compiladores e fabricantes chamam esses bits de fusíveis (fuses).
javascript:void(0)
O CCS C, que usaremos como compilador para PIC, usa a diretiva #fuses para configurar o microcontrolador.
EXEMPLO PARA PIC
O exemplo a seguir pode ser utilizado na placa 1 (MCLAB1) do simulador PicSimLab, que usa um
microcontrolador modelo PIC16F628A, cuja pinagem é mostrada abaixo:
 
Fonte: Jimyxt / Wikimedia / Licença Creative Commons.
 Figura 4: Pinagem do microcontrolador PIC16F628A. 
Fonte: Jimyxt / Wikimedia / Licença Creative Commons.
O código-fonte implementa um contador de acionamentos de um botão (push button) que fecha um contato toda
vez que é apertado. No programa, cada vez que se aperta o botão RA1(PIN_A1) da placa, o valor da variável
contador será incrementado. Esse valor é passado para a porta B do microcontrolador pela função output_b, que
o escreve de forma binária na porta, acendendo os leds em correspondência ao valor.
As primeiras três linhas do programa utilizam diretivas da linguagem. A diretiva #include é bem conhecida na
linguagem C, indicando o uso de uma biblioteca, no caso, a do modelo de microcontrolador PIC que é usado na
placa, o 16F628A. A diretiva #fuses XT configura o microcontrolador para usar o cristal ressonador externo, e a
diretiva #use informa que o clock do microcontrolador será de 4MHz.
#include <16F628A.h> 
#fuses XT 
#use delay( clock=4MHz ) 
 
void main () { 
 
 int contador = 0; 
 int1 btn1; 
 
 while(TRUE) { 
 btn1 = input(PIN_A1 ); 
 
 if (btn1 == 0) { 
 contador++; 
 output_b (contador); 
 delay_ms(500); 
 } 
 } 
}
Dentro da função principal, main(), inicializa-se uma variável contador do tipo int e uma variável btn1 do tipo int1.
Essa é uma forma particular de inicializar uma variável de um único bit, para economizar memória.
A estrutura de repetição while recebe o parâmetro TRUE. Isso diz ao compilador que aquele trecho de código se
processará indefinidamente, o que chamamos de loop infinito. Essa é uma condição sempre encontrada em
programas para microcontroladores. A instrução seguinte, btn1 = input(PIN_A1), verifica se o botão ligado ao pino
RA1 foi apertado.
Veja que a função input recebe o parâmetro PIN_A1 para verificar o estado do pino correspondente no
microcontrolador PIC16F628A (RA1 – pino 18 da figura 4).
Em seguida, a instrução if (btn1 == 0) testa se esse pino está apertado. A montagem dos botões da placa 1
(MCLAB1) do simulador, que configura uma ligação aos pinos RA1, RA2, RA3 e RA4 do microcontrolador, está
conforme a Figura 1a. Ou seja, ao se apertar o botão, o pino é ligado ao GND, indicando o nível lógico 0. Por isso,
se btn1 é igual a 0 (if (btn1 == 0)), a variável contador é incrementada (contador++).
A função seguinte envia o valor do contador para acender os leds na porta B (output_b (contador)), mostrando,
portanto, quantas vezes o botão foi apertado. Em seguida, cria-se um atraso de 500ms (delay_ms(500)) antes de
se voltar a verificar se o botão está apertado.
Criando um projeto no ambiente MPLAB, compilando o código com o CCS C e simulando o código executável
(.hex) na placa 1 do simulador PicSimLab, será possível checar o resultado e fazer outros testes alterando o
código.
EXEMPLO PARA A PLATAFORMA ARDUINO
É possível realizar o mesmo projeto usado na placa 1 (MCLAB1) do simulador PicSimLab no simulador Tinkercad
para a plataforma Arduino.
Para isso, deve-se realizar a montagem do botão de pressão e dos leds conforme o diagrama elétrico mostrado na
figura a seguir. Cada vez que se clica no botão, o valor de um contador deve ser incrementado e passado para a
porta (pinos 0 a 7) onde os leds estão ligados. Estes devem acender para mostrar o valor binário do contador em
cada instante.
 
Fonte: EnsineMe
 Figura 5: Diagrama para montagem do projeto no Tinkercad. 
Fonte: EnsineMe
Vamos analisar o código para realizar o projeto, que deve ser colocado na área de código em texto no simulador.
int contador = 0; 
 
void setup(){ 
 DDRD = B11111111; 
 pinMode(12, INPUT_PULLUP); 
} 
 
void loop(){ 
 if (digitalRead(12) == LOW){ 
 contador++; 
 PORTD = contador; 
 delay(500); 
 } 
}
Nos programas na IDE para Arduino utilizamos com frequência a função pinMode() para definir a direção (entrada
ou saída) pino a pino. Para definir como entrada utilizamos o parâmetro INPUT, e OUTPUT para definir como
saída.
 COMENTÁRIO
No código anterior fizemos isso com o pino 12, onde está ligado o botão, com o parâmetro INPUT_PULLUP, ou
seja, ligando um resistor de pull-up interno do microcontrolador.
Essa função está sendo chamada dentro da função setup(), que na IDE para Arduino é chamada uma única vez no
início do programa, permitindo que se realizem as configurações do microcontrolador.
Mas como definir a configuração de todos os pinos de uma porta de uma só vez? E mais: como escrever o valor
de um contador (incrementado a cada vez que o botão é pressionado) para vários pinos ou uma porta de uma só
vez?
As funções mais utilizadas da IDE do Arduino não ajudam neste cenário. É nesse ponto que precisamos olhar com
mais detalhe o microcontrolador usado no Arduino Uno, o ATMega328.
A figura abaixo mostra a correspondência entre os pinos do microcontrolador e da placa Arduino Uno:
 
Fonte: Ensineme
 Figura 6: Correspondência entre os pinos do microcontrolador ATMega328 e a placa Arduino Uno. 
Fonte: EnsineMe
As saídas digitais 0 a 7 do Arduino (digital pin 0 a digital pin 7) correspondem às portas PDx (PD0 a PD7) do
ATMega328. Os pinos estão agrupados como PORTB (PBx), PORTC (PCx) e PORTD (PDx). Cada porta tem um
correspondente DDR (registrador de direção de dados) que especifica se um pino nessa porta é configurado com
saída ou entrada. Um "1" no bit de um DDR corresponde a uma saída, enquanto um "0", a uma entrada no pino.
Assim, uma instrução de mais baixo nível, que escreve direto no registrador do microcontrolador, é necessária
para realizarmos o código de forma semelhante ao que fizemos para o PIC no exemplo anterior:
DDRD = B11111111;
A instrução DDRD escreve no registrador DDR da porta D o valor binário, onde os oito 1s indicam que todos os
pinos da porta devem ser de saída.
O pino 12, onde está ligado o botão, é lido com a função digitalRead(12). Se essa leitura indicar um nível lógico 0
(LOW), mostra que o botão está pressionado e, assim, o programa deve incrementar a variável contador.
A instrução:
PORTD = contador;
Escreve o valor do contador nos 8 pinos da porta D em valor binário, mostrando, portanto, quantas vezes o botão
foi apertado. A função seguinte cria um atraso de 500ms (delay(500)) antes de voltar a verificar se o botão está
apertado. Esse retorno ao início da função loop() é criado automaticamente pelo compilador da IDE do Arduino,
que cria um loop infinito para as instruções que a integram.
Acompanhe, no vídeo a seguir, uma simulação de comunicação com as portas de entradas e saídas.
VERIFICANDO O APRENDIZADO
1. VOCÊ ESTÁ EM UM PROJETO COM MICROCONTROLADOR E TEM DE ESCREVER
INSTRUÇÕES PARA SABER SE UM BOTÃO FOI PRESSIONADO OU NÃO. UM COLEGA
DE TRABALHO LHE DIZ QUE COLOCOU A ENTRADA DO BOTÃO EM CONFIGURAÇÃO
PULL-DOWN. QUAL TESTE DEVERÁ SER FEITO NO PROGRAMA PARA SABER SE ESSE
BOTÃO BTN FOI PRESSIONADO?
A) if (BTN = 0)
B) if (BTN == 0)
C) if (BTN == 1)
D) if (BTN != 1)
E) if (BTN = 1)
2. O QUE FAZ O PROGRAMA PARA ARDUINO A SEGUIR QUANDO UM LED É LIGADO AO
PINO 13 E OUTRO AOPINO 12?
INT PIN = 12; 
VOID SETUP() 
{ 
PIN = 13; 
PINMODE(PIN, INPUT); 
} 
VOID LOOP() 
{ 
DIGITALWRITE(PIN, HIGH); 
} 
A) Só o led em 12 fica aceso.
B) Só o led em 13 fica aceso.
C) Os dois acendem.
D) Os dois ficam apagados.
E) O led em 13 pisca e em 12 fica aceso.
GABARITO
1. Você está em um projeto com microcontrolador e tem de escrever instruções para saber se um botão foi
pressionado ou não. Um colega de trabalho lhe diz que colocou a entrada do botão em configuração pull-
down. Qual teste deverá ser feito no programa para saber se esse botão BTN foi pressionado?
A alternativa "C " está correta.
 
A configuração pull-down mantém a entrada do microcontrolador em 0 (nível baixo), garantindo que esta vai para 1
(nível alto) quando o botão é pressionado. Dessa forma, o teste na variável BTN, que guarda o estado do botão
para saber se ele foi pressionado, deve verificar se esta é igual a 1 com a instrução if (BTN == 1).
2. O que faz o programa para Arduino a seguir quando um led é ligado ao pino 13 e outro ao pino 12?
int pin = 12; 
void setup() 
{ 
pin = 13; 
pinMode(pin, INPUT); 
} 
void loop() 
{ 
digitalWrite(pin, HIGH); 
} 
A alternativa "D " está correta.
 
Os dois ficam apagados porque, para acender o led, o parâmetro da função pinMode deveria ser OUTPUT,
indicando que vamos escrever um dado no pino correspondente.
MÓDULO 2
 Aplicar conversores analógico-digitais para criação de sistemas de aquisição de dados com
microcontroladores
O QUE É A AQUISIÇÃO DE DADOS?
Com o passar dos anos, o uso de sistemas computadorizados para medir, controlar e testar processos e
equipamentos se tornou a norma. Isso inclui processos nas indústrias de manufatura e automação, processos de
teste e medição em laboratórios de pesquisa, além de uma infinidade de sistemas de monitoração que nos cercam
em nossas casas e ruas das cidades.
 
Fonte: stockphoto-graf/Shutterstock.com
Uma área primordial para esses sistemas é a aquisição de dados, comumente também conhecida como DAQ
(Data Acquisition).
Atualmente, muitos sistemas de aquisição de dados são baseados em computador pessoal (PC) e são capazes
de lidar com uma gama muito ampla de aplicações.
AQUISIÇÃO DE DADOS
A aquisição de dados é definida como o processo geral pelo qual fenômenos do mundo real são capturados
e gravados em formato digital. Em um sistema baseado em PC, o computador executa o software de
aquisição de dados, que processa e registra os mesmos.
Os dispositivos de aquisição de dados podem assumir muitas formas e implementações diferentes. Muitos dos de
entrada do sistema, como os sensores e transdutores, são dispositivos analógicos que geram sinais elétricos.
Nesses casos, o hardware para aquisição de dados deve realizar a conversão de sinais analógicos para digitais. A
maioria desses dispositivos não só incorpora recursos de entrada analógica, mas também inclui disposições para
gerar saídas analógicas, entradas e saídas digitais e várias funções de contagem e temporização.
 COMENTÁRIO
Pela descrição dada, vemos que os microcontroladores mais modernos podem integrar um sistema de aquisição
de dados, pois incorporam os recursos para isso. Vamos tratar da aquisição de dados baseada na conversão
analógica-digital e nas características dos circuitos que a realizam, bem como nas formas de acionar esses
circuitos por meio da programação nos microcontroladores.
CONVERSOR ANALÓGICO-DIGITAL
Se o valor da tensão elétrica for importante para o seu sistema − se quisermos usar um sensor de temperatura
para determinar o aquecimento de um forno, por exemplo −, uma simples entrada digital de um microcontrolador
não é suficiente. Em vez disso, precisamos de uma maneira de representar o valor analógico em formato digital.
Para esse propósito, muitos microcontroladores incluem um conversor analógico-digital (ADC) que converte um
valor de entrada analógica em um valor binário.
A imagem a seguir mostra o princípio básico da conversão analógica-digital. A tensão de entrada analógica, no
intervalo de 0 volts até uma tensão de referência (Vref), é dividido em 2n (2 elevado a n) valores discretos, os
degraus da figura, onde n é o número de bits usados para representar o valor digital. Cada degrau corresponde a
um código digital de 0 a 2n - 1. Cada um dos infinitos valores analógicos será representado por um degrau.
javascript:void(0)
 
Fonte: EnsineMe
 Figura 7: Princípio básico da conversão analógico-digital. 
Fonte: EnsineMe
O valor n fornecerá o número de bits do ADC e definirá a sua resolução.
Os valores típicos para n são 8 ou 10 bits, mas é possível encontrar ADCs de 12 bits ou mais.
A resolução representa a diferença de tensão que pode ser distinguida pelo ADC, sendo igual a Vref/ 2n.
 EXEMPLO
Um ADC de 10 bits que trabalhe com uma tensão de referência de 5 volts terá uma resolução de 5/1024, ou seja,
48,8 mV.
Como é possível ver na Figura 7, no valor de resolução calculado, a conversão introduz algumas imprecisões na
visão do microcontrolador do valor analógico real. Em primeiro lugar, o mapeamento do valor analógico em
degraus resulta em perda de informação no domínio do valor. Flutuações do valor analógico dentro de um degrau
passam despercebidas.
 EXEMPLO
Por exemplo, variações de 20 mV no ADC de 10 bits trabalhando com 5 V são mapeadas para o mesmo código
binário ao microcontrolador.
Naturalmente, essa situação pode ser melhorada reduzindo o valor da resolução, tornando n maior, por exemplo.
Como alternativa, a resolução pode ser melhorada reduzindo o Vref, ao custo de um intervalo de entrada menor.
Outra imprecisão que deve ser considerada na conversão analógica-digital é a referente ao tempo de conversão,
que é diferente de zero.
TEMPO DE CONVERSÃO
O tempo de conversão é o tempo desde o início de uma conversão até que o resultado desta esteja
disponível.
 ATENÇÃO
Em consequência, temos certo período de tempo entre a amostragem de duas conversões sucessivas, resultando
em uma perda de informação no domínio do tempo. As mudanças de valor entre duas conversões são perdidas,
portanto, se o sinal lido varia mais rapidamente que o tempo entre conversões, a sua reconstrução digital será
imprecisa.
O limite superior da frequência de entrada máxima que pode ser amostrado e reconstruído por um ADC é dado
pelo teorema de amostragem segundo o critério de Nyquist. Este afirma que a frequência máxima do sinal de
entrada deve ser menor que a metade da frequência de amostragem, que expressa um intervalo em uma unidade
de tempo ou uma taxa em Hertz.
 EXEMPLO
Um intervalo de amostragem de 1 ms significa que o instrumento faz a amostragem uma vez a cada milissegundo
ou 1000 vezes por segundo. O mesmo instrumento pode ser descrito como uma especificação de taxa de 1 kHz.
É possível facilmente fazer a transição de taxas e intervalos de amostragem tomando o inverso do valor declarado.
Ou seja, uma taxa de amostragem especificada de 1 kHz significa uma amostra a cada 1/1000 segundos, ou um
milissegundo.
 COMENTÁRIO
Independentemente de se ver a amostragem como uma taxa ou um intervalo, deve se tomar cuidado para
escolher as especificações do ADC para corresponder à excursão mais rápida esperada dos sinais que se deseja
medir.
javascript:void(0)
ADCs vêm em várias arquiteturas básicas e existem muitas variações para cada tipo. Assim, diferentes tipos de
equipamentos de teste precisam de tipos diferentes de ADCs. Por exemplo, um osciloscópio digital precisa de alta
taxa de amostragem para a reconstrução mais precisa do sinal, mas pode sacrificar a resolução. Por outro lado, a
amostragem de dados de temperatura precisa de maior resolução, podendo sacrificar a taxa de amostragem.
Quem precisa amostrar a temperatura, com um sensor como um termopar, a uma taxa de 10 kHz (uma
amostragem a cada 100 µS), sendo que esta é uma grandeza de alteração lenta?
ADC DE APROXIMAÇÕES SUCESSIVAS
Um ADC baseado em registrador de aproximação sucessiva é aarquitetura mais popular, com muitas opções
disponíveis, cobrindo uma ampla faixa de resolução e velocidade a um custo acessível.
Esses ADCs modernos estão disponíveis em resoluções de 8–18 bits, com taxas de amostragem de até dezenas
de mega amostras por segundo.
A entrada analógica desse ADC é comparada sucessivamente com a tensão gerada por um conversor digital-
analógico (DAC). A entrada digital para DAC, que fica armazenada no registrador de aproximação sucessiva, é
ajustada de acordo com o resultado de cada comparação. Se o conversor for de n bits, o processo de conversão
requer n comparações, e o resultado da conversão é o valor final armazenado no registrador.
O processo de conversão para esse ADC é o seguinte:
PASSO 1
PASSO 2
PASSO 3
PASSO 1
O bit mais significativo do SAR é definido com valor 1, fazendo com que a saída DAC interno vá para o meio da
escala.
PASSO 2
A saída do decodificador é comparada com o sinal analógico de entrada. Se o sinal analógico for maior que a
saída do DAC, então um 1 lógico é registrado para o bit mais significativo. Se o sinal for menor que a saída DAC, o
valor do bit é substituído por um zero lógico.
PASSO 3
O registrador de aproximação então vai para o próximo bit e tenta a lógica 1 para o mesmo, que define a saída
DAC para a escala ¹⁄� ou escala ³⁄�, que é comparada ao sinal de entrada. Esse processo de comparação é
repetido por n bits até que o sinal seja convertido.
PROGRAMANDO ADCS EM
MICROCONTROLADORES
Para testar os ADCs em microcontroladores, é preciso alterar a tensão de entrada nos pinos correspondentes.
Veremos como fazer isso usando potenciômetros, que trabalham como divisores de tensão − circuitos passivos
simples que aproveitam o efeito da queda das tensões nos componentes conectados em série. Eles são úteis para
fornecer diferentes níveis de tensão a partir de uma tensão de alimentação comum.
 EXEMPLO
Por exemplo, pode-se colocar uma resistência em um circuito e passar uma corrente através dela, de modo que se
possa ver a variação resultante.
Na figura 8, os dois resistores (R1 e R2) estão em série e a tensão de saída (Vsaída), que pode ir para a entrada
ADC do microcontrolador, é proporcional à relação dos resistores. Se eles são iguais, então a tensão de saída é
metade da tensão de entrada (Ventrada).
 
Fonte: EnsineMe
 Figura 8: Divisor de tensão. 
Fonte: EnsineMe
 SAIBA MAIS
O potenciômetro, que é um resistor variável com um contato deslizante, é o exemplo mais básico de um divisor de
tensão, pois podemos aplicar uma tensão em seus terminais e produzir uma tensão de saída em proporção à
posição mecânica de seu contato deslizante.
EXEMPLO PARA A PLATAFORMA ARDUINO
Como já vimos, nem todas as entradas de um microcontrolador têm a capacidade de fazer conversões analógicas
para digitais. Na placa do Arduino Uno são seis entradas, que têm um "A" na frente de sua etiqueta (A0 a A5).
 
Fonte:Shutterstock.com
ADCs podem variar muito em suas especificações entre os microcontroladores. O ADC no Arduino Uno é de 10
bits, o que significa que tem capacidade para detectar 1.024 (210) níveis analógicos discretos. Assim, o ADC do
Arduino Uno com 5 V na sua entrada converte para um valor binário de 1023. Os valores intermediários serão
proporcionais.
A taxa de amostragem em uma placa de Arduino Uno depende, em primeiro lugar, do clock usado. Para um
Arduino de 16 MHz, o clock do ADC é ajustado para 16 MHz/128 = 125 KHz. Cada conversão leva 13 ciclos de
clock do ADC, ou 125 KHz /13 = 9615 Hz. Essa é, portanto, a taxa de amostragem máxima possível. Porém, a
taxa de amostragem real depende do intervalo entre as chamadas de conversões sucessivas.
As principais funções para acionar o ADC na IDE do Arduino são:
analogRead(): Lê o valor do pino analógico especificado.
analogReference(): Configura a tensão de referência usada para entrada analógica, ou seja, o valor usado
como o topo do intervalo de entrada. As opções são:
DEFAULT: a referência analógica padrão de 5 volts (em placas 5 V Arduino) ou 3.3 volts (em placas 3.3 V
Arduino).
INTERNAL: uma referência interna, igual a 1,1 volts no ATmega328P.
EXTERNAL: a tensão aplicada ao pino AREF (apenas 0 a 5 V) é usada como referência.
O código a seguir pode ser testado no simulador Tinkercad com a montagem mostrada na Figura 9. Ele faz a
leitura da entrada analógica A0 da placa Arduino, onde está ligado o terminal central de um potenciômetro. Esse
terminal tem a sua tensão variada entre 5 V e 0 V quando se gira o potenciômetro. Em seguida, o valor lido que
está na variável sensorValor é convertido para o valor de tensão correspondente entre 0 V e 5 V. Esse valor, na
variável tensao, é enviado para o terminal serial do simulador com a função Serial.println(tensao).
void setup() { 
 Serial.begin(9600); 
 } 
 
void loop() { 
 int sensorValor = analogRead(A0); 
 // Converte a leitura analógica (que vai de 0 - 1023) para tensão (0 - 5V): 
 float tensao = sensorValor * (5.0 / 1023.0); 
 Serial.println(tensao); //Envia dado pela porta serial 
}
 
Fonte: EnsineMe
 Figura 9: Diagrama para montagem do projeto no Tinkercad. 
Fonte: EnsineMe
Observe que um simulador de multímetro foi montado no circuito para comparar com o valor convertido e enviado
para o terminal serial, que deve ser o mesmo da leitura do multímetro.
EXEMPLO PARA PIC
PIC16F628
Esse modelo, que é usado na placa 1 do PICSimLab, possui comparadores, não ADC. A saída do comparador é
um sinal digital que indica qual das entradas tem o maior valor. Por não possui ADC, a placa 1 do PicSimLab não
poderá ser usada neste exemplo. Usaremos a placa 4, que possui um modelo de microcontrolador com ADC
interno.
COMPARADORES
Comparador, na linguagem eletrônica, é um dispositivo analógico que compara dois valores de tensão.
PIC18F4550
Vários modelos de PIC possuem ADC. Um deles é o PIC18F4550, que pode ser usado no PicSimLab na placa 4.
O microcontrolador PIC18F4550 possui 13 canais ADC de 10 bits.
Sobre o controle do ADC no compilador CCS C, veja:
REGISTRADORES ASSOCIADOS
Os registradores associados ao controle do ADC no compilador CCS C são:
ADCON0: Usado para ligar o ADC, selecionar a frequência de amostragem e também iniciar a conversão.
ADCON1: Usado para configurar os pinos E/S para o ADC.
ADRESH: Mantém o byte mais alto do resultado do ADC.
ADRESL: Mantém o byte mais baixo do resultado do ADC.
PRINCIPAIS FUNÇÕES
As principais funções para acionar o ADC no compilador CCS C são:
setup_adc( ADC_CLOCK_INTERNAL ): Configura o conversor AD.
setup_adc_ports( AN0 ): Configura as portas usadas pelo conversor AD. No caso, a porta AN0.
set_adc_channel(0): Determina o canal a ser utilizado.
O código que usaremos irá medir a variação de tensão na entrada RA0 da placa 4 do PicSimLab. Ele pode ser
usado para perceber uma variação no potenciômetro 1 da placa 4 do PicSimLab.
javascript:void(0)
 COMENTÁRIO
Veja que os dados são enviados para um mostrador de cristal líquido LCD (Liquid Crystal Display) integrado à
placa, para que possamos ver o resultado da conversão.
A função para acionar o LCD no compilador CCS C é a bem conhecida printf(). Para que ela funcione, é preciso
definir a ligação dos pinos de dados e controle do LCD aos pinos corretos do microcontrolador, conforme a ligação
da placa 4 do simulador. A linha 1 do LCD apresenta a leitura em valor de 0 a 1023 e a linha 2, a tensão
correspondente.
#include < 18F4550.h > 
 #device adc=10 
 #fuses HS, MCLR, NOWDT 
 #use delay(clock=20MHz) 
 
 #define LCD_DB0 PIN_D0 
 #define LCD_DB1 PIN_D1 
 #define LCD_DB2 PIN_D2 
 #define LCD_DB3 PIN_D3 
 #define LCD_DB4 PIN_D4 
 #define LCD_DB5 PIN_D5 
 #define LCD_DB6 PIN_D6 
 #define LCD_DB7 PIN_D7 
 
 #define LCD_E PIN_E1 
 #define LCD_RS PIN_E2 
 
 #include < meu_lcd.c > 
 
 void main () { 
 
 unsigned int16 valor; 
 float tensao; 
 
 lcd_init(); 
 
 setup_adc( ADC_CLOCK_INTERNAL); 
 setup_adc_ports( AN0 ); 
 set_adc_channel(0); 
 
 while(true) { 
 valor = read_adc(); 
 tensao = valor / 1023.0 * 5.0; 
 printf(LCD_PUTC, "\fValor: %lu\n", valor); 
 printf(LCD_PUTC, "Tensao: %f", tensao); 
 delay_ms(100); 
 } 
 }
Assista ao vídeo a seguir e acompanhe uma simulação dos conversores analógico-digitais.
VERIFICANDO O APRENDIZADO
1. O SEU COLEGA DE PROJETO INFORMA QUE PRECISA AMOSTRAR UM SINAL A
CADA 1 ΜS (MICROSSEGUNDO). QUAL O TIPO DE ESPECIFICAÇÃO DO ADC QUE VOCÊ
DEVE PROCURAR E QUAL O VALOR DESSA ESPECIFICAÇÃO?
A) Taxa de amostragem de pelo menos 1 MHz (mega Hertz).
B) Resolução de pelo menos 12 bits.
C) Taxa de amostragem de pelo menos 100 kHz (kilo Hertz).
D) Resolução de pelo menos 1 μs.
E) Intervalo de amostragem de pelo menos 1MHz (mega Hertz).
2. O MICROCONTROLADOR PIC18F4550 É DE 8 BITS E POSSUI ADCS DE 10 BITS.
COMO ELE ARMAZENA OS 10 BITS DO RESULTADO DA CONVERSÃO DO ADC?
A) O resultado é guardado na memória.
B) O resultado é guardado em registrador especial de 10 bits.
C) O resultado é guardado em dois registradores específicos de 8 bits.
D) O resultado é guardado em um só registro em intervalo de tempo diferente.
E) Dois bits do resultado são dispensados.
GABARITO
1. O seu colega de projeto informa que precisa amostrar um sinal a cada 1 µs (microssegundo). Qual o tipo
de especificação do ADC que você deve procurar e qual o valor dessa especificação?
A alternativa "A " está correta.
 
A amostragem de um sinal a cada 1 μs indica o intervalo de amostragem. O inverso do intervalo é a taxa de
amostragem, que é dada em unidade de frequência (Hertz). Para um intervalo de 1 μs (10-6 µS) temos uma
frequência de 1/10-6 ou 106 Hertz, ou seja, 1 MHz.
2. O microcontrolador PIC18F4550 é de 8 bits e possui ADCs de 10 bits. Como ele armazena os 10 bits do
resultado da conversão do ADC?
A alternativa "C " está correta.
 
É comum que microcontroladores precisem guardar informações com mais bits do que os seus registradores
podem guardar, como em conversões analógica-digitais com mais bits em microcontroladores de famílias com
menos. Nesses casos, como o do modelo PIC18F4550, devem existir registradores específicos para guardar os 8
bits menos significativos, e os bits mais significativos que sobrarem, em outro. No caso do PIC18F4550, são os
registradores ADRESL e ADRESH.
MÓDULO 3
 Identificar a importância do uso de temporizadores e contadores para o desenvolvimento de sistemas
de tempo real com microcontroladores
APLICAÇÕES DE TEMPORIZADORES E
CONTADORES
Contadores e temporizadores são provavelmente os periféricos complexos mais comumente usados em um
microcontrolador.
Um temporizador é um dispositivo periférico extremamente comum que pode medir intervalos de tempo.
Ele pode ser usado para gerar eventos em intervalos de tempo específicos ou para determinar a duração entre
dois eventos externos.
 EXEMPLO
Exemplos de aplicações que exigem a geração de eventos incluem manter um semáforo verde por um período
especificado ou comunicar bits em série entre dispositivos em uma taxa específica. Já um exemplo de aplicação
que determina a duração entre eventos é o de calcular a velocidade de um carro medindo o tempo que este leva
para passar por dois sensores separados em uma estrada.
 
Fonte: ktsdesign/Shutterstock.com
Outras aplicações podem incluir medir a rotação do motor de um carro, cronometrar um período de tempo exato −
como o necessário para cronometrar a velocidade de uma bala −, produzir tons para criar música, acionar o
sistema de ignição de um carro ou fornecer uma largura de pulso ou unidade de frequência variável para controlar
a velocidade de um motor.
Um contador é uma versão mais geral de um temporizador.
Em vez de pulsos de clock, conta pulsos em algum outro sinal de entrada. Pode, por exemplo, ser usado para
contar o número de carros que passam por um sensor de estrada ou o número de pessoas que passam por uma
catraca. Muitas vezes combinamos contadores e temporizadores para medir as taxas, como contar o número de
vezes que a roda de um carro gira em um segundo, a fim de determinar a velocidade de um carro.
 ATENÇÃO
Embora esses circuitos sejam usados em dois modos distintos, temporização e contagem, eles são simplesmente
contadores binários. Quando usados no modo de temporização, os contadores binários estão contando períodos
de tempo (pulsos que ocorrem em um sinal de clock de entrada com um período conhecido) aplicados à sua
entrada. No modo de contador eles estão contando os eventos ou pulsos ou algo dessa natureza.
A principal vantagem dos temporizadores e contadores é que eles funcionam de forma independente da CPU do
microcontrolador, e os valores do temporizador podem ser lidos sempre que necessário. Basicamente, um
microcontrolador padrão possui um ou mais módulos de temporizadores de hardware de diferentes comprimentos
em bits.
CONFIGURAÇÕES DOS TEMPORIZADORES E
CONTADORES
Cada temporizador é basicamente um contador que é incrementado ou decrementado a cada ciclo do clock. A
direção (contador para cima ou para baixo) é fixa ou configurável. O valor de contagem atual pode ser lido por
meio de um registrador de contagem e pode ser definido como um valor específico pelo usuário. Para uma
resolução de temporizador de n, o valor da contagem está dentro de [0, 2n - 1].
Deve-se ter cuidado quando o comprimento do temporizador excede o comprimento da palavra do
microcontrolador, por exemplo, ao usar um temporizador de 16 bits em um controlador de 8 bits. Nesse caso, o
acesso ao valor de contagem de 16 bits deve ser feito em duas passagens, o que pode levar a valores
inconsistentes.
 EXEMPLO
Tomemos como exemplo um temporizador com o valor 0x00FF que mudará para 0x0100 no próximo ciclo. Ao ler o
byte superior primeiro e o byte inferior com a próxima instrução, obteremos 0x0000. Se fizermos ao contrário,
acabaremos com 0x01FF, o que não é melhor. Para combater esses problemas, alguns microcontroladores − como
o ATmega16, por exemplo − usam um registrador de buffer para armazenar o byte alto do temporizador. Assim,
sempre que o programa lê o byte inferior do registrador de contagem, o byte superior é simultaneamente
armazenado no buffer e pode ser lido no próximo ciclo.
Em geral, os temporizadores podem gerar uma interrupção sempre que houver um estouro (overflow) do valor de
contagem. Isso pode ser usado para implementar um sinal periódico rudimentar, definindo o valor de contagem
para um determinado valor inicial e, em seguida, aguardando o estouro. No entanto, esse método não fornece um
período preciso porque, após o overflow, o temporizador deve ser configurado para seu valor inicial pelo programa.
Em consequência, o tempo do estouro até o valor inicial ser recarregado no temporizador deve ser considerado e
incorporado ao valor inicial, ou o período será mais longo do que o desejado.
 COMENTÁRIO
Para evitar essa desvantagem, alguns temporizadores fornecem um modo de módulo que recarrega
automaticamente o valor inicial quando o temporizador gerar overflow.
Embora o temporizador geralmente seja cronometrado pela mesma fonte que o próprio microcontrolador, este não
precisa ser o caso. Os microcontroladores podem permitir uma ou mais das seguintes fontes para cronometrar o
temporizador:
RELÓGIO DO SISTEMA (RELÓGIO INTERNO)
Nesse modo, que é o padrão, o temporizador é incrementado a cada ciclo do clock do sistema. O termo “interno”
se refere apenas ao fato de que essa é a fonte de clock que todo o microcontrolador usa. O oscilador responsável
por isso pode muito bem ser externo.
PRESCALER
Esse modo também usa o relógio do sistema, mas filtrado por um prescaler − outro contador de comprimento
variável (8 ou 10 bits são valores típicos), que é incrementado com o clock do sistema. O próprio temporizador,
entretanto, é cronometrado por um dos bits do prescaler. O módulo do temporizador fornecebits de modo que
permitem ao usuário selecionar alguns valores predefinidos (8, 64, 256 etc.) que são usados para dividir a
frequência de entrada.
É importante perceber que, embora o prescaler seja útil para estender o intervalo do temporizador, isso tem o
custo de uma granularidade mais grosseira do mesmo.
Por exemplo, ao usar um temporizador de 8 bits a 1 MHz, seu intervalo será de 255 μs e sua granularidade será
de 1 μs. O mesmo temporizador, com um prescaler de 1024, terá um intervalo de aproximadamente 260 ms, mas
sua granularidade será de apenas cerca de 1 ms. Portanto, um temporizador pré-escalado é capaz de medir
durações mais longas, mas o erro de medição também é maior.
Assim, um temporizador pré-escalado permite que o programa espere por um período de tempo mais longo, mas
quanto maior o valor pré-escalado, menos provável será o cronômetro conseguir esperar precisamente por um
determinado período arbitrário. Como consequência, geralmente é prudente, ao medir as durações, usar o menor
valor do prescaler que se adapte às necessidades da aplicação para obter a melhor granularidade das opções
disponíveis.
PULSO EXTERNO (ACUMULADOR DE PULSO)
Neste modo, o temporizador obtém seu clock de um sinal externo que está conectado a um determinado pino de
entrada do controlador. O temporizador aumenta o seu valor de contagem de acordo com o sinal, por exemplo,
sempre que uma borda ascendente no pino de entrada for observada. Visto que o sinal externo é amostrado como
qualquer outro sinal de entrada, o tempo entre as bordas deve ser maior do que um ciclo de clock do sistema.
CRISTAL EXTERNO (MODO ASSÍNCRONO)
O temporizador é cronometrado por um cristal externo que é conectado a dois pinos de entrada do controlador.
Esse modo é geralmente projetado para um clock de cristal de 32,768 kHz, que pode ser usado para implementar
um clock em tempo real (RTC). O contador é incrementado de acordo com o sinal externo e opera de forma
assíncrona com o resto do microcontrolador.
CAPTURA DE ENTRADA E COMPARAÇÃO DE SAÍDA
O recurso de captura de entrada é usado para registrar a data e a hora (principalmente externos) de eventos, que
podem ser bordas ascendentes e/ou descendentes.
Sempre que o evento ocorre, o temporizador copia automaticamente seu valor de contagem atual para um
registrador de captura de entrada, onde pode ser lido pelo programa.
Ele também define o sinalizador de captura de entrada e pode gerar uma interrupção para notificar a
aplicação de que um evento de captura de entrada ocorreu.
Microcontroladores podem fornecer um ou mais pinos com funcionalidade de captura de entrada.
O recurso de comparação de saída é a contrapartida da captura de entrada. Para o último, o registro de data e
hora é armazenado sempre que algo acontece na linha de entrada. Com a comparação de saída, algo acontece
em uma linha de saída quando um determinado tempo é atingido.
Para implementar esse recurso, o temporizador oferece um registrador de comparação de saída, onde é possível
inserir a hora em que o evento de comparação de saída deve acontecer. Sempre que o valor do contador atinge
esse valor, o evento de comparação de saída é acionado. Ele pode definir ou limpar automaticamente uma linha
de saída ou até mesmo alternar seu estado. Ele também pode não fazer nada e simplesmente gerar uma
interrupção interna.
 ATENÇÃO
A comparação de saída geralmente vem com uma opção para redefinir automaticamente o contador quando o
valor de comparação for alcançado. Isso permite configurar uma interrupção periódica (ou sinal de saída) com um
mínimo de esforço.
CONTADOR/TEMPORIZADOR NOS
MICROCONTROLADORES
No PIC18F4550, existem temporizadores de 8 e 16 bits. O temporizador usa o clock interno como um relógio de
referência, enquanto o contador conta ciclos externos ou pulsos aplicados através dos pinos da porta. O
PIC18F4550 possui quatro temporizadores de hardware: Timer 0, Timer 1, Timer 2, Timer 3. O Timer 2 é de 8 bits,
ou seja, conta de 0 a 255 e todos os outros são de 16 bits, contando de 0 a 65535. O PIC16F628A possui três
temporizadores: Timer 0, de 8 bits; Timer 1, de 16 bits; e Timer 2, de 8 bits.
Os microcontroladores ATmega328 da plataforma Arduino possuem 3 temporizadores: Timer 0, Timer 1 e Timer 2.
Timer 0 e Timer 2 são contadores de 8 bits e o Timer 1 é um contador de 16 bits.
Existem funções da IDE do Arduino que usam temporizadores específicos.
TIMER 0
TIMER 1
TIMER 2
TIMER 0
O Timer 0 é utilizado pelo Arduino Uno para funções como delay(), millis() e micros(). Então, não se deve utilizar
esse temporizador para evitar comprometer essas funções.
TIMER 1
No Arduino Uno esse é o temporizador utilizado pela biblioteca de controle de servos. Caso não esteja utilizando
essa biblioteca, esse temporizador está livre para ser utilizado para outros propósitos.
TIMER 2
Esse temporizador é utilizado pela função tone(). Então, caso não precise da função tone(), esse temporizador
está livre para outras aplicações.
PROGRAMANDO TEMPORIZADORES EM
MICROCONTROLADORES
TEMPORIZADORES E INTERRUPÇÃO NO PIC
Os microcontroladores, de forma geral, executam o programa sequencialmente, instrução após instrução.
Uma interrupção é um evento que para a execução do programa e chama uma função para tratar a parada.
Após o fim dessa função, a execução normal do programa é retomada de onde parou. Os temporizadores podem
ser configurados para, quando atingirem o valor máximo da contagem (overflow), gerarem uma interrupção e
chamarem uma função específica.
Para calcular o tempo entre interrupções com precisão, utiliza-se também um prescaler, a parte que divide a
frequência de oscilação do clock de um microcontrolador. O tempo da interrupção é calculado da seguinte forma:
 Atenção! Para visualização completa da equação utilize a rolagem horizontal
Onde o período depende se o contador é de 8 bits (período = 256) ou 16 bits (65536). O ciclo de máquina depende
do microcontrolador. Em geral é de 1/4 do clock.
O programa abaixo pode ser usado na placa 1 do PicSimLab com o PIC16F628A.
#include <16F628A.h> 
#fuses XT, MCLR, NOWDT 
#use delay(clock=4MHz) 
 
int cont = 0; 
 
#INT_TIMER0 
void interrupcao_t0() { 
 clear_interrupt(INT_TIMER0); 
 if (cont == 1000) { 
 output_toggle(PIN_B1); 
 cont = 0; 
 } 
 cont++; 
} 
 
void main() { 
 
 enable_interrupts(GLOBAL); 
Tempo de interrupção  =  prescaler  *  período  *  ciclo de máquina
 enable_interrupts(INT_TIMER0); 
 
 setup_timer_0(T0_INTERNAL | T0_DIV_1); 
 
 while (true) { 
 output_toggle(PIN_B0); 
 delay_ms(1000); 
 } 
}
Observe que existem dois leds piscando. Um, na saída RB0, usa a função delay_ms, já utilizada antes. O outro,
em RB1, está piscando baseado na interrupção do timer 0.
A diretiva #INT_TIMER0 define que a função a seguir (void interrupcao_t0) é chamada no overflow do contador do
timer 0. Ela limpa a interrupção (clear_interrupt(INT_TIMER0)) para permitir que a próxima seja chamada. Veja que
ela usa um contador adicional de 1000 para acender ou apagar o led em RB1.
Na função main temos a habilitação das interrupções e da interrupção do timer 0. A função setup_timer_0
configura o timer 0 com o clock interno e sem prescaler (T0_DIV_1). Esse valor pode dividir o clock interno em
valores de 2, 4, 8, 16, 32, 128 e 256. Como o período é 256, o prescaler é 1 e ciclo de máquina de 1 μs (¼ do
clock de 4 MHz), o intervalo entre interrupções nesse caso é igual a 256us. Com o contador adicional de 1000
utilizado para acender ou apagar o led em RB1, o led piscará em intervalo de 256 μs x 1000, ou seja, 256 ms.
 COMENTÁRIO
O uso das funções, específicas para cada microcontrolador em cada IDE, torna o hardware de baixo nível
ocultado. O acesso aos registradores não é mostrado e muitas vezes usamos funções com temporizadores sem o
conhecimento desses registradores.
TEMPORIZADORES E INTERRUPÇÃO NO ARDUINO
Conforme foi visto, muitas funções do Arduino usam temporizadores,como as funções de tempo: delay () e millis
(). Não é comum o uso de interrupção por overflow do timer no Arduino. Embora existam algumas bibliotecas,
feitas por terceiros, que podem ajudar na tarefa, em geral, para realizar interrupção por timer, é necessário acessar
os registradores do microcontrolador ATmega328.
O exemplo a seguir mostra esse acesso para piscar o led L da placa Arduino Uno sem usar função de atraso
(delay).
Observe o acesso aos registradores do microcontrolador para realizar a tarefa simples de piscar o led a cada
segundo. Porém, esse código não ocupa a CPU com funções de atraso. Outras funções de monitoração e controle
poderiam ser executadas, o que é uma grande vantagem.
#define ledPin 13 
 
void setup() 
{ 
 pinMode(ledPin, OUTPUT); 
 
 // Configuração do timer1 
 TCCR1A = 0;//configura timer para operação normal. Pinos OC1A e OC1B desconectados 
 TCCR1B = 0; //limpa registrador 
 TCCR1B |= (1<<CS10)|(1 << CS12); // configura prescaler para 1024: CS12 = 1 e CS10 = 1 
 
 TCNT1 = 0xC2F7; // inicia timer com valor para que overflow ocorra em 1 segundo 
 // 65536-(16MHz/1024/1Hz) = 49911 = 0xC2F7 
 
 TIMSK1 |= (1 << TOIE1); // habilita a interrupção do TIMER1 
} 
 
void loop() 
{ 
 //loop principal livre para outras tarefas. A manipulação do led é feita na interrupção. 
} 
 
ISR(TIMER1_OVF_vect) //interrupção do TIMER1 
{ 
 TCNT1 = 0xC2F7; // Reinicia TIMER 
 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //inverte estado do led 
}
Assista ao vídeo a seguir e acompanhe uma simulação de temporizadores e contadores.
VERIFICANDO O APRENDIZADO
1. EM UM PROGRAMA PARA MICROCONTROLADORES PIC, DESEJA-SE CRIAR UMA
INTERRUPÇÃO PARA APAGAR OU ACENDER UM LED A CADA 2 SEGUNDOS USANDO
TEMPORIZADOR. SABE-SE QUE O CICLO DE MÁQUINA É DE 0,5US, O PERÍODO É DE
65536 E O VALOR DO PRESCALER É DE 1. QUAL DEVE SER O VALOR X NO CÓDIGO A
SEGUIR, QUE MOSTRA A ROTINA DE INTERRUPÇÃO DO TIMER FEITA NO CCS C?
#INT_TIMER0 
VOID INTERRUPCAO_T0() { 
CLEAR_INTERRUPT(INT_TIMER0); 
IF (CONT == X) { 
OUTPUT_TOGGLE(PIN_B1); 
CONT = 0; 
} 
CONT++; 
} 
A) 2
B) 4
C) 33
D) 61
E) 123
2. FOI SOLICITADO A VOCÊ UM PROGRAMA PARA MICROCONTROLADOR QUE
VERIFICA O NÚMERO DE PULSOS ELÉTRICOS DE TENSÃO ADVINDOS DE UM
DETECTOR DE RADIAÇÃO A CADA SEGUNDO, O QUE CORRESPONDE A UMA TAXA DE
RADIAÇÃO. QUAL/QUAIS CIRCUITO(S) INTERNO(S) AO MICROCONTROLADOR VOCÊ
DEVE UTILIZAR PARA REALIZAR A TAREFA?
A) Contador
B) Temporizador
C) Contador e temporizador
D) Prescaler e temporizador
E) Delay e contador
GABARITO
1. Em um programa para microcontroladores PIC, deseja-se criar uma interrupção para apagar ou acender
um led a cada 2 segundos usando temporizador. Sabe-se que o ciclo de máquina é de 0,5us, o período é de
65536 e o valor do prescaler é de 1. Qual deve ser o valor X no código a seguir, que mostra a rotina de
interrupção do timer feita no CCS C?
#INT_TIMER0 
void interrupcao_t0() { 
clear_interrupt(INT_TIMER0); 
if (cont == X) { 
output_toggle(PIN_B1); 
cont = 0; 
} 
cont++; 
} 
A alternativa "D " está correta.
 
Tempo entre chamadas de interrupção = prescaler * período * ciclo de máquina. Logo, Tempo de interrupção =
1*65536*(0,5*10-6)s = 32,768*10-3s. Com isso, para completar 2 segundos, X deve ser 2/32,768*10-3, ou X
aproximadamente 61.
2. Foi solicitado a você um programa para microcontrolador que verifica o número de pulsos elétricos de
tensão advindos de um detector de radiação a cada segundo, o que corresponde a uma taxa de radiação.
Qual/quais circuito(s) interno(s) ao microcontrolador você deve utilizar para realizar a tarefa?
A alternativa "C " está correta.
 
O contador pode ser usado, nesse caso, para contar os pulsos do detector. Mas, para termos a taxa de radiação,
ou seja, o número de pulsos provenientes do detector de radiação por unidade de tempo, precisamos também de
um temporizador que determine esse intervalo de tempo. O temporizador pode, então, ao final do intervalo de
tempo especificado, gerar uma interrupção que chamará uma função para calcular a taxa. Veja que os dois
circuitos podem funcionar de forma independente da CPU.
MÓDULO 4
 Esquematizar o uso da Modulação por Largura de Pulso (PWM) para o controle de dispositivos
externos
SISTEMA ELETRÔNICO
De forma geral, um sistema eletrônico simples consiste em uma entrada, um processo e uma saída, com a variável
de entrada para o sistema e a variável de saída do sistema sendo ambos sinais elétricos. Nele, existe um processo
que transforma um sinal em outro para dar a resposta desejada a ele.
No caso de um sistema eletrônico baseado em processamento por microcontrolador, esses sinais de entrada e
saída podem ser, como vimos, digitais ou analógicos.
Uma saída analógica é necessária para atuar em dispositivos que são acionados por níveis de tensão com
variação contínua. Examinaremos dispositivos que são acionados dessa forma e como um microcontrolador pode
acioná-los.
MOTOR DC
Podemos exemplificar um sistema eletrônico simples com o acionamento de um motor DC (direct current (Que
trabalha com corrente contínua.) ) em resposta ao apertar de um botão. O termo "motor DC" é usado para se
referir a qualquer máquina elétrica rotativa que converte energia elétrica de corrente contínua em energia
mecânica.
 VOCÊ SABIA
Eles podem variar em tamanho e potência, desde pequenos motores em brinquedos e eletrodomésticos até
grandes mecanismos que acionam veículos, puxam elevadores e acionam laminadores de aço.
Mas como funcionam os motores DC?
 RESPOSTA
Os motores DC incluem dois componentes principais: um estator e uma armadura. O estator é a parte estacionária
de um motor, enquanto a armadura gira. O primeiro componente fornece um campo magnético giratório que aciona
a rotação do segundo.
Um motor DC simples usa um conjunto estacionário de ímãs no estator e uma bobina de fio com uma corrente
passando por ele para gerar um campo eletromagnético alinhado com o centro da bobina. Um ou mais
enrolamentos de fio isolado são enrolados ao redor do núcleo do motor para concentrar o campo magnético.
Os enrolamentos do fio isolado são conectados a um comutador (uma chave rotativa elétrica), que aplica uma
corrente elétrica aos enrolamentos. O comutador permite que cada bobina da armadura seja energizada por sua
vez, criando uma força de rotação constante (conhecida como torque).
Quando as bobinas são ligadas e desligadas em sequência, um campo magnético giratório é criado e interage com
os diferentes campos dos ímãs estacionários no estator para criar torque, o que faz com que ele gire. Esses
princípios operacionais fundamentais dos motores DC permitem que eles convertam a energia elétrica da corrente
contínua em energia mecânica por meio do movimento de rotação, que pode então ser usada para a propulsão de
objetos.
 
Fonte: Abnormaal/Wikimedia commons
 Figura 10: motor DC. 
Fonte: Abnormaal/Wikimedia commons
APLICAÇÕES DE MOTORES DC
Graças aos diferentes tipos de motores DC disponíveis, há uma grande variedade de aplicações, conforme
mencionamos anteriormente. Em casa, pequenos motores DC são usados em ferramentas, brinquedos e diversos
eletrodomésticos. No varejo, as aplicações incluem transportadores e plataformas giratórias, enquanto em um
ambiente industrial, grandes motores DC também incluem aplicações de freio e reversão.
A seguir, estão alguns usos mais específicos para motores DC:
MOTORES DC PARA VENTILADORES
Embora tradicionalmente usem motores AC (corrente alternada), há um número crescente de ventiladores de teto
com motor DC chegando ao mercado. Eles estão ganhando popularidade porque são muito mais econômicos do
que seus equivalentes AC. A única desvantagem real para o ventilador do motor DC é seu custo, mas a economia
de energia pode compensar isso.
MOTORES DC PARA BOMBAS
As bombas hidráulicas são ferramentas industriais essenciais, usadas em quase todas as indústrias, incluindo:construção, mineração, manufatura e aço. Os motores DC são usados para alimentar essas bombas devido ao
seu fácil controle de velocidade variável e excelente resposta.
MOTORES DC PARA BRINQUEDOS
Essa é uma escolha popular para fabricantes e amadores, com esses "motores de brinquedo" frequentemente
usados em brinquedos infantis, como carros de controle remoto e modelos de trens. Pequenos motores DC
funcionam bem nesta configuração, pois são fáceis de usar e extremamente robustos.
MOTORES DC PARA CARROS ELÉTRICOS
Embora haja uma variedade de tipos de motores diferentes usados em carros elétricos, os motores DC são
amplamente utilizados devido à sua eficiência energética e durabilidade. Além de fabricantes profissionais, muitos
amadores e fabricantes de kits de carros preferem motores DC grandes para seu torque inicial mais alto.
MOTORES DC PARA ROBÔS
Um robô é qualquer dispositivo eletromecânico projetado para realizar uma tarefa específica. Nesse caso, os
motores DC são usados para "acionar" algo, como esteiras, braços ou câmeras, sendo particularmente populares
nessa área de robótica por possuírem alto torque e eficiência.
MOTORES DC PARA BICICLETAS
As bicicletas elétricas, populares porque não exigem licença, usam um motor DC compacto embutido na roda
traseira ou dianteira, ou montado no centro da bicicleta e conectado à roda dentada do pedal. Para garantir os
níveis de potência e o torque necessários, os motores DC sem escovas são normalmente os usados.
ACIONAMENTO DE MOTORES DC COM PWM
Se um motor DC funciona com corrente contínua e sua velocidade é proporcional a esta, conclui-se que podemos
controlar a velocidade desse motor usando a saída de um microcontrolador onde seja possível controlar o nível de
tensão contínua. Essa saída é de um conversor digital-analógico (DAC), que é mais raro em microcontroladores.
Uma saída de modulação por largura de pulso (pulse width modulation ou PWM), porém, é muito comum.
 ATENÇÃO
PWM é o esquema no qual o ciclo de trabalho (duty cicle) de uma onda quadrada é variado para fornecer uma
saída contínua variável, filtrando a forma de onda de saída real para obter um valor médio. O modo de modulação
por largura de pulso é um caso especial de comparação de saída. Nele, o temporizador gera um sinal de saída
digital periódico com tempo e período configuráveis.
Como é mostrado na figura abaixo, variando o ciclo de trabalho (percentual do ciclo que é alto ou ON), varia-se a
tensão contínua média da forma de onda. A forma de onda é então usada para controlar dispositivos analógicos,
criando um conversor digital para analógico (DAC).
 
Fonte: Thewrightstuff
 Figura 11: Esquema do PWM. 
Fonte: Thewrightstuff/Wikimedia commons/Licença Creative Commons
A realização interna do PWM é bastante simples e usa apenas o contador e duas comparações. Nos compiladores
para microcontroladores com pinos de saída PWM, existem funções específicas que permitem ao programador
controlar o percentual de tempo em nível alto, controlando, assim, o valor médio da tensão contínua nessa saída.
A potência aplicada ao motor pode ser controlada variando a largura desses pulsos aplicados e, assim, variando a
tensão DC média aplicada aos terminais dos motores. Alterando ou modulando o tempo desses pulsos, a
velocidade do motor pode ser controlada, ou seja: quanto mais tempo o pulso estiver “ON”, mais rápido o
motor irá girar e, da mesma forma, quanto mais o pulso estiver “OFF”, mais lento o motor vai girar.
Em outras palavras, quanto maior a largura do pulso, mais tensão média aplicada aos terminais do motor, mais
forte será o fluxo magnético dentro dos enrolamentos da armadura e mais rápido o motor irá girar.
PROGRAMANDO PWM EM MICROCONTROLADORES
SAÍDAS COM PWM EM MICROCONTROLADORES DA
PLATAFORMA ARDUINO
Dos 14 pinos de E/S do Arduino Uno, 6 podem ser usados como saídas PWM. A função analogWrite() é usada
para este fim, controlar o ciclo de trabalho nessas saídas. Essa função recebe dois parâmetros: o primeiro é o pino
a ser controlado e o segundo é a quantidade de tempo que o pino permanecerá no nível alto (ON). A figura abaixo
mostra exemplos de ciclo ativo (ciclo de trabalho ou duty cycle) que podem ser atribuídas às saídas PWM dos
pinos 3, 5, 6, 9, 10 e 11 do Arduino UNO, com a função analogWrite(). A frequência dos pulsos é fixa em 490Hz.
 
Fonte: EnsineMe
 Figura 12: Atuação da função analogWrite() na IDE do Arduino. 
Fonte: EnsineMe
Um exemplo de motor DC acionado por pressionar um botão é mostrado na Figura 13. Na montagem, realizada no
simulador Tinkercad, um motor DC é ligado ao pino 10 e ao terra (GND) de uma placa Arduino UNO. Um botão de
pressão liga o pino 6 ao GND quando acionado.
 
Fonte: EnsineMe
 Figura 13: Montagem no Tinkercad para acionamento de um motor DC. 
Fonte: EnsineMe
O código para processar o acionamento do motor ao se pressionar o botão é mostrado a seguir:
void setup() // Executado apenas uma vez 
{ 
 pinMode(10, OUTPUT); 
 pinMode(6, INPUT_PULLUP); 
} 
void loop() 
{ 
 if (digitalRead(6) == LOW){ 
 analogWrite(10, 255); 
 } 
 else{ 
 analogWrite(10, 0); 
 } 
}
 ATENÇÃO
Veja que é necessário colocar o modo do pino de entrada do botão (pino 6) em INPUT_PULLUP para garantir que,
quando o botão não estiver pressionado, o nível lógico será 1 (HIGH).
O código em loop apenas verifica se o pino 6 está ligado ao GND, isto é, se o botão está pressionado (LOW no
pino 6). Caso esteja, a função analogWrite() manda o valor 255 para o pino 10, o que significa enviar um nível DC
constante, ou seja, máxima tensão para o motor DC e máxima velocidade. É um bom exercício criar uma variação
no programa que permita alterar a velocidade entre 0, 25%, 50%, 75% e 100% ao se pressionar o botão.
SAÍDAS COM PWM EM MICROCONTROLADORES PIC
No modelo PIC18F4550, somente o Timer 2 pode ser usado para geração de PWM. Este é um registrador de 8
bits que é utilizado para armazenar a contagem, usado como base de tempo para a modulação PWM
A frequência de saída pode ser calculada por:
 Atenção! Para visualização completa da equação utilize a rolagem horizontal
O prescaler do Timer 2 pode ser 1, 4 ou 16.
PR2 é carga do Timer 2, que também é chamado de período, podendo ser de 0 a 255.
Considerando a utilização de um cristal de 4 Mhz, temos que um PR2 de 124 fornece uma frequência de 500 Hz.
 Atenção! Para visualização completa da equação utilize a rolagem horizontal
Com esses valores, é possível configurar a frequência do PWM com a seguinte função no compilador CCS,
configurando o Timer 2:
setup_timer_2(T2_DIV_BY_16, PR2, 1);
Onde o primeiro parâmetro ajusta o prescaler para 16, o segundo passa o valor PR2 (124 para 500 Hz) e o terceiro
é um poscaler, mantido no valor padrão 1.
O ciclo de trabalho ou duty cycle pode ser configurado pela função set_pwm1_duty(DC), onde DC deve ter o valor:
 Atenção! Para visualização completa da equação utilize a rolagem horizontal
Onde P é o valor percentual desejado para duty cycle.
O código a seguir pode ser usado na placa 4 do PicSimLab, que possui a ventoinha ligada no pino RC1 do
PIC18F4550, uma das duas saídas que podem ser usadas como PWM nesse microcontrolador. É possível criar
uma variação no programa que permita alterar a velocidade do motor.
PWM  Freq   =  
Frequência do Cristal
(PR2 + 1) * (Prescaler do Timer 2) * 4
= = 500Hz4 MHz
(124 + 1) * 16 * 4
4.000.000
16.384
DC  =  (PR2 + 1)  * 4 * (P/100)
#include <18F4550.h> 
#fuses XT, MCLR, NOWDT 
#use delay(clock=4MHz) 
 
void main() { 
 
 unsigned int16 P; 
 unsigned int16 PR2; 
 unsigned int16 DC; 
 PR2 = 124; 
 P = 50; // 50% de duty cycle ou metade da máxima potência 
 
 setup_timer_2(T2_DIV_BY_16, PR2, 1); 
 setup_ccp1(CCP_PWM); 
 
 DC = (unsigned int16)((PR2 + 1) * 4 * (P/100.0)); 
 set_pwm1_duty(DC); 
 
 while(true) { 
 } 
}
Os exemplos mostrados nos simuladores para Arduino e PIC indicam um acionamento direto dos motores pelo
pino dosmicrocontroladores com função PWM. Porém, para a maioria dos motores, o acionamento não poderá ser
feito diretamente devido às limitações no valor de corrente que um microcontrolador possui. Se quisermos
controlar motores DC usando microcontroladores, precisamos de algo conhecido como driver de motor.
Eles atuam como uma interface entre os motores e os circuitos de controle. O motor, em geral, requer mais
quantidade de corrente do que o microcontrolador pode dispor em seus pinos. Portanto, a função dos drivers de
motor é pegar um sinal de controle de baixa corrente e transformá-lo em um sinal de corrente mais alta que pode
acionar um motor DC. Dessa forma, existem diversos drivers que devem se adequar ao motor e ao
microcontrolador.
Drivers específicos podem ser usados para permitir que se use um microcontrolador para controle de cargas
maiores de outros tipos, como resistências de aquecimento de um forno, motores de passo, servo motores,
acionamento pneumático e diversos outros tipos atuadores.
Assista ao vídeo a seguir e acompanhe uma simulação do uso de modulação por largura de pulso (PWM).
VERIFICANDO O APRENDIZADO
1. QUAIS DAS AFIRMAÇÕES A SEGUIR ESTÃO CORRETAS COM RELAÇÃO A PWM? 
 
I - PWM É UM SINAL DE FREQUÊNCIA CONSTANTE. 
II – CICLO DE TRABALHO É A RAZÃO ENTRE O TEMPO DE DURAÇÃO DA ONDA
LIGADA E O PERÍODO DO SINAL PWM. 
III – UM PWM DE FREQUÊNCIA MENOR PERMITE UM CICLO DE TRABALHO MAIOR.
A) I e II.
B) I e III.
C) II e III.
D) Somente I.
E) Somente II.
2. PARA QUE PODE SER USADO UM SINAL PWM? 
 
I − PARA CONTROLAR UM BRAÇO DE ROBÔ. 
II − PARA CONTROLAR A VELOCIDADE DE UMA BICICLETA ELÉTRICA. 
III – PARA CONTROLAR A VAZÃO COM BOMBAS HIDRÁULICAS. 
 
ESTÁ(ÃO) CORRETO(S) O(S) ITEM(N)S:
A) I, II e III.
B) Somente II.
C) II e III.
D) I e III.
E) I e II.
GABARITO
1. Quais das afirmações a seguir estão corretas com relação a PWM? 
 
I - PWM é um sinal de frequência constante. 
II – Ciclo de trabalho é a razão entre o tempo de duração da onda ligada e o período do sinal PWM. 
III – Um PWM de frequência menor permite um ciclo de trabalho maior.
A alternativa "A " está correta.
 
A modulação por largura de pulso, o PWM, trabalha variando o tempo de sinal ativo (ligado) em relação ao inativo
(desligado). Assim, quanto maior o tempo ligado em relação ao tempo desligado, maior é o ciclo de trabalho. 100%
de ciclo de trabalho significa o sinal sempre ligado, fornecendo potência máxima à uma carga externa. 50% de
ciclo de trabalho significa o sinal metade do tempo ligado e metade desligado, fornecendo uma potência que a
metade da máxima a uma carga externa. A frequência do sinal não se altera durante a operação, o que significa
que o tempo total do sinal ligado mais o seu tempo desligado permanece o mesmo, independentemente do ciclo
de trabalho.
2. Para que pode ser usado um sinal PWM? 
 
I − Para controlar um braço de robô. 
II − Para controlar a velocidade de uma bicicleta elétrica. 
III – Para controlar a vazão com bombas hidráulicas. 
 
Está(ão) correto(s) o(s) item(n)s:
A alternativa "A " está correta.
 
As aplicações mencionadas possuem motores DC com acionadores de movimento, portanto, a modulação por
largura de pulso, PWM, pode ser usada em todas elas.
CONCLUSÃO
CONSIDERAÇÕES FINAIS
Neste tema, discutimos os tipos mais comuns de periféricos internos dos microcontroladores, considerando suas
aplicações em sistemas de monitoração e controle. Exemplificamos como programá-los em microcontroladores da
família PIC e da plataforma Arduino e, por fim, mostramos como testar esses códigos em simuladores.
AVALIAÇÃO DO TEMA:
REFERÊNCIAS
MONK, S. Programação com Arduino: começando com sketches. 1. ed. Porto Alegre: Bookman, 2017.
OLIVEIRA, A. S. de; ANDRADE, F. S de. Sistemas embarcados: hardware e firmware na prática. 1. ed. São
Paulo: Érica, 2010.
PECKOL, J. K. Embedded systems: a contemporary design tool. 1. ed. Nova Jersey: Wiley, 2019.
ZANCO, W. da S. Microcontroladores PIC18 com Linguagem C: uma abordagem prática e objetiva. São Paulo:
Érica, 2010.
EXPLORE+
Para saber mais sobre os assuntos tratados neste tema, leia:
Projeto e desenvolvimento de um medidor digital de energia elétrica monofásico para aplicações residenciais,
de Bruno Raniere Araújo Diniz, Artur Almeida Evangelista e Auzuir Ripardo de Alexandria.
A plataforma Arduino e suas aplicações, de Eduardo Ferroni et al.
CONTEUDISTA
Marcos Santana Farias
 CURRÍCULO LATTES
javascript:void(0);

Outros materiais