Senai Arduino
Senai Arduino
Senai Arduino
ELETRÔNICA
UNIDADE
3
DESAFIO 2
APRESENTAÇÃO
3
DOCUMENTAÇÃO
No desafio 1 elaboramos um programa para realizar uma atividade simples de leitura e escrita
em portas digitais. Como você pode imaginar, a quantidade de variáveis e de instruções em um
programa costuma ser bem maior do que nos programas que elaboramos até agora, tornando cada
vez mais difícil a programação e a depuração de erros.
Para organizar e registrar a tarefa de programação e facilitar a depuração de erros devemos utilizar
uma ferramenta chamada fluxograma. Um fluxograma indica as etapas de uma determinada tarefa
como, por exemplo, a sequência de gravação de um programa qualquer em um microcontrolador,
que pode ser representada pelo fluxograma, a seguir.
Como você pôde ver, as etapas de um fluxograma indicam o passo-a-passo de uma tarefa.
Importante!
Provavelmente, você já deve ter estudado, em disciplinas de informática, sobre as fases de resolução
de problemas em computação. Vamos resgatar essas informações para você relembrá-las.
Análise de
Programa
Desenho do
Algoritmo
Codificação
Compilação
e Execução
Verificação
Depuração
Manutenção
Documentação
4
Note que, na segunda fase, o desenho do algoritmo retrata a maneira mais adequada de trabalhar
para alcançar o sucesso em nossos desafios.
Portanto, o fluxograma é uma representação gráfica de um algoritmo, cujos símbolos seguem uma
representação normatizada. Você pode ver, a seguir, algumas dessas formas.
5
2. DECLARAÇÃO DE ENTRADAS E SAÍDAS
6
3. PROCEDIMENTO LOOP()
7
Para compreender melhor o fluxograma do exemplo, acesse o simulador do projeto luzes veiculares
e compare o funcionamento do programa com o fluxograma.
Agora que você resgatou informações importantes sobre o fluxograma, não se esqueça de elaborá-
los para os próximos desafios.
8
CONVERSOR A/D
Portanto, para utilizar o conversor A/D do Arduino Due, é importante que você conheça as
particularidades do conversor presente no microcontrolador SAM3X. É o que estudaremos, a
seguir.
9
CONVERSOR A/D DO MICROCONTROLADOR SAM3X
O microcontrolador SAM3X, que equipa o Arduino Due, possui um conversor A/D de até 12 bits.
A figura a seguir, indica as portas que podem ser utilizadas com o conversor A/D (portas AD0 à
AD14).
• Resolução de 12 bits;
• Taxa de conversão de 1 MHz;
• Single Ended selecionável ou por diferencial de tensão de entrada;
• Ganho programável para ampla faixa de entrada, entre 0 – VDD;
• Multiplexador integrado que permite mais de 16 entradas analógicas independentes;
• Enable e Disable individual para cada canal;
• Sincronismo por Hardware ou Software;
• Pino de sincronismo externo;
• Saídas Timer Counter (equivalentes às de sincronismo TIOA);
• Linha de eventos PWM;
• Drive para falta de entrada PWM;
• Suporte a PDC;
• Possibilidade de configuração dos temporizadores do conversor AD;
• 2 modos Sleep e sequenciador de conversão;
• Wakeup automático com sincronismo e retorno ao modo Sleep após a conversão de todos os
canais habilitados;
• Possibilidade de sequenciamento de canais customizada;
• Mode Standby para uma rápida resposta de Wakeup;
• Capacidade de Power Down;
• Janela de comparação automática de valores convertidos;
• Registradores com proteção contra escrita.
10
Para compreender melhor o funcionamento do conversor A/D do SAM3X, é preciso conhecer
mais detalhes sobre as principais características.
FUNCIONAMENTO
11
O conversor A/D se conecta com um canal PDC (Peripheral DMA Controller) e esta
integração, por meio de ciclos de latência e sequenciamento da conversão, contribui para
reduzir tanto o consumo de energia como a intervenção do processador.
Internamente, no conversor A/D, um conjunto de tensões de referência é gerado a partir
de um único nó de tensão de referência externo que pode ser igual à tensão de alimentação
analógica. Uma capacitância externa de desacoplamento será necessária para filtragem
de ruído. Um circuito de correção de erro digital, com base no algoritmo multi-bit
RSD (Redundant Signed Digit), é utilizado a fim de reduzir erros INL (Integral Non-
linearity) e DNL (Differential Non-linearity). Finalmente, o usuário pode configurar os
temporizadores do conversor A/D, tais como o Startup Time e o Tracking Time.
O conversor A/D usa seu clock interno para executar as conversões. A conversão de um
único valor analógico para um digital de 12 bits requer vários ciclos de monitoramento
do clock, tal como definido no campo TRACKTIM, em ADC mode register (página
1333 do datasheet do SAM3X) e outros ciclos de clock para transferência, como definido
no campo TRANSFER do mesmo registro.
A frequência de clock do conversor A/D é selecionada no campo PRESCAL do Mode
Register (ADC_MR). A fase de monitoramento é iniciada durante a conversão do canal
anterior. Se este tempo for maior do que o tempo de conversão, a fase se estende para o
final da conversão que a precede.
A faixa de clock do conversor A/D está entre MCK/2, se PRESCAL for igual a 0,
e MCK/512, se PRESCAL for igual a 255 (0xFF). O valor de PRESCAL deverá ser
programado de forma a proporcionar uma frequência de clock do conversor A/D de
acordo com os parâmetros indicados na seção de características elétricas do produto no
datasheet do SAM3X.
Alguns projetos avançados necessitam deste conhecimento e você pode acompanhar e
discutir no link.
12
ADC PRESCALER
O conversor A/D necessita de alguns pulsos de clock para fazer a conversão. Os pulsos
são gerados pelo clock do sistema que é dividido, sucessivamente, até obter a frequência
necessária. Para funcionar, o conversor A/D necessita de uma frequência entre 1 e 22
MHz. Quanto maior a frequência, mais rápida é a conversão. Por outro lado, frequências
menores proporcionam conversões mais precisas. A frequência do sistema pode ser
definida com qualquer valor definido pelo usuário (usando osciladores internos ou
externos). O clock do sistema pode ser dividido por 1, 2, 3*, 4, 16, 32, 64, sempre definido
pelo Prescaler (campo PRES com default em 1).
Saiba mais...
CANAIS
O conversor A/D do SAM3X tem 12 canais, o que significa que você pode tirar doze
amostras de sinais em diferentes portas, ou seja, você pode conectar até doze sensores
diferentes e obter os seus valores separadamente.
Saiba mais...
13
ENTRADAS E SAÍDAS ANALÓGICAS
Como vimos no desafio anterior, o Arduino Due possui 12 entradas e 2 saídas analógicas,
identificadas como Ax e DACx, respectivamente (de modo que x indica o número da entrada/
saída).
É importante lembrar que as portas analógicas também podem funcionar como portas
digitais, dependendo da configuração indicada no software. Por outro lado, as portas
digitais não podem ser utilizadas como analógicas, portanto, quando for escolher as
portas que pretende utilizar no Arduino Due, certifique-se de que esteja utilizando as
mais adequadas para o seu projeto, evitando o uso de portas dedicadas sem necessidade.
14
COMO CONFIGURAR UMA ENTRADA ANALÓGICA
No Arduino, essa configuração é feita pela instrução pinMode(), que estudamos no desafio anterior.
Portanto, para utilizar uma porta como entrada analógica, basta configurá-la como entrada, do
mesmo modo que fizemos no desafio anterior. Significa dizer que, no Arduino, não é necessário
indicar se a porta será digital ou analógica, basta configurá-la como entrada ou como saída.
Acompanhe um exemplo:
Opcionalmente, você também pode configurar a resolução do conversor por meio da instrução
analogReadResolution(). O parâmetro da instrução indica a resolução desejada. Se você não
configurar a resolução, o valor padrão de 8 bits será utilizado.
Saiba mais...
15
COMO CONFIGURAR UMA ENTRADA ANALÓGICA
O Arduino utiliza uma função chamada analogRead() para iniciar a conversão e obter o valor
digital equivalente à tensão da entrada requisitada.
O microcontrolador demora cerca de 100 microssegundos (0,0001 s) para ler uma entrada analógica,
então, a taxa máxima de leitura será de 10.000 vezes por segundo, aproximadamente.
Importante!
A função analogRead() possui apenas um parâmetro, que é o número da porta que você deseja fazer
a conversão. A função retornará um valor numérico inteiro, que corresponde ao valor convertido.
O valor pode ser carregado em uma variável. Acompanhe um exemplo:
Saiba mais...
Dica...
16
EXEMPLO DE PROGRAMAÇÃO (POTENCIÔMETRO E LED COM
CONVERSOR A/D)
Imagine que você necessita ler uma tensão por meio de uma entrada analógica e sinalizar o valor
lido, de algum modo. Podemos fazê-lo à partir de um potenciômetro, simulando um dispositivo
ou sensor que forneça uma tensão entre 0 e 3,3 V (limitação do modelo Due). Este programa de
exemplo lê a tensão na entrada analógica A0 e mantém um Led aceso por um tempo proporcional
ao valor retornado da função analogRead. Acompanhe o fluxograma e o programa de exemplo:
Fluxograma:
17
Programa:
O que ocorre se modificarmos o segundo delay, quando ledout está em LOW, para (1023-van)?
Simule com números inteiros entre 0 e 1023 e note a mudança nos tempos do Led.
Pronto! Agora você pode copiar o trecho do programa e colar no software Arduino. Salve com
um nome à sua escolha. O arquivo salvo estará na pasta com o mesmo nome acompanhado da
extensão.ino.
Saiba mais...
Você pode saber mais sobre as funções e comandos usados neste exemplo em:
http://www.arduino.cc/en/Reference/Setup
http://www.arduino.cc/en/Reference/Loop
http://www.arduino.cc/en/Reference/DigitalWrite
http://www.arduino.cc/en/Reference/Delay
http://www.arduino.cc/en/Reference/PinMode
http://playground.arduino.cc/Code/Potentiometer
Você já pensou em como ficaria a ligação física do exemplo com a placa Arduino Due? No desafio
1 já fizemos o cálculo do resistor externo, em série com o Led. Se você deseja apenas testar a
programação, pode usar o Led L, interno, já que a programação utiliza o pino 13. A figura, a seguir,
traz um exemplo de ligação do Led no Arduino Due.
18
Se desejar, você pode verificar o funcionamento do programa de exemplo no simulador disponível
em seu ambiente virtual de aprendizagem.
19
CONVERSOR D/A
Um conversor D/A faz o caminho inverso do conversor A/D. Imagine um CD de músicas. Como
você sabe, as músicas são gravadas no formato digital, e as informações são interpretadas por um
software. Depois da conversão, o resultado será o som, no formato analógico.
Um conversor D/A converte um número preciso, abstrato e finito (geralmente um número binário
de ponto fixo) em uma quantidade física real. Em outras palavras, cada número binário será
convertido para um nível de tensão equivalente, compatível com a tensão de referência e com a
resolução (quantidade de bits) de conversor.
No caso do CD, como você pode imaginar, o intervalo entre cada unidade digital forma uma
lacuna, criando uma espécie de degrau entre cada amostra da conversão. Para compor o sinal
analógico é preciso preencher essas lacunas, e para isso são utilizadas técnicas de interpolação de
sinais.
A figura, a seguir, é um exemplo de interpolação de um sinal digital (em vermelho) para um sinal
analógico (em cinza).
É importante que você saiba que nem todas as aplicações exigem a interpolação do sinal. Significa
dizer que, em alguns casos, as lacunas entre as amostras não afetam no funcionamento da aplicação.
20
CONVERSOR D/A
O microcontrolador SAM3X, que equipa o Arduino Due, possui um conversor D/A de até 12 bits.
A figura, a seguir, indica as portas que podem ser utilizadas com o conversor D/A (portas DAC0,
DAC1 e DATRG).
O conversor D/A do SAM3X possui as seguintes características:
• Resolução de 12 bits;
• Tensão de trabalho entre 2 e 3,6 V;
• Comunicação com velocidade de até 1 Msps (1.000.000 de amostras por segundo);
• Função sleep;
• Trigger configurável: interno ou externo.
Para compreender melhor o funcionamento do conversor D/A do SAM3X, é preciso conhecer mais
detalhes sobre as principais características.
FUNCIONAMENTO
O controlador do conversor D/A (DACC) utiliza o clock mestre (MCK) dividido por
dois para realizar as conversões. Este relógio é nomeado DACC clock. Uma vez que uma
conversão é iniciada, o DACC leva 25 períodos de clock para fornecer o resultado da
conversão no canal de saída analógica selecionada.
No modo de funcionamento livre (free running), a conversão começa assim que um dos
canais é habilitado. Nesse instante, os dados são gravados no registrador de dados DACC
e, 25 períodos de clock mais tarde, os dados convertidos estão disponíveis na respectiva
saída analógica escolhida. No modo por disparo externo, espera-se a primeira borda de
subida para iniciar o processo de conversão.
21
CANAIS
O conversor D/A do SAM3X tem 2 canais, o que significa que você pode obter dois sinais
diferentes, um em cada porta.
Saiba mais...
22
COMO CONFIGURAR UMA SAÍDA ANALÓGICA
Do mesmo modo que ocorre com o conversor A/D, a porta do conversor D/A pode ser configurada
com a instrução pinMode(), mas essa configuração é opcional, pois a instrução que escreve na
saída analógica não requer o uso da pinMode(). De qualquer modo, se por algum motivo você
precisar configurar a porta antes, pode utilizar a instrução pinMode() sem problemas.
Para configurar uma porta como saída por meio da instrução pinMode(), basta informar, nos
parâmetros da instrução, o número da porta e o texto OUTPUT. O exemplo, a seguir, ilustra a
configuração da porta 66 como saída.
Opcionalmente, você também pode configurar a resolução do conversor por meio da instrução
analogWriteResolution(). O parâmetro da instrução indica a resolução desejada. Se você não
configurar a resolução, o valor padrão de 8 bits será utilizado. Acompanhe um exemplo de como
configurar a resolução para 12 bits:
Importante!
23
COMO ESCREVER EM UMA SAÍDA ANALÓGICA
O Arduino utiliza uma instrução chamada analogWrite() para iniciar a conversão e disponibilizar
a tensão analógica equivalente ao valor digital informado.
A instrução analogWrite() possui dois parâmetros, sendo um para informar a porta em que o sinal
será disponibilizado e outro para informar o valor digital que você deseja converter para analógico.
Acompanhe um exemplo:
É importante lembrar que o valor informado no segundo parâmetro deve ser compatível
com a resolução configurada, ou seja, se o conversor estiver no modo padrão, de 8 bits, o
valor máximo permitido será 255.
24
EXEMPLO DE PROGRAMAÇÃO (POTENCIÔMETRO E LED COM
CONVERSOR D/A)
No exemplo anterior, controlamos o tempo de acendimento de um Led com base na tensão de uma
porta analógica, proveniente de um potenciômetro. Na medida que aumentávamos a tensão na
porta A/D, o Led piscava mais rapidamente.
Agora, vamos manter a leitura da porta A/D do mesmo modo, com o potenciômetro, mas ao invés
de variar o intervalo de acendimento, vamos controlar o brilho do Led. O controle do brilho será
feito por meio de um conversor D/A. Acompanhe o fluxograma e o programa de exemplo:
Fluxograma:
25
Programa:
A figura, a seguir, indica as ligações do potenciômetro e do Led no Arduino Due para o exemplo
que acabamos de ver.
26
DESAFIO 2
Bom trabalho!
RECAPITULANDO