Você está na página 1de 99

GUSTAVO GARCIA DOS REIS

APLICABILIDADE DE MICROCONTROLADORES DA
FAMÍLIA STM32 NO CÁLCULO DE PARÂMETROS DE
SINAIS ANALÓGICOS

Londrina
2011
GUSTAVO GARCIA DOS REIS

APLICABILIDADE DE MICROCONTROLADORES DA
FAMÍLIA STM32 NO CÁLCULO DE PARÂMETROS DE
SINAIS ANALÓGICOS

Trabalho de Conclusão de Curso


apresentado ao Departamento de
Engenharia Elétrica da Universidade
Estadual de Londrina.

Orientador: Prof. Dr. Walter Germanovix.

Londrina
2011
GUSTAVO GARCIA DOS REIS

APLICABILIDADE DE MICROCONTROLADORES DA FAMÍLIA


STM32 NO CÁLCULO DE PARÂMETROS DE SINAIS ANALÓGICOS

Trabalho de Conclusão de Curso


apresentado ao Departamento de
Engenharia Elétrica da Universidade
Estadual de Londrina.

BANCA EXAMINADORA

____________________________________
Prof. Dr. Walter Germanovix
Dept. de Engenharia Elétrica
Orientador

____________________________________
Profa. MSc. Juliani Chico Piai
Dept. de Engenharia Elétrica

____________________________________
Prof. MSc. Osni Vicente
Dept. de Engenharia Elétrica

Londrina,___de___________de 2011.
Dedico este trabalho ao meu pai, mãe
e irmã.
AGRADECIMENTOS

Agradeço aos meus pais, Adelcir Theodoro dos Reis e Lucinéia


Garcia dos Reis, pelo esforço incondicional que realizaram para que eu chegasse
até aqui.

Ao meu avô, Antônio Garcia Filho, e avó, Cezira Vertuan Garcia,


pelos exemplos de vida que são, aos quais dedico este trabalho com a mais
profunda admiração, respeito e gratidão.

Ao meus tios, José Antônio Gazarini e Marilene Garcia Gazarini,


pelo apoio na contribuição da minha formação profissional.

Ao meu orientador, Prof. Dr. Walter Germanovix, pela


compreensão, dedicação, capacidade de orientação e incentivo.

Ao meu professor Décio Luiz Gazzoni Filho cujas notas de aula


e parte do projeto de sua disciplina foram utilizadas no desenvolvimento deste
trabalho.

Aos meus familiares e amigos, pela confiança que depositaram


em mim.

E aos meu colegas de curso, Edivaldo Gomes Junior e Raul


Ambrozio Valente Neto, que contribuiram para o avanço deste trabalho.

iv
“A mente que se abre a uma nova idéia
jamais voltará ao seu tamanho
original.” (Albert Einstein)

v
REIS, Gustavo Garcia. Aplicabilidade de microcontroladores da família STM32
no cálculo de parâmetros de sinais analógicos. 2011. 86 páginas. Trabalho de
Conclusão de Curso (Graduação em Engenharia Elétrica) – Universidade Estadual
de Londrina, Londrina, 2011.

RESUMO

O projeto de sistemas eletrônicos embarcados teve um crescente aumento devido


ao melhor desempenho obtido, à evolução dos processos de fabricação de
semicondutores, que tem permitido integrar um maior número de transistores em
uma pequena pastilha de silício, e à considerável queda do custo de
microcontroladores. Este trabalho desenvolve uma metodologia para o uso de
microcontroladores no cálculo de freqüência, razão cíclica e amplitude de sinais
elétricos, sendo estes parâmetros variáveis pelo usuário. Para isso, é feito um
comparativo dos circuitos típicos geradores de funções utilizando amplificadores
operacionais, com a nova geração de circuitos integrados que perfazem essa
função. O microcontrolador utilizado é o STM32F103RB (da ST Microelectronics)
com núcleo ARM Cortex-M3. Este é responsável por calcular a freqüência, razão
cíclica e amplitude dos sinais, além de fornecer tais valores em quatro displays de
sete segmentos. De um lado, projeta-se o circuito eletrônico no qual o
microcontrolador está inserido, e do outro se escreve um software que interfaceia
com este hardware por meio de periféricos do microcontrolador.

Palavras-chave: GPIOs. Temporizador. Conversor A/D.

vi
REIS, Gustavo Garcia. Aplicability of STM32 microcontroller in the calculation of
parameters of analog signals. 2011. 86 páginas. Trabalho de Conclusão de Curso
(Graduação em Engenharia Elétrica) – Universidade Estadual de Londrina, Londrina,
2011.

ABSTRACT

The design of embedded electronic systems had an increasing because of better


performance obtained, the evolution of semiconductor manufacturing processes that
has allowed to include increasing amounts of transistors on a small silicon wafer, and
the considerable drop in the cost of microcontrollers. This paper develops a
methodology for the use of microcontrollers in the calculation of frequency, duty cycle
and amplitude of electrical signals, which are variable parameters by the user. For
this, a comparison is made of typical circuits function generators using operational
amplifiers, with the new generation of integrated circuits that perform this function.
The microcontroller used is the STM32F103RB (ST Microelectronics) with ARM
Cortex-M3 core. This is responsible for calculating the frequency, duty cycle and
amplitude of the signals and provides these values in four seven-segment displays.
On the one hand, the electronic circuit is designed to insert the microcontroller, and
the other a software is written to interface with this hardware through the
microcontroller peripherals.

Key words: GPIOs. Timer. Conversor A/D.

vii
LISTA DE FIGURAS

Figura 2.1 – Estrutura básica de uma porta de GPIO. ...................................................... 4


Figura 2.2 – Diagrama de blocos do periférico DMA. ........................................................ 8
Figura 2.3 – Diagrama de temporização do contador com mudança de divisão do
prescaler de 1 para 2. ................................................................................................... 15
Figura 2.4 – Diagrama de temporização do contador com mudança de divisão do
prescaler de 1 para 4. ................................................................................................... 16
Figura 2.5 – Diagrama de temporização do contador para cima, clock interno dividido
por 1. ................................................................................................................................ 17
Figura 2.6 – Diagrama de temporização do contador para baixo, clock interno
dividido por 1. ................................................................................................................. 17
Figura 2.7 – Diagrama de temporização do contador (modo center-aligned), clock
interno dividido por 1, TIMxARR = 0x6. ..................................................................... 18
Figura 2.8 – Estágio de entrada do temporizador. ........................................................... 19
Figura 2.9 – Circuito principal do temporizador. ............................................................... 20
Figura 2.10 – Estágio de saída do temporizador.............................................................. 20
Figura 2.11 – Contagem do timer para cálculo da razão cíclica. ................................... 22
Figura 2.12 – Modo de comparação de saída do temporizador. ................................... 23
Figura 2.13 – Operação do periférico de comparação de saída em modo PWM. ...... 24
Figura 2.14 – Bloco de entrada do conversor A/D. .......................................................... 27
Figura 2.15 – Tela inicial do Rowley Crossworks. ............................................................ 29
Figura 2.16 – O programador JTAG Olimex ARM-USB-TINY. ...................................... 30
Figura 3.1 – Gerador de ondas quadrada e triangular com Amp Op LM324. ............. 32
Figura 3.2 – Saídas V0 e V’0 do circuito gerador de funções que correspondem às
ondas quadradas e triangular, respectivamente. ..................................................... 33
Figura 3.3 – Circuito gerador de ondas utilizando CI XR-2206...................................... 34
Figura 3.4 – R versus freqüência de oscilação. ................................................................ 35
Figura 3.5 – Tensão de saída como uma função do resistor R3 colocado no pino 3. 35
Figura 3.6 – Diagrama de blocos do CI XR-2206. ........................................................... 36
Figura 3.7 – CI XR-2206. ...................................................................................................... 37
Tabela 3.2 – Descrição dos pinos do CI XR-2206. .......................................................... 37
Figura 3.8 – Circuito atenuador utilizando o CI LM324 com realimentação negativa.38
Figura 3.9 – Kit de desenvolvimento Olimex STM32-P103. ........................................... 39
Figura 3.10 – Fluxograma descrevendo metodologia para o cálculo de freqüência e
razão cíclica. ................................................................................................................... 43
Figura 3.11 – Detector de pico. ........................................................................................... 44
Figura 3.12 – Configurações do microcontrolador para o cálculo da amplitude do
sinal. ................................................................................................................................. 45
Figura 4.1 – Sinais de saída V0 (onda quadrada) e V’0 (onda triangular) referentes ao
circuito da Figura 3.1. .................................................................................................... 49
Figura 4.2 – Tensão pico a pico do sinal triangular. ........................................................ 50
Figura 4.3 – Variação da razão cíclica da onda quadrada. ............................................ 51
Figura 4.4 – Sinal de saída quadrado em baixa freqüência. .......................................... 54
Figura 4.5 – Sinal de saída quadrado em freqüência maior........................................... 55
Figura 4.6 – Sinal de saída senoidal com freqüência e amplitude pequenas. ............ 56
Figura 4.7 – Sinal de saída senoidal com freqüência e amplitude maiores................. 57
Figura 4.8 – Sinal de saída triangular com freqüência e amplitude baixas. ................ 58
Figura 4.9 – Sinal de saída triangular com freqüência e amplitude maiores. .............. 58
viii
Figura 4.10 – Sinal de saída do circuito atenuador comparado ao sinal de entrada. 60
Figura 4.11 – Valor de freqüência calculado pelo microcontrolador. ............................ 61
Figura 4.12 – Outro valor de freqüência calculado pelo microcontrolador................... 62
Figura 4.13 – Razão Cíclica de 50,39%. ........................................................................... 63
Figura 4.14 – Razão Cíclica de 70,07%. ........................................................................... 63
Figura 4.15 – Detecção de pico do sinal quadrado gerado pelo circuito da Fig. 3.1.. 64
Figura 4.16 – Tensão de pico do sinal quadrado. ............................................................ 65
Figura 4.17 – Tensão de pico do sinal senoidal. .............................................................. 65
Figura 4.18 – Tensão de pico do sinal triangular. ............................................................ 66
Figura 4.19 – Amplitude da onda senoidal de 0,087V..................................................... 67
Figura 4.20 – Amplitude da onda senoidal de 1,443V..................................................... 67
Figura 4.21 – Amplitude da onda senoidal de 2,627V..................................................... 68
Figura A.1 – Distribuição dos periféricos pelos canais do DMA1. ................................. 73
Figura B.1 – Distribuição dos periféricos pelos canais do DMA2. ................................. 74
Figura C.1 – Diagrama de blocos do periférico USART.................................................. 75
Figura D.1 – Canal de captura / comparação do periférico temporizador.................... 76
Figura E.1 – Diagrama de blocos do conversor A/D........................................................ 77
Figura H.1 – Exemplo de montagem com 4 displays de sete segmentos. .................. 83
Figura H.2 – Diagrama da placa de multiplexação de 4 displays de 7 segmentos. ... 84

ix
LISTA DE TABELAS
Tabela 2.1 – Configuração dos GPIOs. ............................................................................... 5
Tabela 2.2 – Configuração da velocidade máxima dos GPIOs. ...................................... 5
Tabela 2.3 – Resistência de entrada externa máxima para freqüência do conversor
igual a 14MHz. ....................................................................................................................... 27
Tabela 3.1 – Faixa de freqüência versus capacitor C1. .................................................. 31
Tabela 3.2 – Descrição dos pinos do CI XR-2206. .......................................................... 37
Tabela 4.1 – Capacitor de temporização versus freqüência mínima. ........................... 52
Tabela 4.2 – Faixas de freqüências em função do capacitor de temporização. ......... 53
Tabela 4.3 – Amplitude dos sinais senoidal e triangular. ................................................ 55

x
SUMÁRIO
LISTA DE FIGURAS ................................................................................................. VIII
LISTA DE TABELAS .................................................................................................... X

1 INTRODUÇÃO ......................................................................................................... 1
2 FUNDAMENTAÇÃO TEÓRICA ................................................................................ 3
2.1 GPIOS (GENERAL PURPOSE INPUT/OUTPUT) ................................................................ 3
2.2 INTERRUPÇÕES ................................................................................................................ 5
2.3 DMA (DIRECT MEMORY ACCESS)................................................................................... 7
2.4 USART (UNIVERSAL SYNCHRONOUS/ASYNCHRONOUS RECEIVER/TRANSMITTER) ..... 9
2.4.1 Taxa de Transmissão .......................................................................................... 10
2.4.2 Paridade ................................................................................................................ 10
2.4.3 Controle de Fluxo................................................................................................. 11
2.4.4 Periférico USART................................................................................................. 11
2.4.5 Estilo de Programação ........................................................................................ 12
2.5 TEMPORIZADORES (TIMERS) ......................................................................................... 13
2.5.1 Geração de Interrupções .................................................................................... 18
2.5.2 Canais de Captura de Entrada e Comparação de Saída.............................. 19
2.6 CONVERSOR A/D ........................................................................................................... 24
2.6.1 Clock do Conversor A/D ..................................................................................... 26
2.6.2 Tempo de Conversão .......................................................................................... 26
2.6.3 Acionamento Externo .......................................................................................... 27
2.7 AMBIENTE DE DESENVOLVIMENTO................................................................................. 28
2.8 BIBLIOTECA DE FIRMWARE PARA A FAMÍLIA STM32 FORNECIDA PELA ST
MICROELECTRONICS ............................................................................................................ 29
2.9 O PROGRAMADOR JTAG OLIMEX ARM-USB-TINY ................................................... 30

3 DESENVOLVIMENTO PRÁTICO ........................................................................... 31


3.1 GERADORES DE SINAIS DE FREQÜÊNCIA E RAZÃO CÍCLICA VARIÁVEIS ....................... 31
3.2 GERADOR DE FUNÇÕES UTILIZANDO O CIRCUITO INTEGRADO XR-2206 .................... 33
3.3 CIRCUITO ATENUADOR UTILIZANDO AMP OP ................................................................ 38
3.4 O KIT DE DESENVOLVIMENTO OLIMEX STM32-P103 .................................................. 38
3.4.1 Programação do Microcontrolador para Cálculo da Freqüência ................. 39
3.4.2 Programação do Microcontrolador para Cálculo da Razão Cíclica ............. 42
3.4.3 Programação do Microcontrolador para Cálculo da Amplitude.................... 43
3.4.4 Programação dos GPIOs para o Funcionamento do Display....................... 46

4 RESULTADOS E DISCUSSÃO .............................................................................. 48


4.1 CIRCUITO GERADOR DE SINAIS UTILIZANDO AMP OP .................................................. 48
4.2 CIRCUITO GERADOR DE SINAIS UTILIZANDO O CI XR-2206 ........................................ 51
4.3 CIRCUITO ATENUADOR UTILIZANDO AMP OP ................................................................ 59
4.4 ANÁLISE E LEITURA DOS RESULTADOS DE FREQÜÊNCIA .............................................. 60
4.5 ANÁLISE E LEITURA DOS RESULTADOS DE RAZÃO CÍCLICA .......................................... 62
xi
4.6 CIRCUITO DETECTOR DE PICO UTILIZANDO AMP OP .................................................... 64
4.7 ANÁLISE E LEITURA DOS RESULTADOS DE AMPLITUDE................................................. 66

5 CONCLUSÃO ......................................................................................................... 69
5.1 TRABALHOS FUTUROS ................................................................................................... 70

REFERÊNCIAS ......................................................................................................... 71

ANEXOS ................................................................................................................... 72

xii
1

1 INTRODUÇÃO
O projeto de sistemas microprocessados ganha, a cada dia, um
espaço maior na área de Microeletrônica. Um sistema eletrônico embarcado consiste
em um sistema microprocessado no qual o computador é completamente
encapsulado ou dedicado ao dispositivo que ele controla e realiza um conjunto de
tarefas predefinidas, geralmente com propósitos específicos. Além disso, o sistema
embarcado encontra-se no limiar entre o projeto de sistemas eletrônicos e
computacionais. Dessa forma, pode-se dizer que o projeto de sistemas eletrônicos
embarcados é uma combinação de ambos, ou seja, de um lado projeta-se o circuito
eletrônico no qual o microprocessador está inserido, e do outro se escreve um
software que interfaceia com este hardware por meio de periféricos do
microcontrolador. Como o sistema é dedicado a tarefas específicas, pode-se otimizar
o projeto reduzindo tamanho, recursos computacionais, custo do produto, dentre
outros.
O uso de microprocessadores justifica-se pela facilitação que pode
trazer no desenvolvimento de um projeto, uma vez que o projeto de sistemas
analógicos de alto desempenho pode tornar-se uma tarefa bastante complexa,
enquanto o desenvolvimento da parte analógica de um sistema de sinal misto é bem
mais simples e atinge um melhor desempenho.
A evolução dos processos de fabricação dos semicondutores e a
queda de custo de um componente eletrônico também são fatores extremamente
importantes que favoreceram o maior uso de microcontroladores. O primeiro permitiu
integrar grandes quantidades de transistores em uma pequena pastilha de silício e o
segundo decorre de os fatores que determinam o preço de um componente
eletrônico (desenvolvimento, encapsulamento, transporte, marketing, etc.) não
evoluírem da mesma maneira. Assim, circuitos digitais usando portas lógicas não
conseguem competir, exceto nas aplicações mais simples (5 – 10 portas lógicas).
Por fim, deve-se acrescentar o fato de que o uso de
microprocessadores permite expansão e reprogramação do sistema, oferecendo
maior flexibilidade ao projetista.
O objetivo geral do trabalho é a implementação de um circuito
analógico que fornece ondas quadradas e outras (basicamente um gerador de
2

funções), em que o sinal pode ser variado pelo usuário em função da freqüência,
razão cíclica e amplitude. Posteriormente, será utilizado um microprocessador da
família STM32, mais especificamente o STM32F103RB, que fará o cálculo da
freqüência, razão cíclica e amplitude do sinal e, em seguida, tais valores serão
amostrados em quatro displays de sete segmentos.
Esta monografia contém além da introdução, mais 4 capítulos que
podem ser assim resumidos. No segundo capítulo são descritas as principais
características do microcontrolador utilizado, bem como seus principais periféricos,
dando destaque para os GPIOs, Timer e Conversor A/D. Além disso, é apresentado
o software utilizado para a programação do sistema implementado. O terceiro
capítulo é dividido em três partes. A primeira delas descreve o circuito analógico,
composto pelo circuito gerador de sinais elétricos, atenuador e detector de pico. A
segunda descreve a programação do microcontrolador para processamento do sinal.
A terceira e última descreve a programação do microcontrolador para a amostragem
de valores no display. Já no quarto capítulo, é apresentado o problema e os
resultados que validam o funcionamento do sistema implementado. No quinto e
último capítulo é apresentado um resumo da conclusão do trabalho e também as
perspectivas para novos projetos.
3

2 FUNDAMENTAÇÃO TEÓRICA

O microprocessador utilizado no desenvolvimento prático do projeto


pertence à família STM32, da ST Microelectronics, cujo núcleo, o Cortex-M3, foi
projetado pela ARM. O conjunto de instruções utilizadas denomina-se Thumb-2, que
alia desempenho de um processador de 32 bits com tamanho de código próximo ao
de microcontroladores de 8 bits. Existem duas séries disponíveis, e uma delas, a
STM32F1xx foi a primeira a ser lançada no mercado e atinge freqüências de clock
de até 72MHz. A linha que será usada denomina-se Performance line
(STM32F103xx). O kit de desenvolvimento (Olimex STM32-P103) disponível no
laboratório é baseado nessa linha, mais especificamente, o STM32F103RB, que
possui encapsulamento de 64 pinos, memória flash de 128KB e 20KB de memória
RAM. Os periféricos do microcontrolador realizam diferentes tarefas e é por meio
deles que o firmware interfaceia com o circuito eletrônico. A seguir, serão abordados
os principais periféricos desse microcontrolador e os principais conceitos que
contribuíram para o desenvolvimento do projeto.

2.1 GPIOS (GENERAL PURPOSE INPUT/OUTPUT)

São os pinos do microcontrolador responsáveis pela sua interação


com o circuito no qual está inserido. Podem ser programados como pinos de saída,
ou seja, podem gerar sinais por meio de programação em software, ou podem ler
sinais digitais presentes nos pinos. No caso do trabalho desenvolvido, um pino
disponível será programado como entrada, uma vez que o sinal será fornecido por
um circuito elétrico externo. Alguns deles não estão disponíveis, pois são de uso
exclusivo do microcontrolador como, por exemplo, alimentação, conexão de cristais
para geração de clock, dentre outras funções específicas (ROAD, 2008).
Os pinos estão dispostos em 7 portas diferentes (GPIOA, GPIOB,...,
GPIOG), sendo que cada uma destas possuem no máximo 16 pinos. Tais pinos são
declarados por uma notação especificada pelo fabricante com formato Pxy, em que x
indica qual porta (A até G) e y o número do pino correspondente que varia de 0 a 15.
Porém, tal notação especifica apenas o nome “lógico” do pino para efeito de
programação, sendo que o pino “físico” correspondente do encapsulamento pode
4

ser outro e varia dependendo do encapsulamento. Mesmo assim, se o projetista


migrar de um encapsulamento de 64 pinos para um de 100 pinos e mantiver o sinal
conectado à porta lógica de mesma denominação do anterior, o firmware
provavelmente funcionará da mesma forma.
Cada porta (de A a G) corresponde a um periférico diferente. Devido
a esse fato, elas devem ser inicializadas independentemente das outras. Por
exemplo, a habilitação de clock de uma porta não habilita as demais. Com isso, é
possível reduzir o consumo de energia pelo microcontrolador, uma vez que o
programador habilita apenas as portas das quais fará uso.
A estrutura básica de uma porta de GPIO é mostrada na Figura 2.1.

Figura 2.1 – Estrutura básica de uma porta de GPIO.

Observando-se o circuito, pode-se notar a presença de dois diodos


na entrada do periférico. Eles servem de proteção contra sub e sobre-tensão.
As portas podem ser configuradas como entrada (analógica ou
digital com ou sem pull-up / pull-down) ou saída (tipo push-pull, dreno aberto ou
alternate function, para uso com outros periféricos).
Assim como nos demais periféricos do STM32, as configurações dos
GPIOs são feitas por meio de registradores (ST Microelectronics, 2011):
• GPIOx_CRL: Port Configuration Register Low;
5

• GPIOx_CRH: Port Configuration Register High;


• GPIOx_IDR: Port Input Data Register;
• GPIOx_ODR: Port Output Data Register;
• GPIOx_BSRR: Port Bit Set/Reset Register;
• GPIOx_BRR: Port Bit Reset Register;
• GPIOx_LCKR: Port Configuration Lock Register.
As Tabelas 2.1 e 2.2 indicam como configurar os GPIOs.

Tabela 2.1 – Configuração dos GPIOs.

Modos de Configuração Configuração Modo Modo Registrador


configuração 1 0 1 0 PxODR
Entrada Push-pull 0 0 ou 1
de Dreno 0
propósito aberto 1 00 0 ou 1
geral 10
Entrada Push-pull 0 11 X
Alternate Dreno 1 1 X
Function aberto
Analógica 0 0 X
Floating 1 00 X
Entrada Pull-down 1 0 0
Pull-up 1

Tabela 2.2 – Configuração da velocidade máxima dos GPIOs.

Modo [1:0] Significado


00 Reservado
01 Máx. velocidade de saída igual a
10MHz
10 Máx. velocidade de saída igual a 2MHz
11 Máx. velocidade de saída igual a
50MHz

2.2 INTERRUPÇÕES

Existe um estilo de programação conhecido como polling em que o


programador deve verificar a ocorrência de uma mudança num sinal do pino de
entrada do microprocessador. Para isso, o programador deve verificar a ocorrência
6

destes eventos num ponto de sua escolha do fluxo de execução. Porém, esse estilo
nem sempre é eficiente no tratamento de eventos.
Ao invés do microcontrolador estar sempre verificando a ocorrência
de um evento, é preferível que a ocorrência do evento cause a chamada de uma
função pelo hardware para o seu tratamento. Esse conceito denomina-se
interrupção, que interrompe o fluxo normal de execução de um programa, para
tratamento de um evento assíncrono. Este pode ser a mudança do status de um
pino, o término de uma transferência de dados (por DMA ou por um periférico de
comunicação), o término da contagem de um temporizador, etc.
Caso o programador opte por não usar interrupção, o laço principal
deverá conter dezenas ou centenas de verificações de eventos, que gastam tempo
de processamento e energia. Pelo exposto conclui-se que o uso de interrupção é
uma forma viável para o tratamento de eventos assíncronos. Entretanto, o
programador deve atentar para o fato de que a execução do código pode ser
interrompida a qualquer momento, quando ela é desviada para a função de
tratamento de interrupção, e isso pode acarretar em alguns problemas de
sincronização.
Outra questão que merece destaque está relacionada à
temporização. Quando ocorre uma interrupção, a função de tratamento é chamada e
bloqueia a chamada de outras interrupções (a menos que se implemente um
esquema de prioridade) até que se complete o tratamento. Muitas vezes as
interrupções são sensíveis ao tempo de tratamento (sistemas dessa classe são
chamados de tempo real). Assim, é importante minimizar a quantidade de
processamento realizada dentro de uma interrupção.
No STM32, o uso de interrupções tem dois componentes: um
genérico e um específico por periférico.
O componente genérico corresponde ao registro de uma função de
tratamento de uma interrupção e a habilitação desta interrupção. Para isso, usam-se
as funções da biblioteca com prefixo NVIC para esta função.
O componente específico varia de um periférico para outro, exigindo
a configuração dos registradores específicos daquele periférico para habilitar a
geração de interrupções. No periférico GPIO, por exemplo, a geração de
interrupções é feita por meio de outro periférico, chamado EXTI.
7

2.3 DMA (DIRECT MEMORY ACCESS)

É um periférico do microcontrolador usado para a transferência de


grandes quantidades de dados em alta velocidade e de maneira eficiente. Tal função
é realizada por um hardware dedicado, pois o gerenciamento de transferências
desta velocidade tomaria um tempo considerável do microprocessador.
Assim, o microprocessador delega as tarefas de transferência de
dados para este hardware, ficando livre para tarefas mais complexas. Conversão de
dados (A/D e D/A), caso sejam realizadas em altas freqüências, podem ser
consideravelmente beneficiadas por um dispositivo DMA.
Os microcontroladores da família STM32 possuem dois
controladores de DMA independentes, DMA1 (7canais) e DMA2 (5 canais), num total
de 12 canais de DMA independentes. Então, é possível configurar até 12
transferências distintas de DMA que podem ser acionadas por eventos de hardware,
ou iniciadas por software (para transferência de memória para memória) (ST
Microelectronics, 2011).
Dentro de um mesmo controlador de DMA (DMA1 ou DMA2), há
quatro níveis de prioridade configurados em software. Se houver mais de uma
transferência com o mesmo nível de prioridade, há uma resolução por níveis pré-
determinados em hardware (são priorizados os canais de índice mais baixo).
Antes da transferência, é necessário configurar entre fonte e destino,
o tamanho da transferência em si. Esta pode ocorrer de 8 em 8, 16 em 16 ou 32 em
32 bits.
Além disso, é preciso configurar a fonte e o destino. A transferência
pode ocorrer de periférico para memória, memória para periférico, periférico para
periférico e memória para memória. A memória flash, SRAM, e os periféricos dos
barramentos APB1, APB2 e AHB podem ser configurados como fonte ou destino. O
diagrama de blocos mostrado na Figura 2.2 apresenta mais claramente o periférico
DMA.
8

Figura 2.2 – Diagrama de blocos do periférico DMA.

Nos Anexos A e B é mostrada a distribuição de periféricos pelos


canais de DMA.
Por último, é importante descrever de forma genérica, a seqüência
de inicialização do DMA (ST Microelectronics, 2011):
1. Habilitar o clock do controlador de DMA;
2. Configurar o endereço do periférico que aciona a transferência
(registrador DMA_CPAR; também pode ser um endereço de
memória comum);
3. Configurar o endereço da memória (registrador DMA_CMAR;
também pode ser um endereço de periférico);
4. Configurar a quantidade de transferências a executar (registrador
DMA_CNDTR);
9

5. Configurar a prioridade de transferência (bits PL[1:0] do


registrador DMA_CCR);
6. Configurar a direção de transferência, modo buffer circular,
incremento de endereço, tamanhos de dados e interrupções no
registrador DMA CCR;
7. Habilitar o canal do DMA (bit ENABLE do registrador
DMA_CCR).

2.4 USART (UNIVERSAL SYNCHRONOUS/ASYNCHRONOUS RECEIVER/TRANSMITTER)

É um periférico utilizado para comunicação com PCs. O protocolo


que será utilizado e que se mostra bastante simples é o padrão RS-232, utilizado em
portas seriais. Mesmo que as portas seriais não sejam mais o padrão nos novos
computadores, existem placas de expansão com portas seriais e paralelas, além de
adaptadores de USB ou Ethernet para serial, na forma de aparelhos prontos ou CIs
que podem ser incorporados a um projeto eletrônico.
No RS-232, a comunicação é simplesmente um fluxo de bytes. Tal
padrão especifica, basicamente, questões mecânicas (conectores, pinagem, etc.) e
de sinalização elétrica, mas nada é dito sobre como estruturar os dados que
trafegam pela linha. Dessa forma, o usuário pode definir o formato de comunicação,
e a programação se torna bastante simples.
Porém, alguns recursos como detecção de erros de transmissão, re-
envio de pacotes, etc. devem ser implementados pelo usuário.
Como a transmissão de dados no padrão RS-232 é feita de maneira
serial, apenas um bit é transferido por vez. Entretanto, existem linhas separadas
para transmissão e recepção de dados, tornando possível a comunicação full-
duplex, em que um dispositivo pode transmitir e receber dados ao mesmo tempo.
Os sinais transmitidos são digitais, onde um nível lógico 0 é
representado por uma tensão positiva de +3 a +15V, enquanto um nível lógico 1 é
representado por uma tensão negativa de -3 a -15V. Atualmente tais níveis de
tensão, e o uso de tensões negativas caíram em desuso. Como solução, usa-se
conversores de níveis de tensão como o MAX232, que internamente possuem
charge pumps para gerar os níveis de tensão especificados pelo padrão (por
exemplo, ±12V).
10

Outra questão que deve ser levada em conta é o fato de o padrão


RS-232 é assíncrono, ou seja, não há um sinal de clock para a sincronização entre
as duas pontas da comunicação. Por isso, são utilizados bits de início e de parada
(start e stop bits). O conjunto de bits de início, parada e dados propriamente ditos é
conhecido como frame (quadro). O bit de início é sempre 0, e o bit de parada é
sempre 1. Assim sempre ocorrerá uma transição de 1 para 0 entre um frame e outro.
Porém, além disso, é necessário especificar a mesma taxa de transmissão nas duas
pontas que irão se comunicar.

2.4.1 Taxa de Transmissão

Para comunicação entre dispositivos locais, a taxa de 115200 bps é


bastante utilizada, pois é fácil de ser atingida mesmo por cabos mais longos ou de
baixa qualidade. Porém, taxas de 230400, 460800 e até 921600 bps não são difíceis
de ser encontradas.
Deve-se observar que esta taxa de transmissão inclui os bits de
início e de parada. Na configuração mais simples possível, cada quadro contém um
bit de início, um bit de parada e 8 bits de dados. Sendo assim, para cada 8 bits de
dados que se deseja transmitir, é necessário enviar um total de 10 bits. A taxa de
transmissão em bytes por segundo é dado então por 1/10 da taxa em bps, mas esta
relação pode variar em função do número de bits de dados e bits de parada, além da
questão da paridade.

2.4.2 Paridade

O bit de paridade é uma forma de implementar a detecção de erros


de transmissão. A paridade pode ser par ou ímpar.
Para a sua implementação, um bit é adicionado ao quadro
transmitido, de forma que o XOR de todos os bits do quadro seja igual a 1 (paridade
ímpar) ou 0 (paridade par). Na outra ponta da comunicação, deve-se verificar se foi
obtida a paridade esperada, descartando-se o quadro recebido em caso negativo
(TOCCI, 2000).
11

Este recurso mostra-se útil para altas taxas de transmissão ou cabos


muito longos.

2.4.3 Controle de Fluxo

Em muitos casos, o buffer de recepção é de um único byte. Isso


significa que há um curto espaço de tempo para que o dado seja descarregado do
buffer, antes que outro seja recebido. Para evitar a perda de dados são utilizados
interrupções ou DMA.
Existem CIs de comunicação serial mais avançados que possuem
buffer do tipo FIFO (First In, First Out) de 16, 32, 64 ou até mais bytes. Contudo,
para taxas de transmissão muito altas, os buffers podem não ser esvaziados a
tempo de evitar a perda de bytes.
Como solução para o problema descrito, pinos extras de sinalização
são utilizados para controle de fluxo.
No padrão RS-232, o controle de fluxo é implementado por meio de
duas linhas, que são chamadas CTS (Clear To Send) e RTS (Request To Send). A
linha CTS indica que o dispositivo está preparado para receber dados (buffers
livres), enquanto a linha RTS indica que o dispositivo deseja transmitir dados. A
transmissão só ocorrerá se ambas as linhas estiver em nível lógico 0, indicando que
tanto o dispositivo que realiza a transmissão quanto o que realiza a recepção estão
prontos para transmitir e receber, respectivamente. Caso o dispositivo que está
recebendo estiver sobrecarregado, com buffers quase cheios, ele pode indicar
(subindo o estado da linha CTS) que a transmissão deve ser interrompida, pois os
dados poderão ser perdidos.

2.4.4 Periférico USART

É um tipo de CI usado para interface com portas seriais e que


suporta comunicação síncrona (com o pino de clock) e assíncrona. O STM32 possui
até 3 USARTs. É este o periférico que permite implementar o padrão RS-232. Nele
podem ser configurados a taxa de transmissão, número de bits de dados, bits de
parada e a presença do bit de paridade.
12

A integração com o sistema de DMA, presente no periférico, é


praticamente essencial para operação em altas taxas de transmissão. Outra questão
importante são as interrupções, que podem ser geradas para diversos eventos
desse periférico como: fim da transmissão de um byte, recepção de um byte,
mudança na linha CTS, além de uma série de erros. A operação por polling pode ser
utilizada para a amostragem dos registradores de status.
No Anexo C é mostrado o diagrama de blocos do periférico USART.
Quanto à programação do periférico, deve-se chamar a atenção
para quatro classes de registradores (ST Microelectronics, 2011):
• Status (USART_SR): permite verificar (geralmente em modo
polling) uma série de flags;
• Dados (USART_DR): onde é passado o bit a ser transmitido, ou
onde se encontra o bit recebido;
• Taxa de transmissão (USART_BRR): para configuração da taxa
de transmissão;
• Configuração (USART_CRx): para outras configurações como
interrupções, número de bits de parada e dados, paridade,
controle de fluxo, etc.

2.4.5 Estilo de Programação

Existem três estilos de programação que podem ser usados com


este periférico: polling, interrupção e DMA.
No estilo polling, o firmware deve realizar uma amostragem periódica
do registrador de status da USART para decidir quando enviar um novo caractere,
quando ler o caractere recebido, verificar condições de erro, etc. Porém, ele se
mostra pouco eficiente em termos de consumo de energia e tempo de
processamento. Além disso, para altas taxas de transmissão, pode ocorrer a perda
de dados. Nesse caso, é aconselhável o uso de interrupções, já que o processador
pode dar atenção aos eventos assim que ocorrem.
O uso do estilo polling é aconselhável em aplicações que recebem
pequenas quantidades de dados, já que as freqüentes interrupções podem
13

prejudicar outras tarefas que também exigem um controle preciso do tempo. Vale
lembrar que um “congestionamento” de interrupções ocasiona jitter.
Para aplicações em que a comunicação ocorre de forma contínua,
justifica-se a complexidade do uso do controlador de DMA. Através dele, simula-se
um buffer maior para o periférico da USART, que é de apenas um byte. Com isso, o
hardware gerencia a transferência da USART para o buffer, garantindo que
ocorrerão em tempo, e sem interromper o processador. Pode-se então usar uma
técnica de polling ou interrupção para monitoramento do buffer-alvo do DMA, com a
vantagem que não será necessário acessá-lo com tanta freqüência.

2.5 TEMPORIZADORES (TIMERS)

A utilização de temporizadores surge da necessidade de medir


períodos de tempo em aplicações que exigem um controle preciso de tempo ou com
certa exatidão. Um exemplo típico é a conversão A/D e D/A de sinais, em que
variações na temporização podem degradar consideravelmente a qualidade do sinal.
A geração de sinais numa freqüência especificada também exige uma contagem
precisa de tempo. Em fontes chaveadas e controle de motores, pode ser necessário
também especificar a razão cíclica da onda com precisão.
Para que fossem alcançados os resultados esperados no
desenvolvimento do projeto proposto, o temporizador foi um dos periféricos de maior
utilidade, pois era necessário medir a freqüência e a razão cíclica do sinal quadrado
gerado pelo circuito externo.
Apesar das variações de recursos de um periférico para outro, o
coração de um temporizador é um contador. Como já foi dito anteriormente, o
microcontrolador utilizado possui uma freqüência de clock de 72 MHz, contudo,
através de divisores programáveis de tempo, conhecidos também como prescalers,
a freqüência interna pode ser variada dependendo da necessidade da aplicação.
Segundo notas de aula da disciplina de Microprocessadores (2011),
o estouro (overflow) da contagem do temporizador pode gerar eventos, como
interrupções, que permitem o tratamento de eventos em instantes de tempo pré-
determinados. Para aplicações que tolerem um pouco de jitter, é possível fazer
polling do contador aguardando seu estouro.
14

Vale lembrar também que os microprocessadores da família STM32


possuem recursos de captura de entrada (input capture) que permite a medição de
freqüência e largura de pulso (razão cíclica de sinais), e comparação de saída
(output capture), em que o próprio microcontrolador gera sinais com freqüências e
razão cíclica (sinais PWM) programados (ST Microelectronics, 2011).
Os microcontroladores da família STM32 podem ser configurados
com até 14 temporizadores diferentes. Existem três tipos diferentes de
temporizadores (ST Microelectronics, 2011):
• Temporizador de controle avançado (TIM1/TIM8);
• Temporizador básico (TIM6/TIM7);
• Temporizador de propósito geral (os demais);
Porém, nem todos os modelos dessa família dispõem de todos estes
temporizadores.
Destacam-se no decorrer do desenvolvimento do projeto os
temporizadores de propósitos geral. Eles possuem quatro canais de captura de
entrada e comparação de saída. Como permitem o uso de clocks externos, os
temporizadores funcionam como contadores, ou triggers internos, o que permite o
cascateamento de temporizadores. Interrupções e triggers de DMA também podem
ser gerados pelos recursos de captura de entrada e comparação de saída.
Para um melhor entendimento do princípio de funcionamento do
temporizador são necessários os seguintes esclarecimentos: o bloco básico é a
unidade de base de tempo que é composta pelo contador em si, o temporizador e o
registrador de auto-recarga.
Primeiramente, deve-se programar a freqüência de contagem. O
clock interno se trata da linha TIMxCLK presente na árvore de clock do
microcontrolador e, supondo a configuração padrão, o clock do temporizador terá a
mesma freqüência do clock do microcontrolador. Mas conforme dito anteriormente,
pode-se programar o prescaler do temporizador para se chegar à freqüência de
contagem desejada.
O prescaler é um registrador de 16 bits, onde um valor n
corresponde a uma divisão do clock por n+1. Por exemplo, se o prescaler for igual a
71, significa que a freqüência interna de 72MHz será divida por 72 (71+1), que
15

equivale a uma freqüência de saída de 1MHz. Assim, é possível gerar sinais de


saída com diferentes valores de freqüência através de programação em software.
As Figuras 2.3 e 2.4 mostram o efeito da mudança do prescaler
sobre a freqüência de contagem. Nota-se que a atualização do prescaler tem efeito
no próximo evento de atualização (ST Microelectronics, 2011).

Figura 2.3 – Diagrama de temporização do contador com mudança de divisão do prescaler de 1 para
2.
16

Figura 2.4 – Diagrama de temporização do contador com mudança de divisão do prescaler de 1 para
4.

O contador pode contar para cima (incremento), para baixo


(decremento) ou alternar entre os dois modos.
No primeiro caso, o contador inicia a contagem em 0 e conta até o
valor de auto-recarga. Quando este valor é atingido, o contador é zerado, e gera-se
um evento de estouro de contagem (ST Microelectronics, 2011), conforme é
mostrado na Figura 2.5.
17

Figura 2.5 – Diagrama de temporização do contador para cima, clock interno dividido por 1.

No segundo caso, o contador parte do valor de auto-recarga e conta


até zero, quando o valor de auto-recarga é recarregado no contador, e um evento de
estouro de contagem é gerado (ST Microelectronics, 2011), conforme pode ser
observado na Figura 2.6.

Figura 2.6 – Diagrama de temporização do contador para baixo, clock interno dividido por 1.

No terceiro e último caso, conhecido com modo Center-aligned, a


contagem é alternada para cima e para baixo. Neste modo, o contador conta de zero
até o valor de auto-recarga, quando gera um evento de estouro. Em seguida,
18

começa a contar para baixo até zero, gerando outro evento de estouro, e começa
novamente (ST Microelectronics, 2011). A Figura 2.7 ilustra o que foi explicado.

Figura 2.7 – Diagrama de temporização do contador (modo center-aligned), clock interno dividido por
1, TIMxARR = 0x6.

2.5.1 Geração de Interrupções

A geração de interrupções acontece quando ocorre um evento de


estouro de contagem e pode ser de extrema utilidade para a execução de eventos
de sinais periódicos e para a geração de sinais de baixa ou até média freqüência
(algumas dezenas de kHz). Para freqüências maiores, haverá um gasto de tempo
excessivo no tratamento da interrupção, além da possibilidade de haver jitter. Este
fenômeno ocorre quando um evento é detectado, enquanto outro ainda está sendo
tratado na rotina de interrupção. Isto pode atribuir falsos valores às variáveis que
serão utilizadas no cálculo de freqüência e razão cíclica, ou seja, parâmetros que
necessitam de um controle preciso de tempo.
Portanto, para a geração ou leitura de sinais de freqüências maiores
é necessário utilizar os recursos de comparação de saída, explicados na seção
abaixo.
19

2.5.2 Canais de Captura de Entrada e Comparação de Saída

São úteis tanto para geração quanto para leitura de sinais elétricos
em termos de freqüência e razão cíclica (ou largura de pulso).
Ao se utilizar apenas funções básicas do temporizador, é possível
sinalizar ao processador (por exemplo através de uma interrupção) que ocorreu um
evento no temporizador (por exemplo estouro de contagem). A partir disso, o
processador interrompe o que está executando para ler ou gerar sinais. Porém, além
da possibilidade de ocorrência do jitter, esta abordagem mostra-se um tanto quanto
ineficiente se comparada ao uso dos canais de captura/comparação do timer.
Através dos canais de captura e comparação é possível ler ou gerar
sinais elétricos diretamente no periférico, independentemente do processador. Isso
porque esses canais fornecem uma interface direta entre o temporizador e certas
portas do GPIO.
O Anexo D mostra como o canal de captura / comparação está
inserido no periférico temporizador.
No diagrama, os pontos TIMx_CH1, TIMx_CH2, TIMx_CH3 e
TIMx_CH4 são pinos do GPIO que podem ser programados para serem usados em
aplicações que utilizam o temporizador (ST Microelectronics, 2011).
Para melhor visualização, as Figuras 2.8, 2.9 e 2.10 mostram de
maneira mais detalhada um canal de captura e comparação (ST Microelectronics,
2011).

Figura 2.8 – Estágio de entrada do temporizador.


20

Figura 2.9 – Circuito principal do temporizador.

Figura 2.10 – Estágio de saída do temporizador.

2.5.2.1 Captura de entrada

O princípio de funcionamento do estágio de captura de entrada


baseia-se no “congelamento” do valor do contador quando for detectada uma
transição nos GPIOs. A ocorrência da transição também pode gerar uma interrupção
ou uma transferência de DMA.
No projeto desenvolvido, era necessário medir a freqüência de um
sinal presente em um dos GPIOs TIMx_CHy. Portanto, programando-se a unidade
de base de tempo para contar numa freqüência coerente com a freqüência a ser
medida, é possível calcular a freqüência de um sinal digital que é capturado por um
21

pino específico do GPIO destinado para tal fim. Para isso, é necessária a ocorrência
de um evento, que pode ser uma borda de subida. Dessa forma, a cada borda de
subida do sinal, uma interrupção é gerada, e na rotina de tratamento da interrupção
o valor do contador é lido. Quando ocorre a segunda borda de subida, outro valor de
contagem é identificado. É feita então a diferença entre estes dois números. Como a
freqüência de contagem é conhecida pelo programador, pode-se estimar o tempo
que o contador leva para realizar cada contagem e, conseqüentemente, o período
do sinal. De posse desse período, encontra-se a freqüência do sinal.
Os registradores que devem ser programados para habilitar o
temporizador implicam na (ST Microelectronics, 2011):
• Seleção do sinal de entrada;
• Programação do filtro de entrada;
• Seleção da borda de subida ou descida;
• Programação do prescaler;
• Habilitação da interrupção e/ou DMA.
Usando o procedimento descrito, é possível também medir a largura
de pulso (ou, equivalentemente, razão cíclica) do sinal. Nestas situações,
geralmente ondas do tipo PWM (Pulse-Width Modulated) estão envolvidas.
Como o projeto desenvolvido necessitava de leitura da razão cíclica,
foi necessária também a utilização do canal de captura de entrada para esse fim.
Isso é possível pois cada um dos GPIOs TIMx_CHy pode ser usado como entrada
de dois canais de captura de entrada (canal 1 e 2, ou canal 3 e 4). Assim, a leitura
da razão cíclica pode ser feita paralelamente à leitura de freqüência por um segundo
canal que “congele” o número da contagem correspondente à borda de descida do
sinal. Com isso, sabendo-se o período do sinal (tomando como referência as duas
bordas de subida) e o intervalo de tempo entre a primeira borda de subida e a borda
de descida seguinte é calculado o Duty Cycle (ou razão cíclica) do sinal. A Figura
2.11 mostra o comportamento do temporizador nesse modo.
22

Figura 2.11 – Contagem do timer para cálculo da razão cíclica.

2.5.2.2 Comparação de saída

Segundo notas de aula da disciplina de Microprocessadores (2011),


assim como o periférico de captura/comparação pode ser sensível a eventos
ocorrendo num pino de entrada, ele pode controlar um pino de saída. Este modo é
chamado de comparação de saída.
Neste modo, o periférico compara o valor do contador do
temporizador com o registrador de captura/comparação (TIMx_CCRy). Quando os
dois coincidem, o periférico gera um sinal para o circuito de controle de saída. Além
disso, podem ser geradas interrupções e/ou requisições de DMA.
O controle de saída pode ter os seguintes comportamentos:
• Manter o nível lógico do pino (útil na geração de interrupção ou
requisição de DMA);
• Ativar o pino (levá-lo a nível lógico 0 ou 1, conforme a
configuração de polaridade de saída);
• Inverter o nível lógico do pino.
A configuração dos registradores para comparação de saída terá
com finalidade (ST Microelectronics, 2011):
• Selecionar o clock do contador;
• Programar os registradores TIMx_ARR e TIMx_CCRy;
23

• Habilitar, caso necessário, a geração de interrupções e


requisições de DMA;
• Selecionar o comportamento do controle de saída;
• Habilitar o contador.
A Figura 2.12 ilustra o modo de comparação de saída, em que
ocorre a inversão do nível de saída quando o registrador coincide com o contador.

Figura 2.12 – Modo de comparação de saída do temporizador.

O método descrito permite a geração de sinais de freqüência


determinada, porém com razão cíclica fixa em 50%. Para a aplicação do
temporizador, em que o microcontrolador fará a leitura de um sinal analógico PWM
cuja razão cíclica será variada, torna-se indispensável a configuração do periférico
de comparação de saída em um dos modos PWM. Nestes modos, o registrador
TIMx_ARR determina a freqüência do sinal, enquanto o registrador TIMx_CCRy
determina a razão cíclica. Em ambos os modos, o contador conta até TIMx_ARR e
retorna para 0 (admitindo a contagem crescente).
No primeiro modo PWM, enquanto TIMx_CNT < TIMx_CCRy, o
canal fica ativado, e caso contrário, fica desativado.
No segundo modo PWM, enquanto TIMx_CNT < TIMx_CCRy, o
canal fica desativado, e caso contrário, fica ativado.
24

O mapeamento entre ativado/desativado e nível lógico 0/1 é


determinado pela configuração de polaridade.
A Figura 2.13 ilustra a operação do primeiro modo PWM, em modo
de contagem crescente, admitindo que o registrador TIMx_ARR contenha o valor 8.

Figura 2.13 – Operação do periférico de comparação de saída em modo PWM.

2.6 CONVERSOR A/D

Os conversores A/D possibilitam basicamente a interação de um


sistema embarcado real com grandezas físicas, que se manifestam na natureza com
uma representação analógica. Assim, o princípio de funcionamento de um conversor
A/D baseia-se na conversão dessas grandezas físicas (representadas por sinais
analógicos) para um formato digital antes de usá-las. Esse processo é conhecido
como conversão analógica/digital, ou simplesmente conversão A/D e consiste em:
• Amostrar o sinal em intervalos periódicos de tempo;
• Para cada amostra, quantizar o resultado (essencialmente, fixar o
número de casas decimais na sua representação).
A resolução que está relacionada à quantização pode ser
determinada intuitivamente. Por exemplo, um sinal que tem uma amplitude mínima
de 0V e máxima de 900mV, pode ser representado como um valor inteiro de 0 a 900.
25

Para isso, bastam 10 bits (uma vez que 210 = 1024) para representar valores nesta
faixa. Porém, com relação à variação de amplitude, uma limitação prática é imposta
pela quantidade de ruído presente no sistema, como por exemplo, o ruído térmico de
um resistor. Dessa forma, deve-se considerar variações superiores ao nível de
tensão introduzido pelo ruído, pois, caso contrário, o cálculo de amplitude poderia
ser afetado.
A freqüência de amostragem pode ser determinada de forma mais
sistemática pelo teorema de amostragem de Nyquist-Shannon que afirma o
seguinte: se uma função contém componentes de freqüência limitadas a B Hz, a
amostragem com freqüência de pelo menos 2B Hz captura fielmente o sinal, sem
perda de informação.
Todos os membros da família STM32 possuem conversores A/D,
com resolução de 12 bits e taxa de amostragem de até 1MHz. Dependendo do
modelo, há até 3 conversores A/D distintos (que podem ser operados
simultaneamente), e por meio de multiplexação, pode haver até 21 pinos externos
para sinais analógicos (ST Microelectronics, 2011).
O conversor possui um procedimento de auto-calibração para
melhorar a precisão do sinal. Há também um mecanismo de acionamento externo de
conversões que pode ser por pinos externos, eventos do temporizador, etc.
Além dos canais externos (ligados a pinos do chip), há dois canais
internos, um conectado a uma tensão de referência e outro a um sensor de
temperatura.
Outros recursos presentes no conversor são: geração de
interrupções e requisições de DMA, um modo de varredura para aquisição de
diversos canais em seqüência, tempo de aquisição programável por canal, e um
“watchdog” analógico para monitorar se um sinal não foge de uma faixa pré-
determinada.
Para melhor visualização do diagrama de blocos do conversor A/D
consulte o Anexo E. Nele pode-se perceber a presença de pinos de alimentação
analógica e referência de tensão. Isso é feito para evitar poluir circuitos analógicos
de precisão com ruído de chaveamento digital.
26

2.6.1 Clock do Conversor A/D

O conversor A/D possui um sinal de clock específico chamado


ADCCLK cuja freqüência máxima é de 14MHz. A freqüência é relativamente mais
baixa se comparada à dos demais periféricos. Isso porque há a presença de
circuitos analógicos.
Este clock é derivado do clock do barramento APB2 e um prescaler
dedicado.

2.6.2 Tempo de Conversão

O tempo de conversão é programável e especificado em termos do


número de ciclos de clock do conversor A/D. Os valores aceitáveis são 1.5, 7.5,
13.5, 28.5, 41.5, 55.5, 71.5 e 239.5 ciclos. Depois de escolhido o valor, este deve ser
somado a 12.5 ciclos que é o tempo fixo de conversão. Dessa forma, o tempo
mínimo de conversão é de 12.5 + 1.5 = 14 ciclos, e como o clock máximo do
conversor é de 14MHz, chega-se ao tempo mínimo de conversão de 1µs.
Apesar da limitação da taxa de aquisição, dependendo da aplicação
é necessário usar um tempo de conversão maior, pois assim, a impedância de saída
do sinal conectado ao conversor A/D poderá ser maior também. Isso porque o bloco
de entrada do conversor A/D pode ser modelado como um filtro RC que se associa
com a impedância de saída do sinal, conforme ilustra a Figura 2.14. Portanto, quanto
mais tempo for dado para o capacitor do conversor se carregar (desde que o sinal
não varie dentro deste período), mais precisa será a leitura. A Tabela 2.3 mostra os
valores do número de ciclos e tempo de conversão em função da resistência de
entrada externa (ST Microelectronics, 2011).
27

Tabela 2.3 – Resistência de entrada externa máxima para freqüência do conversor igual a 14MHz.
TS (Ciclos) TS (µ
µs) RAIN max (kΩ
Ω)
1,5 0,11 0,4
7,5 0,54 5,9
13,5 0,96 11,4
28,5 2,04 25,2
41,5 2,96 37,2
55,5 3,96 50
71,5 5,11 NA
239,5 17,1 NA

Figura 2.14 – Bloco de entrada do conversor A/D.

2.6.3 Acionamento Externo

O acionamento externo é utilizado para efetuar aquisições com uma


dada freqüência de amostragem. A conversão A/D pode ser feita manualmente,
setando um bit num registrador específico, ou através de uma interrupção gerada
pelo hardware de captura/comparação do temporizador. Nessa interrupção, pode-se
iniciar uma conversão. Contudo, a utilização desse método pode gerar jitter, pois a
interrupção pode ocorrer no momento em que outra interrupção já esteja sendo
executada.
Como a precisão do processo de conversão depende de um controle
preciso da freqüência de amostragem, os projetistas do STM32 criaram uma
maneira de iniciar a conversão sem a intervenção do software. Isso é feito utilizando
alguns canais de captura/comparação dos temporizadores TIM1, TIM2 e TIM4 que
podem acionar o bloco de canais regulares do conversor. Essa interface direta entre
28

o temporizador e o conversor A/D elimina estas variações inerentes ao


compartilhamento de tempo entre os diversos trechos do software que buscam
atenção imediata do processador (ST Microelectronics, 2011).
Depois da conversão, é necessário fazer algum tipo de
processamento, ou mesmo uma simples cópia do dado convertido. Pode-se usar
para isso os recursos de geração de interrupção ou requisição de DMA do
conversor. Assim, a interrupção só é gerada após o fim da conversão, e a precisão
dos dados não é perdida se a interrupção for tratada com atraso.

2.7 AMBIENTE DE DESENVOLVIMENTO

A interface entre o programador e o hardware é feita por um


software chamado de IDE (Integrated Development Environment). Este software
serve como um ambiente de desenvolvimento de projeto, edição, compilação,
simulação e depuração do firmware embarcado no microcontrolador. Dentre as
diversas alternativas de software para esta função foi escolhido o Rowley
Crossworks devido ao seu suporte ao programador Olimex ARM-USB-TINY, que é
um dos programadores mais baratos disponíveis no mercado. A Figura 2.15 mostra
a tela inicial do Rowley Crossworks.
29

Figura 2.15 – Tela inicial do Rowley Crossworks.

O fluxo de trabalho no Rowley Crossworks pode ser resumido da


seguinte forma:
1. Criar um projeto, ou abrir um projeto já existente;
2. Realizar configurações específicas à placa e ao firmware nas
opções do ambiente;
3. Escrever o código em linguagem C ou C++;
4. Compilar o código e corrigir eventuais erros;
5. Programar o binário (resultado da compilação do código) na
memória do microcontrolador;
6. Depurar o código para eliminação de eventuais erros.

2.8 BIBLIOTECA DE FIRMWARE PARA A FAMÍLIA STM32 FORNECIDA PELA ST


MICROELECTRONICS

Em baixo nível, a programação de periféricos em microcontroladores


geralmente consiste em modificar valores em registradores mapeados na memória,
30

seja para configuração ou transferência de dados. Porém, esta tarefa mostra-se


trabalhos e propensa a erros.
Como alternativa, a ST Microelectronics fornece uma biblioteca-
padrão para acesso aos periféricos, que fornece funções direcionadas a tarefas de
alto nível (como por exemplo configurar e habilitar um periférico). O uso desta
biblioteca aumenta consideravelmente a produtividade do programador, permitindo
que o mesmo se concentre na sua aplicação, e não em detalhes de baixo nível do
hardware.

2.9 O PROGRAMADOR JTAG OLIMEX ARM-USB-TINY

Nos microcontroladores ARM há um conector de programação


dedicado para In-Circuit Programming, ou seja, programação do microcontrolador
diretamente na sua placa, ou no kit de desenvolvimento nesse caso, sem
necessidade de remoção do microcontrolador da placa para programação como
acontecia no passado. O padrão que será utilizado no microcontrolador nesse
ambiente de desenvolvimento é o JTAG (Joint Test Action Group), mostrado na
Figura 2.16.

Figura 2.16 – O programador JTAG Olimex ARM-USB-TINY.

Este programador é conectado ao computador por meio de uma


porta USB, e a conexão à placa é feita por um flat cable de 2 x 10 pinos que pode
ser visto na figura. Após a conexão, é possível realizar, além da programação do
microcontrolador, a depuração in-circuit, ou seja, na própria placa.
31

3 DESENVOLVIMENTO PRÁTICO

Primeiramente foram implementados dois circuitos geradores de


sinais elétricos, que posteriormente serão amostrados, além de calculados a
freqüência, razão cíclica e amplitude da onda quadrada, que serão mostradas em
quatro displays de sete segmentos. Para isso, será utilizado um microcontrolador da
família STM32.

3.1 GERADORES DE SINAIS DE FREQÜÊNCIA E RAZÃO CÍCLICA VARIÁVEIS

A Figura 3.1 mostra um circuito gerador de ondas quadrada e


triangular, construído a partir do amplificador operacional LM324. Uma ampla
variedade de faixas de freqüências de saída podem ser obtidas dependendo da
escolha do capacitor C1, conforme mostra a Tabela 3.1.

Tabela 3.1 – Faixa de freqüência versus capacitor C1.

Faixa de freqüência Capacitor C1


0.5Hz – 5Hz 100µF
5Hz – 50Hz 10µF
50Hz – 500Hz 1µF
500Hz – 5kHz 0.1µF
5kHz – 50kHz 0.01µF
Acima de 50kHz 0.001µF

Para maiores freqüências deve-se utilizar menores capacitâncias,


além de selecionar um amp op que tenha alto slew rate. O potenciômetro de 25kΩ
(R1) é um controle fino de freqüência e o de 50kΩ (R2) é um controle de simetria
que permite variar a razão do tempo de cada alternância positiva para o tempo de
cada alternância negativa das formas de onda V0 (onda quadrada) e V’0 (onda
triangular).
32

Figura 3.1 – Gerador de ondas quadrada e triangular com Amp Op LM324.

Assim, a saída V’0 pode ser alterada de uma onda triangular para
uma onda dente de serra pelo controle de simetria feito pelo potenciômetro R2. O
capacitor C2 determina a amplitude de V’0. Geralmente, o capacitor C2 deve ser
maior com freqüências de saída menores. Se C2 for muito pequeno, a saída V’0
torna-se cortada porque a saída do Amp Op satura em cada alternância. Se C2 é
muito grande, a amplitude de V’0 torna-se pequena, especialmente em altas
freqüências.
A Figura 3.2 mostra as saídas V0 e V’0 correspondentes ao circuito
da Figura 3.1, resultado da simulação no software OrCAD.
33

20V

10V

0V

-10V

-20V
100ms 120ms 140ms 160ms 180ms 200ms 220ms 240ms 260ms 280ms 300ms
V(D4:1) V(U1D:OUT)
Time

Figura 3.2 – Saídas V0 e V’0 do circuito gerador de funções que correspondem às ondas quadradas e
triangular, respectivamente.

3.2 GERADOR DE FUNÇÕES UTILIZANDO O CIRCUITO INTEGRADO XR-2206

O circuito integrado XR-2206 da EXAR é um gerador de funções


monolítico capaz de produzir sinal senoidal de alta qualidade, quadrado, triangular,
rampa, pulso e formas de onda de alta estabilidade e precisão. As formas de onda
de saída podem ser moduladas em amplitude e freqüência por uma tensão externa.
A freqüência de operação pode ser selecionada externamente em uma faixa de
0,01Hz a mais de 1MHz.
O circuito é idealmente adequado para comunicações,
instrumentação e aplicações de gerador de função que exigem tom senoidal, AM,
FM, ou geração FSK. Ele tem uma especificação de deriva de 200ppm/ºC. O
oscilador de freqüência pode ser varrido por uma faixa de freqüência acima de
2000:1 com uma tensão de controle externa, mantendo baixa distorção.
Segue abaixo algumas características importantes que tal circuito
apresenta:

• Baixa distorção da onda seno, 0,5%, típica;


• Excelente estabilidade de temperatura 20ppm/°C, típica;
• Ampla faixa de varredura, 2000:1, típica;
• Baixa sensibilidade de alimentação, 0,01V%, típica;
• Modulação de amplitude linear;
• Controles FSK compatíveis com TTL;
• Ampla faixa de alimentação, 10V a 26V;
34

• Razão cíclica ajustável, 1% a 99%.

Uma das formas de montagem do gerador de funções é sugerida no


datasheet e pode ser observada na Figura 3.3.

Figura 3.3 – Circuito gerador de ondas utilizando CI XR-2206.

A faixa de freqüência de saída dos sinais é uma função do capacitor


colocado entre os pinos 5 e 6, enquanto o valor da freqüência é ajustado pelo
resistor R1 que na verdade é um potenciômetro de 2MΩ, e o resistor de 1kΩ (juntos
fornecem a resistência R). O valor recomendado de R para uma dada faixa de
freqüência pode ser escolhido através da Figura 3.4. Para a estabilidade de
temperatura é ideal que 4kΩ<R<200kΩ. Valores recomendados de C são de 1000pF
a 100µF.
35

Figura 3.4 – R versus freqüência de oscilação.

A amplitude do sinal triangular ou senoidal de saída é ajustada pelo


potenciômetro de 50kΩ (R3) colocado no pino 3. A amplitude é inversamente
proporcional ao resistor R3, conforme pode ser observado na Figura 3.5. Para a
saída de onda senoidal, a amplitude de pico é de cerca de 60mV por kΩ de R3; para
triangular, a amplitude de pico é de aproximadamente 160mV por kΩ de R3. Assim,
por exemplo, R3 = 50kΩ produziria 3V de amplitude senoidal de saída. Já para a
onda quadrada, pode-se observar que o controle da amplitude é feito diretamente
pela tensão de entrada.

Figura 3.5 – Tensão de saída como uma função do resistor R3 colocado no pino 3.

O potenciômetro RA entre os pinos 15 e 16 faz o ajuste externo da


simetria. O conteúdo harmônico da saída senoidal pode ser reduzido para -0,5%. O
36

potenciômetro RA ajusta o resistor de formação do seno e RB fornece o ajuste fino


para a simetria da forma de onda. O procedimento de ajuste é o seguinte:
• Coloque o potenciômetro RB no meio e ajuste RA para que se
tenha uma distorção mínima;
• Com RA definido como acima, ajuste RB para reduzir ainda mais
a distorção.
O circuito da Figura 3.3 pode ser convertido em um gerador de
ondas triangulares simplesmente abrindo-se a chave S1 colocada entre os pinos 13
e 14. A amplitude do sinal triangular é aproximadamente duas vezes maior que a
amplitude do sinal senoidal.
Pode-se observar nas Figuras 3.6 e 3.7 o diagrama de blocos CI XR-
2206 e o circuito integrado, respectivamente. A Tabela 3.2 caracteriza cada pino do
CI.

Figura 3.6 – Diagrama de blocos do CI XR-2206.


37

Figura 3.7 – CI XR-2206.

Tabela 3.2 – Descrição dos pinos do CI XR-2206.

Pinos Símbolo Tipo Descrição


1 AMSI I Entrada de sinal de modulação de amplitude.
2 STO O Saída de onda senoidal ou triangular.
3 MO O Saída do multiplicador.
4 VCC Fonte de alimentação positiva.
5 TC1 I Entrada do capacitor de temporização.
6 TC2 I Entrada do capacitor de temporização.
7 TR1 O Saída do resistor 1 de temporização.
8 TR2 O Saída do resistor 2 de temporização.
9 FSKI I Entrada para mudança da freqüência de
chaveamento.
10 BIAS O Referência de tensão interna.
11 SYNCO O Saída de sincronização. Esta saída é
um coletor aberto e precisa de
um resistor pull-up para VCC.
12 GND Pino terra.
13 WAVEA1 I Entrada 1 de ajuste de forma de onda.
14 WAVEA2 I Entrada 2 de ajuste de forma de onda.
15 SYMA1 I Ajuste 1 de simetria da onda.
16 SYMA2 I Ajuste 2 de simetria da onda.
38

3.3 CIRCUITO ATENUADOR UTILIZANDO AMP OP

A implementação do circuito atenuador é necessária para limitar a


tensão do sinal de entrada, pois os GPIOs suportam uma tensão de no máximo 3,3V
e tensões superiores, como a amplitude dos sinais elétricos fornecidos pelos
circuitos geradores, poderiam danificar o microcontrolador.
Assim, para ambos os circuitos, a amplitude da onda quadrada é
controlada através da implementação de um circuito atenuador, utilizando o amp op
LM324 na condição de atenuação, conforme mostra a Figura 3.8.

Figura 3.8 – Circuito atenuador utilizando o CI LM324 com realimentação


negativa.

Para a configuração de circuito atenuador é necessário que RF seja


menor que Ri. Tal conclusão resulta da expressão de ganho do amp op (SEDRA,
2000):

v0 − RF
=
vi Ri

Como RF é menor que Ri, a razão v0/vi torna-se menor que um.
Assim, a amplitude do sinal de saída será menor se comparada ao sinal de entrada.
Na implementação, foi utilizado um resistor de 10kΩ para RF e um de 100kΩ para
Ri, resultando, teoricamente, em uma atenuação do sinal de entrada de 10 vezes.

3.4 O KIT DE DESENVOLVIMENTO OLIMEX STM32-P103

Depois de montado os dois circuitos geradores de sinais elétricos


analógicos, bem como o circuito atenuador, deve-se programar o microcontrolador
39

para calcular a freqüência, razão cíclica e amplitude dos sinais elétricos quadrados
gerados por eles. Em seguida, tais valores serão mostrados em quatro displays de
sete segmentos. O kit de desenvolvimento Olimex STM32-P103 pode ser visto na
Figura 3.9.

Figura 3.9 – Kit de desenvolvimento Olimex STM32-P103.

3.4.1 Programação do Microcontrolador para Cálculo da Freqüência

Para o cálculo da freqüência e da razão cíclica do sinal quadrado


será necessária a utilização do timer, GPIO, além do uso de interrupções. Como a
biblioteca-padrão fornece funções para acesso aos periféricos, seu uso possibilita as
configurações dos mesmos para a aplicação desejada.
Através da consulta à biblioteca-padrão, pode-se encontrar as
funções que serão usadas para calcular a freqüência e razão cíclica de um sinal em
um pino de entrada do GPIO, utilizando interrupções.
Primeiramente, precisa-se habilitar o periférico que será usado, ou
seja, o timer, para o modo de captura de entrada. Isto é feito através da seguinte
linha de código:
TIM_ICInitTypeDef_ICInitStructure;
40

Depois, deve-se habilitar o clock do timer da seguinte forma:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
Nota-se que o TIM1 foi habilitado. Este se encontra conectado no
barramento interno APB2 do processador.
O mesmo é feito para os GPIOs. O pino escolhido para a entrada do
sinal quadrado fornecido pelo circuito analógico foi o pino 8 (GPIOA). Este foi
configurado como pino de entrada e velocidade de 50MHz.
O próximo passo é a inicialização do periférico. Para o timer, cinco
parâmetros devem ser configurados:
1. Canal: especifica o canal do timer. Foram escolhidos os canais 1
e 2;
2. Polaridade: especifica a borda ativa para o canal de entrada. O
Canal 1 captura o valor do contador quando ocorre uma borda de
subida, e o canal 2 captura o valor do contador quando ocorre
uma borda de descida;
3. Seleção: especifica a entrada. O TIM1 está selecionado para ser
conectado a IC1 (Captura de Entrada 1) diretamente e IC2
(Captura de Entrada 2) indiretamente;
4. Divisor programável do clock do microcontrolador (Prescalers):
especifica a captura em função das bordas de subida ou descida.
Foi escolhida a opção DIV1 tanto para a borda de subida quanto
para a borda de descida. Isso significa que a captura é realizada
cada vez que uma borda é detectada na captura de entrada (IC);
5. Filtro: especifica o filtro de captura de entrada. Este parâmetro
pode ser um valor numérico entre 0x0 e 0xF. Foi adotado o
número 0x0.
A inicialização do timer deve terminar com a seguinte linha de
código:
TIM_ICInit(TIM1, &TIM_ICInitStructure;
Por fim, é necessário habilitar o contador do timer com a instrução
seguinte:
TIM_Cmd(TIM1, ENABLE);
Quanto à interrupção do timer, ela é habilitada quando for detectada
uma borda de subida ou descida, conforme programação mostrada abaixo:
41

TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);


Como haverá interrupção, é necessário habilitar a função NVIC
através da linha de código seguinte:
NVIC_EnableIRQ(TIM1_CC_IRQn);
No arquivo stm32f10x_it.h deve ser acrescentada a função:
void TIM1_CC_IRQHandler(void);
Esta função indica que haverá uma interrupção gerada por um
evento no timer no programa principal. Porém, a interrupção será tratada no arquivo
stm32f10x_it.c.
Quando a execução do programa é desviada para a função de
interrupção, deve-se fazer algumas verificações. A primeira delas consiste em
confirmar se tem ocorrido ou não uma interrupção no TIM1. Em seguida, limpa-se os
bits pendentes da interrupção do canal de captura e comparação (CC1) do TIM1.
Quando a variável responsável por guardar o valor capturado (CaptureNumber)
estiver vazia, obtém-se o valor do primeiro IC1 (borda de subida) do TIM1,
guardando-o em IC3ReadValue1, como mostrado abaixo:
IC3ReadValue1 = TIM_GetCapture1(TIM1);
A variável CaptureNumber passa a ter valor 1. Pode-se então obter
os valores que se referem à borda de descida e à borda de subida seguinte. A
variável IC3ReadValue2 obtém o valor do segundo IC1 (borda de subida seguinte do
TIM1), e a variável IC3ReadValue3 recebe o valor de IC2 (borda de descida entre as
duas bordas de subida seqüenciais do TIM1). Dessa forma, a diferença
IC3ReadValue2 – IC3ReadValue1 fornece o número de ciclos correspondente ao
período do sinal.
Com o intuito de aumentar a precisão da freqüência do sinal, uma
quantidade de 1000 números de ciclos referentes a um período são adicionados e
acumulados na variável soma. Para isso, foi criado um contador na rotina de
interrupção. Quando este contador estourar, ou seja, atingir o valor 1000, o
programa principal faz o cálculo da freqüência. Para obtê-la, faz-se a divisão do
resultado da variável soma por 1000. O valor resultante foi colocado na variável
media. Em seguida dividi-se a freqüência de clock do microcontrolador (72MHz) pela
variável media (que corresponde a um valor mais exato do número de ciclos de um
período). Tal divisão fornece o valor da freqüência do sinal de entrada. A freqüência
é guardada na variável frequencia.
42

3.4.2 Programação do Microcontrolador para Cálculo da Razão Cíclica

Em relação à razão cíclica, esta também é calculada quando ocorre


o estouro do contador, no mesmo programa de cálculo de freqüência. A função de
interrupção passa para o programa principal a subtração IC3ReadValue3 –
IC3ReadValue1 (diferença do número referente à borda de descida do número
correspondente à borda de subida anterior, ou seja, a duração do pulso) na variável
x:
x = IC3ReadValue3 – IC3ReadValue1;
A variável y recebe a diferença entre a primeira e a segunda borda
de subida, isto é, o período:
y = IC3ReadValue2 – IC3ReadValue1;
No programa principal, tais valores são passados para as variáveis
x1 e y1, e a divisão de x1 por y1 fornece o valor da razão cíclica, que é guardado na
variável banda.
O fluxograma da Figura 3.10 resume os cálculos realizados na rotina
de interrupção do programa que calcula a freqüência e a razão cíclica do sinal
quadrado/retangular:
43

Figura 3.10 – Fluxograma descrevendo metodologia para o cálculo de freqüência e razão cíclica.

O programa completo que realiza o cálculo da freqüência e da razão


cíclica do sinal pode ser consultado no Anexo F.

3.4.3 Programação do Microcontrolador para Cálculo da Amplitude

Antes da programação do microcontrolador para o cálculo da


amplitude, foi necessário implementar um circuito analógico detector de pico, já que
os sinais fornecidos pelos circuitos geradores são alternados. Assim, foi montado um
detector de pico conforme mostrado na Figura 3.10.
44

Figura 3.11 – Detector de pico.

O detector de pico tem seu princípio de funcionamento semelhante


ao do retificador de precisão de meia onda. A única diferença é que o resistor é
substituído por um capacitor.
Para Ventrada positiva, o diodo conduz e pode ser considerado com
um “curto circuito” para fins de análise do circuito. O amp op fornece a tensão
necessária à polarização do diodo e funciona como amplificador de ganho unitário,
isto é, Ventrada = Vsaída. Para Ventrada negativa, o diodo corta e pode ser considerado
como um “circuito aberto”. O amp op satura em uma tensão negativa que é
insuficiente para polarização reversa do diodo. Como não há corrente, Vsaída = 0
(SEDRA, 2000).
O diodo utilizado é o do tipo rápido (1N4148) e o capacitor é de
10µF.
Devido à entrada do conversor A/D ser modelada por um filtro RC, o
sinal de saída do circuito retificador de pico passa por um buffer para isolar
eletricamente os circuitos e melhorar a qualidade do sinal.
Depois de montado o detector de pico e o buffer foi escrita a rotina
de programação para o cálculo da amplitude.
Inicialmente deve-se configurar o GPIO associado ao pino que será
convertido. Usa-se o modo GPIO_Mode_AIN para o pino em questão. Em seguida,
configura-se o clock do conversor A/D, garantindo um clock máximo de 14MHz,
conforme o código abaixo:
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
45

Também é preciso habilitar o clock do periférico, por meio do


seguinte código:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
Depois, inicializa-se o conversor A/D através de parâmetros
fornecidos pela biblioteca-padrão e que podem ser vistos no Anexo G.
É importante acrescentar que o conversor A/D pode ser usado em
conjunto com o periférico de captura/comparação de um temporizador que funciona
como trigger externo, ou seja, o timer gera uma onda em certa freqüência, que
determina o instante que se inicia a conversão.
Geralmente, com o uso do trigger externo, é necessário fazer polling
sobre a flag de término da conversão, isto é, um loop ou laço verifica
continuadamente a ocorrência de um evento, o que dispensa o uso de interrupções.
Porém, este estilo de programação despende um tempo de processamento maior
pelo microcontrolador.
Para habilitar o conversor A/D, usa-se o código abaixo:
ADC_Cmd(ADC1, ENABLE);
Como o valor convertido está na base binária é necessário calcular o
valor decimal correspondente antes de amostrar o valor de amplitude no display. A
função ADC_GetConversionValue(ADC1) obtém o valor convertido.
O fluxograma da Figura 3.12 resume as tarefas realizadas no
programa para a aquisição do valor da tensão de pico do sinal de entrada:

Figura 3.12 – Configurações do microcontrolador para o cálculo da amplitude do sinal.


46

O código completo do programa para cálculo de amplitude pode ser


visto no Anexo G.

3.4.4 Programação dos GPIOs para o Funcionamento do Display

A metodologia abordada para que se amostrassem valores de


freqüência, razão cíclica e amplitude em um arranjo de 4 displays de 7 segmentos foi
elaborada seguindo critérios que contemplassem as características mostradas na
Figura H.2 do Anexo H, onde é detalhado o princípio de funcionamento do display.
As etapas para esta amostragem são descritas a seguir:
• Seleção individual do display: programa-se o microcontrolador
para que este forneça um nível lógico alto (‘1’) à uma das
entradas de seleção do display, que o tornará ativo enquanto o
processador executa uma determinada seqüência de códigos. O
trecho de código abaixo exemplifica a seleção do display A0, que
deverá informar o valor do último dígito do valor do parâmetro
amostrado.

GPIO_SetBits(GPIOC, GPIO_Pin_0);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);

Nota-se que é preciso configurar quatro pinos do microcontrolador


para selecionar o display desejado. Da mesma forma deve ser feito para se ativar os
demais displays, fornecendo um sinal lógico alto às portas A1, A2 ou A3.
• Valor do dígito a ser amostrado: Os parâmetros analisados
poderão ser amostrados em 4 dígitos. O resto da divisão do
parâmetro por 10 corresponde ao valor que deverá ser visto no
display A0, e este valor deverá ser enviado através de 4 bits
pelas GPIOs de forma paralela. O trecho de código que converte
os dados binários de serial para paralelo é mostrado abaixo
(HENNEFELD, 1998).

if (((frequencia%10) & 1) == 1)
47

GPIO_SetBits(GPIOC, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
if (((frequencia%10) & 2) == 2)
GPIO_SetBits(GPIOC, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
if (((frequencia%10) & 4) == 4)
GPIO_SetBits(GPIOC, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
if (((frequencia%10) & 8) == 8)
GPIO_SetBits(GPIOC, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_7);

Desta forma é possível enviar um bit por cada pino das GPIOs, que
fornecerão o valor binário que o CI 7447 necessita para ativar os segmentos
necessários do display para compor o dígito correspondente.
O código completo para amostrar o valor do parâmetro nos quatro
displays de sete segmentos é mostrado no Anexo I.
48

4 RESULTADOS E DISCUSSÃO

Primeiramente, serão mostrados e discutidos os resultados


referentes aos circuitos analógicos, que correspondem às Figuras 3.1 e 3.3,
respectivamente. Estes fornecerão os sinais de entrada do microcontrolador. Em
seguida, serão apresentados os resultados obtidos do microcontrolador.

4.1 CIRCUITO GERADOR DE SINAIS UTILIZANDO AMP OP

Diferentemente do circuito simulado da Figura 3.1, o circuito real


montado em laboratório teve o capacitor C2 de 200nF substituído por uma
associação de dois capacitores em paralelo, um de 0,47µF, e outro de 1,8nF,
resultando em uma capacitância equivalente de 471,8nF. Esta alteração foi
necessária, pois C2 determina a amplitude de V’0 e, dependendo da faixa de
freqüência estabelecida por C1, a saída V’0 pode ser cortada se C2 for muito
pequeno, conforme pode ser visto na Figura 3.2. Ou, se C2 for muito grande a
amplitude de V’0 torna-se pequena, especialmente em altas freqüências. Por isso,
por tentativas, chegou-se a um valor adequado de C2.
Além disso, os potenciômetros de 25kΩ e 50kΩ foram substituídos
pelos valores comerciais que correspondem a 22kΩ e 47kΩ, respectivamente. Pelo
mesmo motivo, o resistor de 80kΩ, foi substituído por um de 82kΩ.
A Figura 4.1 mostra os sinais de saída V0 (sinal quadrado) e V’0
(sinal triangular). Para a onda quadrada, obteve-se uma freqüência mínima de 30Hz
(com um pouco de distorção), e uma máxima de 550Hz. A amplitude medida foi de
33,8 V pico a pico. Em relação à onda triangular, a freqüência mínima foi de 110Hz e
a máxima atingiu 530Hz. Já a amplitude da onda triangular alcançou 17,8V pico a
pico. Pode-se observar na Figura 4.1 que, naquele instante, a freqüência da onda
quadrada era de 537,4Hz e a tensão de pico a pico era de 33,4V.
49

Figura 4.1 – Sinais de saída V0 (onda quadrada) e V’0 (onda triangular) referentes ao circuito da
Figura 3.1.

Pode-se notar na Figura 4.2 que quando a amplitude da onda


quadrada for de 33,4V, a amplitude da onda triangular chega a 3,76V.
50

Figura 4.2 – Tensão pico a pico do sinal triangular.

Conforme dito anteriormente, o potenciômetro R2 regula a razão


cíclica da onda quadrada, o que pode ser visto na Figura 4.3, onde enquanto a
largura de pulso positiva é de 1,172ms, a largura de pulso negativa é de 731,7µs.
51

Figura 4.3 – Variação da razão cíclica da onda quadrada.

O circuito da Figura 3.1 apresentou facilidade de montagem, pois


utiliza componentes comuns. A fonte de alimentação simétrica fornece a tensão
necessária para a alimentação do Amp Op cuja faixa de tensão varia de ±16 até
32V. O circuito oferece dois tipos de controle, um controle fino de freqüência feito
pelo potenciômetro R1 e um controle da razão cíclica feito pelo potenciômetro R2.
Além disso, devido ao fato da utilização de um número reduzido de
componentes, o circuito mostrou-se relativamente pequeno. A variação de
temperatura é de 0ºC a +70ºC. Levando em conta as funcionalidades do circuito,
pode-se dizer que o custo foi bastante apropriado e apresentou grande facilidade de
uso.

4.2 CIRCUITO GERADOR DE SINAIS UTILIZANDO O CI XR-2206

Já em relação o circuito da Figura 3.3, também foi necessário


realizar algumas alterações, devido a não existência de determinados valores
comercialmente. Os potenciômetros de 2MΩ (R1), 500Ω (RA) e 25kΩ (RB) foram
substituídos por outros de 2,2MΩ, 470Ω e 22kΩ, respectivamente. Além disso,
ambos os resistores de 5,1kΩ foram trocados por dois resistores em série, um de
52

4,7kΩ, e um de 390Ω, o que constitui uma resistência equivalente de 5,09kΩ. Para a


alimentação do CI XR-2206, foi utilizada uma fonte simétrica de ±18V.
Entre os pinos 5 e 6 do CI deve ser colocado um capacitor que irá
determinar a faixa de freqüência de trabalho, juntamente com a resistência
equivalente fornecida pelo potenciômetro de 2,2MΩ e o resistor de 1kΩ, ambos em
série na porta 7. Por essa razão, foi feito inicialmente um estudo da freqüência
mínima dos sinais de saída para quatro valores de capacitâncias diferentes: 470pF,
1nF, 1,5nF e 4,7nF. A fórmula utilizada é mostrada abaixo:

1
f mín =
R2 × C

Para se obter a freqüência mínima, o valor de R2 deve ser máximo,


ou seja, 2,2MΩ. Os resultados são apresentados na Tabela 4.1.

Tabela 4.1 – Capacitor de temporização versus freqüência mínima.

Capacitor f mín

470pF 966,68Hz
1nF 454,34Hz
1,5nF 302,89Hz
4,7nF 96,68Hz

Em seguida, com o uso do osciloscópio, foram observadas as


freqüências máximas e mínimas para cada um dos quatro valores de capacitância.
Pode-se observar os resultados na Tabela 4.2.
53

Tabela 4.2 – Faixas de freqüências em função do capacitor de temporização.

Tipo de sinal Capacitor f mín f máx

Quadrada 470pF 1,235kHz 5,5kHz


1nF 590Hz 10,25kHz
1,5nF 400Hz 10kHz
4,7nF 140Hz 8kHz
Triangular 470pF 1,235kHz 367kHz
1nF 590Hz 150kHz
1,5nF 400Hz 110kHz
4,7nF 140Hz 100kHz
Senoidal 470pF 1,235kHz 1,248MHz
1nF 590Hz 1,145MHz
1,5nF 400Hz 488,3kHz
4,7nF 140Hz 203,7kHz

Vale observar que os valores registrados na Tabela 4.2


correspondem às freqüências onde não era observado nenhum tipo de distorção do
sinal.
Por último, as formas de onda do circuito foram observadas no
osciloscópio e adotou-se o valor de 1nF para o capacitor colocado entre os pinos 5 e
6.
A Figura 4.4 mostra a onda quadrada (pino 11 do CI) num
determinado instante de tempo. Nela, observa-se uma freqüência de 589,6 Hz
(freqüência mínima) e uma tensão de pico a pico de 17V (amplitude
aproximadamente máxima para uma tensão de alimentação de 18V).
54

Figura 4.4 – Sinal de saída quadrado em baixa freqüência.

Variando-se o potenciômetro de 2,2MΩ, pode-se alcançar


freqüências maiores, conforme pode ser visto na Figura 4.5, onde a freqüência é de
3,795kHz.
55

Figura 4.5 – Sinal de saída quadrado em freqüência maior.

Para os demais sinais, além da variação de freqüência, é possível


também modular a amplitude através do potenciômetro de 50kΩ (R3). Observando
as formas de onda no osciloscópio, foram obtidos os valores de amplitude máximos
e mínimos tanto para o sinal senoidal, quanto para o sinal triangular, mostrados na
Tabela 4.3.

Tabela 4.3 – Amplitude dos sinais senoidal e triangular.

Sinal Tensão mínima (Vpp) Tensão máxima (Vpp)


Senoidal 0,018 9
Triangular 0,023 13

O sinal senoidal corresponde ao pino 2 do CI, e a Figura 4.6 mostra


tal sinal. Nota-se uma freqüência de 722,5Hz e uma tensão de pico a pico de
516mV.
56

Figura 4.6 – Sinal de saída senoidal com freqüência e amplitude pequenas.

Variando-se o potenciômetro de 2,2MΩ e o de 50kΩ, altera-se o


valor da freqüência e da amplitude do sinal senoidal, respectivamente, conforme
pode ser comprovado na Figura 4.7, onde o valor de freqüência chega a 9,086kHz e
o valor de amplitude alcança 3,36V pico a pico.
57

Figura 4.7 – Sinal de saída senoidal com freqüência e amplitude maiores.

Abrindo-se a chave S1, colocada entre os pinos 13 e 14 do CI,


obtém-se no pino 2 uma onda triangular. Assim como a onda senoidal, a onda
triangular pode ser modulada em amplitude e freqüência. As Figuras 4.8 e 4.9
mostram a onda triangular em dois instantes diferentes. No primeiro deles, a
freqüência é de 589,6Hz e a amplitude é de 864mV. No seguinte (Figura 4.9), a
freqüência aumentou para 4,596kHz e a amplitude para 2,60V pico a pico.
58

Figura 4.8 – Sinal de saída triangular com freqüência e amplitude baixas.

Figura 4.9 – Sinal de saída triangular com freqüência e amplitude maiores.

O circuito da Figura 3.3 mostrou-se relativamente mais complexo do


que o circuito da Figura 3.1, tanto em relação à montagem quanto em relação à
59

aquisição dos componentes necessários. Porém, os sinais elétricos gerados foram


bem mais estáveis e precisos, caracterizando um fato importante, já que o
microprocessador necessita de sinais bem definidos. Diferente do circuito da Figura
3.1, o CI XR-2206 é alimentado por uma fonte de tensão contínua cuja faixa de
tensão é menor, variando de 10V a 26V. O circuito oferece cinco tipos de controle,
uma chave S1 que permite a escolha entre um sinal de saída senoidal ou um sinal
de saída triangular, um controle de freqüência feito pelo potenciômetro R1, um
controle de amplitude das ondas triangular e senoidal feito pelo potenciômetro R3,
RA ajusta o resistor de formação do seno (simetria do sinal) e RB fornece o ajuste
fino para a simetria da forma de onda.
O circuito utilizou um número maior de componentes, porém também
se mostrou relativamente pequeno. A variação de temperatura é a mesma que a do
circuito da Figura 3.1 (0ºC a +70ºC). Observou-se também uma grande facilidade de
uso, mas o custo final foi bem maior.

4.3 CIRCUITO ATENUADOR UTILIZANDO AMP OP

Como o sinal quadrado de ambos os circuitos serão processados


pelo microcontrolador para o cálculo da freqüência, razão cíclica e amplitude, é
necessário limitar a amplitude do sinal para que os GPIOs não sejam queimados,
pois suportam uma tensão máxima de apenas 3,3V. Por esse motivo, foi
implementado um circuito atenuador. Sua eficiência pode ser comprovada na Figura
4.10. Nota-se que a amplitude de 17,4Vpp foi reduzida para 2,8Vpp.
60

Figura 4.10 – Sinal de saída do circuito atenuador comparado ao sinal de entrada.

4.4 ANÁLISE E LEITURA DOS RESULTADOS DE FREQÜÊNCIA

Depois de implementados os circuitos geradores de sinais


quadrados, basta aplicar o sinal desejado no pino do microcontrolador que foi
programado como entrada, para que sejam calculadas a freqüência e a razão cíclica.
No código de programação, além do pino de captura do sinal, são programados
outros dez pinos como saída, para que os valores correspondentes de freqüência e
razão cíclica sejam mostrados nos quatros displays de sete segmentos.
O sinal quadrado atenuado de 2,8Vpp exibido na Figura 4.10 foi
utilizado como sinal de entrada do pino 8, GPIO A, ou seja, pino PA8. A freqüência
do sinal foi variada para 5,5kHz com o auxílio do osciloscópio. Depois de calculada a
freqüência pelo microprocessador, esta foi mostrada no display com o valor igual a
5445Hz, como pode ser confirmado na Figura 4.11.
61

Figura 4.11 – Valor de freqüência calculado pelo microcontrolador.

Depois, a freqüência foi ajustada para 9,8kHz e novamente o


microcontrolador calculou o valor de freqüência e o mostrou no display, conforme
pode ser visto na Figura 4.12.
62

Figura 4.12 – Outro valor de freqüência calculado pelo microcontrolador.

No desenvolvimento do trabalho, o display foi inicialmente


alimentado por um GPIO que fornece uma tensão de 3,3V. Porém, para esta tensão
a luminosidade do display era baixa. Assim, foi necessário alimentá-lo através de
uma fonte de tensão contínua que fornecia 5V (com o mesmo ponto de terra do
microcontrolador). Além disso, foi criado um atraso na rotina de amostragem dos
valores em cada display, pois uma multiplexagem rápida impossibilitaria a
visualização dos quatro dígitos simultaneamente.

4.5 ANÁLISE E LEITURA DOS RESULTADOS DE RAZÃO CÍCLICA

Na mesma rotina de cálculo de freqüência, é calculada também a


razão cíclica. Dessa forma, foram feitos pequenos ajustes no código para que fosse
mostrada a razão cíclica ao invés da freqüência. Para aumentar a precisão do valor,
foram utilizados os quatro displays. Mas, como o segmento do display
correspondente ao ponto decimal não está ativo, deve-se considerar apenas os dois
primeiros dígitos como a parte inteira do valor, enquanto os dois outros
correspondem à parte decimal. Por exemplo, se o display mostrar o valor 5578, a
razão cíclica correspondente será 55,78%.
63

As Figuras 4.13 e 4.14 ilustram o funcionamento do microcontrolador


para o cálculo da razão cíclica em duas situações diferentes.

Figura 4.13 – Razão Cíclica de 50,39%.

Figura 4.14 – Razão Cíclica de 70,07%.


64

O sinal quadrado utilizado no pino de entrada do microcontrolador


para o cálculo da razão cíclica foi fornecido pelo circuito da Figura 3.1 e atenuado
pelo circuito da Figura 3.8.

4.6 CIRCUITO DETECTOR DE PICO UTILIZANDO AMP OP

Para a leitura de amplitude do sinal, foi implementado o circuito


detector de pico da Figura 3.10, para que o microcontrolador pudesse calcular a
amplitude dos sinais quadrado, triangular e senoidal dos circuitos geradores de
sinais. Como o microcontrolador suporta uma tensão na faixa de 0 a 3,3V,
novamente o circuito atenuador deverá ser usado para os sinais que não possuem
controle de amplitude, e a leitura desta ficará limitada àquela faixa. A Figura 4.15
valida a eficiência do detector de pico para a onda quadrada fornecida pelo circuito
da Figura 3.1.

Figura 4.15 – Detecção de pico do sinal quadrado gerado pelo circuito da Fig. 3.1.

O mesmo ocorre para os sinais gerados pelo circuito da Figura 3.3.


As Figuras 4.16, 4.17 e 4.18 mostram a tensão de pico dos sinais quadrado,
senoidal e triangular, respectivamente.
65

Figura 4.16 – Tensão de pico do sinal quadrado.

Figura 4.17 – Tensão de pico do sinal senoidal.


66

Figura 4.18 – Tensão de pico do sinal triangular.

Observa-se a presença de um nível DC de tensão tanto para a onda


senoidal, quanto para a onda triangular. Por essa razão, foi implementado um filtro
passa baixas (FPB) para eliminar essa tensão.

4.7 ANÁLISE E LEITURA DOS RESULTADOS DE AMPLITUDE

Então, a tensão de pico do sinal senoidal, livre do nível de tensão


DC, foi aplicada no pino 0, GPIOB (PB0). A rotina para cálculo da amplitude do sinal
foi testada para os seguintes valores de tensão de pico: 0,09V, 1,4V e 2,7V,
obtendo-se os resultados apresentados nas Figuras 4.19, 4.20 e 4.21,
respectivamente. Novamente, como o ponto decimal não está ativo nos displays de
sete segmentos, é necessário assumir valor inteiro para o primeiro display.
67

Figura 4.19 – Amplitude da onda senoidal de 0,087V.

Figura 4.20 – Amplitude da onda senoidal de 1,443V.


68

Figura 4.21 – Amplitude da onda senoidal de 2,627V.

Observa-se que assim como a freqüência, a precisão é de 3 casas


demais.
69

5 CONCLUSÃO

Inicialmente encontrou-se grandes dificuldades para implementar um


circuito analógico que gerasse ondas quadradas que pudessem ser moduladas em
amplitude. O circuito gerador de sinais construído com o CI XR-2206 permite o
controle de amplitude apenas para as ondas senoidal e triangular. A tensão de pico
a pico da onda quadrada assume valor próximo à tensão de alimentação do CI. O
mesmo ocorre para o circuito gerador de sinais construído com o CI LM324 que não
possui controle de amplitude para as ondas geradas. Como alternativa, foi
implementado um circuito atenuador com Amp Op, para que a tensão de pico a pico
fosse reduzida para uma faixa de tensão aceitável para o GPIO do microcontrolador.
No decorrer do desenvolvimento do trabalho, surgiu também um
problema na amostragem dos valores nos displays de sete segmentos. Como eles
são multiplexados, ou seja, são ativados um por vez, foi preciso gerar um atraso na
função de amostragem, de forma que o algarismo mostrado no display
permanecesse “aceso” por um tempo suficiente para que fosse identificado pelos
olhos do usuário.
Os circuitos analógicos geradores de sinais mostraram-se eficientes,
pois permitiram um controle preciso de frequência, amplitude e razão cíclica pelo
usuário. Além disso, proporcionavam uma ampla faixa numérica para a variação dos
parâmetros. Os sinais mostraram-se estáveis, precisos e livres de ruídos, o que
caracterizou uma boa leitura pelo microcontrolador.
A utilização do microcontrolador adotado pode ser considerada
bastante satisfatória, uma vez que forneceu inúmeras ferramentas que auxiliaram no
tratamento e análise dos sinais, tornando possível a mensuração dos parâmetros
observados de forma clara e coerente. Isto facilitou tanto a interface com o usuário,
quanto com os demais circuitos implementados.
Também é importante salientar que as necessidades do projeto
foram atendidas, fornecendo dados com três dígitos de precisão, sobretudo no que
se refere ao cálculo de freqüência efetuado por algoritmos executados de forma
clara, devido ao uso de bibliotecas-padrão.
70

5.1 TRABALHOS FUTUROS

Como trabalhos futuros são propostos:


• Implementação de uma única rotina de programação que faça
todos os cálculos dos parâmetros dos sinais simultaneamente,
além de otimizá-la.
• Programação de um display alfa-numérico para que os valores
sejam mostrados simultaneamente, aumentando também o
número de dígitos mostrados. Com isso, a leitura poderá ser
mais precisa.
• Implementação de circuitos que gerem sinais com maiores faixas
de freqüência e amplitude.
71

REFERÊNCIAS

1. HENNEFELD, J. O.; BURCHARD, C. Using C++: An Introduction to


Programming. PWS Publishing Company, 1998.

2. ST MICROELECTRONICS. Reference Manual of STM32F103RB. Revisão


14, Maio, 2011.

3. ROAD, W. L. The Insider’s Guide To The STM32 ARM Based


Microcontroller. University Of Warwick Science Park, United Kingdon, 2008.

4. SEDRA, A. S.; SMITH, K. C. Microeletrônica. 4ª ed. São Paulo: Makron


Books, 2000.

5. TOCCI, R. J.; WIDMER, N.S. Sistemas Digitais: Princípios e Aplicações. 7ª


ed. Rio de Janeiro: JC Editora, 2000.
72

ANEXOS
73

ANEXO A
Distribuição dos periféricos pelos canais do DMA1

Figura A.1 – Distribuição dos periféricos pelos canais do DMA1.


74

ANEXO B
Distribuição dos periféricos pelos canais do DMA2

Figura B.1 – Distribuição dos periféricos pelos canais do DMA2.


75

ANEXO C
Diagrama de blocos do periférico USART

Figura C.1 – Diagrama de blocos do periférico USART.


76

ANEXO D
Canal de captura/comparação do periférico temporizador

Figura D.1 – Canal de captura / comparação do periférico temporizador.


77

ANEXO E
Diagrama de blocos do conversor A/D

Figura E.1 – Diagrama de blocos do conversor A/D.


78

ANEXO F
Programa para cálculo da freqüência e razão cíclica

• main.c
#include "stm32f10x.h"
#include <cross_studio_io.h>
#include <math.h>

TIM_ICInitTypeDef TIM_ICInitStructure;

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
int contador=0;
int soma=0;
int x=0;
int y=0;
int banda;

int main(void)
{

int teste;
int frequencia;
float media;
float x1,y1;

RCC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInit(TIM1, &TIM_ICInitStructure);

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;

TIM_ICInit(TIM1, &TIM_ICInitStructure);

TIM_Cmd(TIM1, ENABLE);

TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);

while (1)
{

while(contador<1000)
79

/* Rotina para amostragem dos valores de freqüência, razão cíclica e amplitude no


display */

media = soma/1000.0;
frequencia = 72000000.0 / media;
y1=y;
x1=x;
banda = x1/y1;
debug_printf("frequencia = %d\n banda = %f\n ", frequencia, banda);
soma=0;
contador=0;

void RCC_Configuration(void)
{
/* TIM1 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

/* GPIOA clock enable */


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* TIM1 channel 1 pin (PA.08) configuration */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configuração dos GPIOs de saída para o display */


}

void NVIC_Configuration(void)
{
NVIC_EnableIRQ(TIM1_CC_IRQn);
}

• stm32f10x_it.h
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H
#include "stm32f10x.h"

void TIM1_CC_IRQHandler(void);

• stm32f10x_it.c
80

#include "stm32f10x_it.h"

__IO uint16_t IC3ReadValue1 = 0, IC3ReadValue2 = 0;


__IO uint16_t IC3ReadValue3 = 0;
__IO uint16_t CaptureNumber = 0;
__IO uint32_t Capture = 0;

extern int contador;


extern int soma;
extern float banda;
extern int x,y;

void TIM1_CC_IRQHandler(void)
{

if(TIM_GetITStatus(TIM1, TIM_IT_CC1) == SET)


{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
if(CaptureNumber == 0)
{
IC3ReadValue1 = TIM_GetCapture1(TIM1);
CaptureNumber = 1;
}
else if(CaptureNumber == 1)
{
IC3ReadValue2 = TIM_GetCapture1(TIM1);
IC3ReadValue3 = TIM_GetCapture2(TIM1);
if (IC3ReadValue2 > IC3ReadValue1)
{
Capture = (IC3ReadValue2 - IC3ReadValue1);
}
else
{
Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
}
if(contador!=1000)
{
soma=soma+Capture;
contador=contador+1;
if (IC3ReadValue2 > IC3ReadValue1)
{
x=IC3ReadValue3-IC3ReadValue1;
y=IC3ReadValue2-IC3ReadValue1;
}
CaptureNumber = 0;
}
}
}
}
81

ANEXO G
Programa para o cálculo da amplitude

Como o código não necessitava de interrupções para efetuar o


cálculo da amplitude, o ambiente de programação restringe-se apenas ao arquivo
main.c. O código completo para o cálculo da amplitude do sinal é mostrado abaixo:

#include "stm32f10x.h"
#include <cross_studio_io.h>

int main()
{
/* Habilitar clock do timer */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* Habilitar e inicializar timer */

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 9;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 5;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_Cmd(TIM2, ENABLE);

/* Habilitar clock do GPIO */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/* Habilitar e Inicializar GPIO */

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* Habilitar clock do ADC */

RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
82

/* Habilitar e Inicializar ADC */

ADC_InitTypeDef ADC_InitStructure;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
--------------------------------------------------------------------------------------------------------------
/* Para uso de trigger externo */
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
--------------------------------------------------------------------------------------------------------------
ADC_Cmd(ADC1, ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);

int inf, contador=0;


int tensao;

while(1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)
{
}
inf= ADC_GetConversionValue(ADC1);
tensao=((((float)inf)/4095.0)*3.3)*1000;
while(contador < 1000)
{
/* Código para mostrar os valores de amplitude no display */
contador=contador+1;
}

contador = 0;

}
return 0;
}
83

ANEXO H
Princípio de funcionamento do display

Uma forma popular de saída de dados em sistemas


microcontrolados são os displays de sete segmentos. A Figura H.1 mostra uma
montagem contendo 4 displays de sete segmentos.

Figura H.1 – Exemplo de montagem com 4 displays de sete segmentos.

Nota-se na figura que o display é composto por sete LEDs, indicados


pelas letras de a a g. Assim, são necessários 7 sinais elétricos para o acendimento
de todos os dígitos decimais possíveis em cada display, totalizando 27 sinais
elétricos para os 4 displays. Porém, essa configuração de montagem é ineficiente,
pois ocuparia 27 pinos do microcontrolador.
Partindo da idéia de que se precisa gerar em cada display apenas os
padrões correspondentes aos 10 dígitos decimais, são necessários 4 bits para
codificar cada um desses padrões em binário. Então, pode ser usado o CI 4774 que
determina quais dos sete segmentos serão acesos a partir da representação do
dígito decimal em binário (TOCCI, 2000). Com isso, ao invés de ocupar 27 pinos do
microcontrolador, passa-se a usar 16 pinos. Mas ainda é um número grande de
pinos ocupados.
Como o olho humano retém as imagens vistas por um curto período
de tempo (cerca de 40ms), uma solução para reduzir ainda mais o número de pinos
ocupados seria multiplexar os 4 displays de sete segmentos. A idéia é que, num
primeiro instante de tempo, somente o primeiro display permaneça aceso. Num
instante seguinte (alguns milissegundos depois), o primeiro display é apagado e o
segundo display acende. O mesmo ocorre com o terceiro e depois o quarto display,
84

e o processo começa novamente. Se esse chaveamento ocorrer de forma rápida o


suficiente, a representação da imagem no olho humano dá a impressão que todos
os displays estão acesos ao mesmo tempo.
Dessa forma, basta que um display esteja aceso por vez, sendo
necessários 4 pinos que, conectados ao 7447, geram os 7 sinais do display de sete
segmentos. Todos os pinos a de cada um dos quatro displays são ligados
simultaneamente ao 7447. O mesmo vale para o pinos de b a g. Porém, é
necessário controlar o apagamentos dos displays que não se encontram ativos num
dado momento. Para isso, pode-se usar transistores operando como chave, para
abrir ou fechar a conexão entre a alimentação e o anodo comum dos displays de
sete segmentos.
Resumindo, serão necessários 4 pinos para selecionar o display, 4
pinos para o 7447 que irá compor o dígito decimal no display a partir de 4 bits, um
pino para a alimentação do circuito e um pino para a terra. A Figura H.2 mostra um
esquemático do circuito.

Figura H.2 – Diagrama da placa de multiplexação de 4 displays de 7 segmentos.


85

ANEXO I
Programa para a amostragem de parâmetros no display

O código abaixo programa o display para mostrar a freqüência. A


razão cíclica e a amplitude são mostradas no display da mesma forma.

/* Configuração dos GPIOs de saída para o display */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |


GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

int teste;

/* Primeiro Display */

for (teste = 0; teste <= 1000; teste++);


GPIO_SetBits(GPIOC, GPIO_Pin_0); // Porta A0
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
if (((frequencia%10) & 1) == 1)
GPIO_SetBits(GPIOC, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
if (((frequencia%10) & 2) == 2)
GPIO_SetBits(GPIOC, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
if (((frequencia%10) & 4) == 4)
GPIO_SetBits(GPIOC, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
if (((frequencia%10) & 8) == 8)
GPIO_SetBits(GPIOC, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_7);

/* Segundo Display */

for (teste = 0; teste <= 1000; teste++);


GPIO_ResetBits(GPIOC, GPIO_Pin_0);
GPIO_SetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
if ((((frequencia/10)%10) & 1) == 1)
GPIO_SetBits(GPIOC, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
if ((((frequencia/10)%10) & 2) == 2)
GPIO_SetBits(GPIOC, GPIO_Pin_5);
86

else
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
if ((((frequencia/10)%10) & 4) == 4)
GPIO_SetBits(GPIOC, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
if ((((frequencia/10)%10) & 8) == 8)
GPIO_SetBits(GPIOC, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_7);

/* Terceiro Display */
for (teste = 0; teste <= 1000; teste++);
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_SetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
if ((((frequencia/100)%10) & 1) == 1)
GPIO_SetBits(GPIOC, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
if ((((frequencia/100)%10) & 2) == 2)
GPIO_SetBits(GPIOC, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
if ((((frequencia/100)%10) & 4) == 4)
GPIO_SetBits(GPIOC, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
if ((((frequencia/100)%10) & 8) == 8)
GPIO_SetBits(GPIOC, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_7);

/* Quarto Display */
for (teste = 0; teste <= 1000; teste++);
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
if ((((frequencia/1000)%10) & 1) == 1)
GPIO_SetBits(GPIOC, GPIO_Pin_4);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
if ((((frequencia/1000)%10) & 2) == 2)
GPIO_SetBits(GPIOC, GPIO_Pin_5);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_5);
if ((((frequencia/1000)%10) & 4) == 4)
GPIO_SetBits(GPIOC, GPIO_Pin_6);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
if ((((frequencia/1000)%10) & 8) == 8)
GPIO_SetBits(GPIOC, GPIO_Pin_7);
else
GPIO_ResetBits(GPIOC, GPIO_Pin_7);

Você também pode gostar