99
GUSTAVO GARCIA DOS REIS APLICABILIDADE DE MICROCONTROLADORES DA FAMÍLIA STM32 NO CÁLCULO DE PARÂMETROS DE SINAIS ANALÓGICOS Londrina 2011

APLICABILIDADE DE MICROCONTROLADORES DA … · semicondutores, que tem permitido integrar um maior número de transistores em uma pequena pastilha de silício, e à considerável

Embed Size (px)

Citation preview

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ã.

iv

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.

v

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

vi

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.

vii

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.

viii

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

ix

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

x

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

xi

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

xii

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

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 1

Configuração 0

Modo 1

Modo 0

Registrador PxODR

Entrada de

propósito geral

Push-pull 0

0

00 10 11

0 ou 1 Dreno aberto

1

0 ou 1

Entrada Alternate Function

Push-pull 1

0 X Dreno aberto

1 X

Entrada

Analógica 0 0 00

X Floating 1 X

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

Time

100ms 120ms 140ms 160ms 180ms 200ms 220ms 240ms 260ms 280ms 300ms

V(D4:1) V(U1D:OUT)

-20V

-10V

0V

10V

20V

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):

Ri

RF

v

v

i

−=0

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:

CRfmín

×=

2

1

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 mínf

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 mínf máxf

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);