Escolar Documentos
Profissional Documentos
Cultura Documentos
ELABORADO POR:
ANDRÉ ROCHA, N.º 1130809
DOCENTE:
ENG.º RUI BRITO
Índice
Introdução ..................................................................................................................................... 2
Hardware/Esquema ...................................................................................................................... 3
Condensador de desacoplamento ............................................................................................ 3
Botão de Reset do microcontrolador ........................................................................................ 4
LED............................................................................................................................................. 4
Potenciómetro .......................................................................................................................... 4
Software ........................................................................................................................................ 5
IDE e programador .................................................................................................................... 5
Código do microcontrolador ..................................................................................................... 5
Descrição da solução apresentada ............................................................................................ 6
Linguagem Assembly ......................................................................................................... 9
Fluxogramas .................................................................................................................. 9
Código.......................................................................................................................... 11
Linguagem C .................................................................................................................... 13
Fluxogramas ................................................................................................................ 13
Código.......................................................................................................................... 15
Conclusão .................................................................................................................................... 16
Bibliografia .................................................................................................................................. 18
Índice de Figuras
Figura 1 - Esquema do circuito utilizado ....................................................................................... 3
Figura 2 - Esquema de ligação do programador ........................................................................... 5
Figura 3 – Versão 1 - Fluxograma do programa principal ............................................................. 9
Figura 4 – Versão 1 - Fluxograma da interrupção TC0 .................................................................. 9
Figura 5 – Versão 1 - Fluxograma interrupção ADC .................................................................... 10
Figura 6 – Versão 2 - Fluxograma do programa principal .......................................................... 13
Figura 7 – Versão 2 - Fluxograma da interrupçãoTC0 ................................................................ 13
Figura 8 – Versão 2 - Fluxograma da interrupção ADC ............................................................... 14
Introdução
O trabalho realizado enquadra-se no âmbito do estudo da disciplina de Laboratório de
Sistemas, tendo como objetivo a implementação de um sistema com recurso a um
microcontrolador capaz de fazer a aquisição de um sinal analógico convertido para um valor
digital com oito bits. O sistema deve também ser capaz de controlar um actuador por PWM e,
em simultâneo, gerar uma onda quadrada de 1 Hz.
Foram desenvolvidos dois códigos, isto é, duas versões de código que produzem o mesmo
resultado, ainda que em linguagens diferentes, sendo a primeira em Assembly e outra em
linguagem C, de forma a confrontar o modo de implementação em cada uma.
No sentido de desenvolver competências no âmbito da implementação prática, o sistema
físico (hardware) foi montado em placa de testes (breadboard) e foi utilizado um
microcontrolador ATMEGA328p.
Hardware/Esquema
Foram utilizados diversos componentes, de acordo com o esquema da figura abaixo.
O sistema foi implementado com recurso a placa de testes (breadboard), sendo utilizado o
microcontrolador ATMEGA328p, com cristal externo de 16𝑀ℎ𝑧.
Ainda que, na prática, se tenha recorrido a uma fonte de alimentação de 5V, no caso de utilizar
um regulador de tensão, conforme o esquema apresentado, seria fornecida uma tensão entre
9 a 12𝑉, obtendo na saída os 5𝑉 necessários para alimentar o circuito do microcontrolador. O
LED à saída do regulador serve para ter uma informação visual de que o circuito se encontra
alimentado. No restante circuito serão de destacar os aspetos abaixo abordados.
Condensador de desacoplamento
À entrada do microcontrolador foi usado um condensador de 100𝑛𝐹 para desacoplamento. O
circuito digital consome corrente por picos, não havendo constância da mesma. Assim,
utilizando o condensador na sua entrada melhora a estabilidade do funcionamento do
microcontrolador, atenuando as oscilações entre os sinais lidos e emitidos. Por outro lado,
diminui a emissão de ruídos eletromagnéticos para o circuito restante (admitindo um circuito
mais complexo, em que existissem mais circuitos na mesma rede).
LED
De acordo com o datasheet dos LED utilizados, estes possuem corrente de condução 𝐼𝐹 =
20𝑚𝐴 e tensão 𝑉𝐹 = 1,65𝑉 (típica de 1,65𝑉 e máxima de 2,0𝑉). Considerando que a
resistência elétrica do LED, quando polarizado diretamente, é muito baixa, é importante
limitar a corrente que passa pelo mesmo. Nesse sentido, é utilizada uma resistência em série,
cujo dimensionamento impede que haja dano no LED. Portanto, considerando a corrente de
condução do mesmo e que o ramo em que está inserido será alimentado por uma tensão de
5𝑉, calculou-se o valor da resistência a inserir no ramo de acordo com:
5,0 − 1,65
𝑅𝑠é𝑟𝑖𝑒 = = 335Ω
20 ∙ 10−3
( )
2
Potenciómetro
O potenciómetro de 10kΩ foi utilizado para fazer a variação da tensão à entrada do pino
ADC0, por via do divisor de tensão do seu ponto médio, conforme o esquema apresentado.
Software
IDE e programador
Para o desenvolvimento do código a implementar no microcontrolador ATMEGA328p, foi
utilizado o ambiente de desenvolvimento Atmel Studio 7. Adicionalmente, recorreu-se à placa
de desenvolvimento do Arduino para efetuar a programação via USB-Serial, conforme o
esquema abaixo ilustrado.
Código do microcontrolador
Foram efetuados 2 códigos (Assembly e C). Os códigos foram classificados de acordo com a
seguinte estrutura:
Versão 2: Linguagem C.
16 ∙ 106
𝑓𝑂𝐶0𝐴 = ≅ 976,56𝐻𝑧
64 ∙ 256
Desta forma, considerando que o período é o inverso da frequência, ajustando o valor do
contador de 500ms, obtém-se:
1
𝑇𝑂𝐶0𝐴 = ≅ 1024𝜇𝑠
976,56
500 ∙ 10−3
𝑇500𝑚𝑠 = ≅ 488
1024 ∙ 10−6
Por outro lado, tendo em conta o objetivo deste trabalho e considerando que a modulação da
onda de saída no pino OC0A é controlada pelo valor constante no registo OCR0A, o mais
adequado será usar o “Clear OC0A on Compare Match”, no “Compare Output Mode”, de modo
a que a comparação do OCR0A, no nível mínimo, garante que se mantém a saída no nível
lógico baixo.
TCCR0A
7 6 5 4 3 2 1 0
FOC0A FOC0B COM0B1 COM0B0 WGM01 WGM00
0 0 0 0 1 1
TCCR0B
7 6 5 4 3 2 1 0
COM0A1 COM0A0 WGM02 CS0[2:0]
1 0 0 0 1 1
TIMSK0
7 6 5 4 3 2 1 0
OCIEB OCIEA TOIE
0 0 1
OCR0A
7 6 5 4 3 2 1 0
OCR0A[7:0]
0 0 0 0 0 0 0 0
𝑇𝑜𝑛
O controlo da razão cíclica (𝐷 = 𝑇
) é feito com recurso a um potenciómetro, que fará variar
a tensão à entrada do conversor ADC0 (pino 23 – PC0), tendo como referência a tensão AVCC
(REFS0=1 e REFS1=0).
Neste trabalho, como são utilizados 8 bits respeitantes ao resultado da conversão, alinhou-se à
esquerda (ADLAR = 1), rejeitando os 2 bits menos significativos. Aproveitando esse facto e uma
vez que há uma nova ordem de conversão a cada interrupção de overflow do TC0 (500𝑚𝑠),
não se vislumbrou haver necessidade de efetuar o tratamento da leitura, dado que o registo
OCR0A possui o mesmo número de bits, permitindo fazer cópia direta entre os registos.
De acordo com o datasheet do ATMEGA328p, para que seja conseguida a máxima resolução
do conversor AD de 10 bits, a frequência do sinal de relógio (𝑓𝑐𝑙𝑘𝐴𝐷𝐶 ) deve estar compreendida
entre 50𝐾ℎ𝑧 e 200𝐾ℎ𝑧. Ainda que se pretenda conversões de 8 bits, considerando esta regra,
calculou-se o fator de divisão de clock de acordo com:
𝑓𝑐𝑙𝑘 16 ∙ 106
𝐹𝑎𝑡𝑜𝑟 𝑑𝑒 𝑑𝑖𝑣𝑖𝑠ã𝑜 = = = 128
𝑓𝑐𝑙𝑘𝐴𝐷𝐶 125 ∙ 103
Assim que terminar a conversão é ativada a flag (ADIF) de interrupção, sendo que como no
registo de status está ativado o I-bit, pelo que há um salto para o vetor de interrupção “ADC
Conversion Complete” (0x002A). Na interrupção é copiado o valor de ADCH para OCR0A, de
forma a que a alterar a razão cíclica, variando dessa forma a tensão média fornecida ao LED e,
por consequência, a potência a este fornecida em cada período. Imediatamente a seguir é
reposta a configuração inicial do ADC, sendo este desligado, o que permite tornar o sistema
mais eficiente, uma vez que este só será ligado quando necessário.
Por fim, importa referir que grande parte do tempo de execução das instruções referentes às
interrupções diz respeito à leitura do ADC. Conforme referido no fluxograma, de um total de
207,30𝜇𝑠 de execução das instruções, 205,50𝜇𝑠 correspondem ao tempo necessário para o
ADC efetuar a conversão.
Linguagem Assembly
Fluxogramas
Código
; EX02.C LINGUAGEM ASSEMBLY
;
; CREATED: 01/10/2017 21:31:01
; AUTHORS: ANDRE ROCHA 1130809@ISEP.IPP.PT
; DANIEL VIEIRA 1161365@ISEP.IPP.PT
.include "m328Pdef.inc"
.cseg
.org 0x0000
rjmp init
.org 0x0020 // VETOR DE INTERRUPCAO TIMER0 OVERFLOW
rjmp TCNT0_OVF
.org 0x002A // VETOR DE INTERRUPCAO ADC COMPLETO
rjmp ADC_DONE
// INICIALIZACOES
init:
ldi r16, low(RAMEND) // INICIALIZAR A STACK
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
cbi DDRC, 0 // CONFIGURAR PC0 (ADC0) COMO ENTRADA (APENAS PARA FICAR EVIDENTE)
// TIMER 0
// F_PWM = 16E6 / (14 x 256) = 976,56 HZ
// T_PWM = 976,56^-1 = 1024 US
// 1024 US x 488 = 499,71 MS = ~500 MILISSEGUNDOS
ldi r16, 0b10000011 // MODO FAST PWM (MODE 3) CLEAR ON COMPARE MATCH
Out TCCR0A, r16
// ADC0
ldi r16, 0b01100000 // AVCC, ALINHADO A ESQ, CANAL 0
sts ADMUX, r16
// CODIGO MAIN
main:
jmp main
// INTERRUPCAO ADC0
ADC_DONE:
lds r16, ADCH // GUARDAR VALOR DO ADCH
out OCR0A, r16 // ALTERAR VALOR DO PWM
// INTERRUPCAO TC0
TCNT0_OVF:
ldi r16, 0b11001111 // LIGAR ADC E INICIAR A CONVERSAO
sts ADCSRA, r16
dec r17
// CONTADOR DE TEMPO
tcnt:
ldi r17, 244 // REINICIAR VALOR CONTADOR R17
dec r18
breq toggle // SE R18 = 0, FAZ TOGGLE AO LED
reti // CASO CONTRARIO VOLTA AO CICLO
Linguagem C
Fluxogramas
Código
/*
EX02.C LINGUAGEM C
// CONSTANTES
#define LED1 32 // LED 1HZ
#define LED2 64 // LED PWM
// BIBLIOTECAS
#include <avr/io.h>
#include <avr/interrupt.h>
// VARIAVEIS
volatile unsigned int ctd_500ms = 488; // VARIAVEL PARA CONTAR 500MS
// PROTOTIPOS DE FUNCOES
void init(void);
int main(void)
{
init();
while (1);
}
ISR (TIMER0_OVF_vect)
{
ctd_500ms--;
if (ctd_500ms == 0)
{
void init(void)
{
DDRB = LED1; // DEFINIR O PB5 COMO SAIDA
PORTB = 0; // INICIALIZAR O LED1 COMO DESLIGADO
// CONFIGURACAO DO ADC
// AVCC, ALINHADO A ESQ, CANAL 0
ADMUX |= (1<<REFS0) | (1<<ADLAR);
// ADEN = 0, DIVISOR DE FREQ 128
ADCSRA |= (0<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
Conclusão
A implementação do sistema de sensores e atuadores impôs que fossem avaliadas várias
possibilidades para a sua execução, sendo que se conclui que a opção de utilizar apenas o
Timer TC0 para gerar a base tempo de funcionamento do programa, bem como para gerar a
onda quadrada de largura variável (PWM), se revelou acertada. Por um lado, são poupados
recursos, uma vez que se utilizou apenas um temporizador. Por outro, o código desenvolvido
tornou-se bastante simples e intuitivo.
Considerando que uma parte deste trabalho (geração de onda quadrada a 1𝐻𝑧 para o LED)
seria semelhante ao trabalho anterior e, dada a simplicidade da utilização do AD, em termos
da utilização das linguagens Assembly e C, não houve diferenças significativas. Nesse sentido, o
código desenvolvido aproveita essa base, sendo bastante semelhante ao anteriormente
apresentado, apenas acrescendo o controlo da leitura do AD e da saída do atuador.
Bibliografia
LABSI – Nuno Dias, Eletrónica Geral;
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard.