Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Londrina
2011
GUSTAVO GARCIA DOS REIS
BANCA EXAMINADORA
____________________________________
Prof. Dr. Walter Germanovix
Dept. de Engenharia Elétrica
Orientador
____________________________________
Profa. MSc. Juliani Chico Piai
Dept. de Engenharia Elétrica
____________________________________
Prof. MSc. Osni Vicente
Dept. de Engenharia Elétrica
Londrina,___de___________de 2011.
Dedico este trabalho ao meu pai, mãe
e irmã.
AGRADECIMENTOS
iv
“A mente que se abre a uma nova idéia
jamais voltará ao seu tamanho
original.” (Albert Einstein)
v
REIS, Gustavo Garcia. Aplicabilidade de microcontroladores da família STM32
no cálculo de parâmetros de sinais analógicos. 2011. 86 páginas. Trabalho de
Conclusão de Curso (Graduação em Engenharia Elétrica) – Universidade Estadual
de Londrina, Londrina, 2011.
RESUMO
vi
REIS, Gustavo Garcia. Aplicability of STM32 microcontroller in the calculation of
parameters of analog signals. 2011. 86 páginas. Trabalho de Conclusão de Curso
(Graduação em Engenharia Elétrica) – Universidade Estadual de Londrina, Londrina,
2011.
ABSTRACT
vii
LISTA DE FIGURAS
ix
LISTA DE TABELAS
Tabela 2.1 – Configuração dos GPIOs. ............................................................................... 5
Tabela 2.2 – Configuração da velocidade máxima dos GPIOs. ...................................... 5
Tabela 2.3 – Resistência de entrada externa máxima para freqüência do conversor
igual a 14MHz. ....................................................................................................................... 27
Tabela 3.1 – Faixa de freqüência versus capacitor C1. .................................................. 31
Tabela 3.2 – Descrição dos pinos do CI XR-2206. .......................................................... 37
Tabela 4.1 – Capacitor de temporização versus freqüência mínima. ........................... 52
Tabela 4.2 – Faixas de freqüências em função do capacitor de temporização. ......... 53
Tabela 4.3 – Amplitude dos sinais senoidal e triangular. ................................................ 55
x
SUMÁRIO
LISTA DE FIGURAS ................................................................................................. VIII
LISTA DE TABELAS .................................................................................................... X
1 INTRODUÇÃO ......................................................................................................... 1
2 FUNDAMENTAÇÃO TEÓRICA ................................................................................ 3
2.1 GPIOS (GENERAL PURPOSE INPUT/OUTPUT) ................................................................ 3
2.2 INTERRUPÇÕES ................................................................................................................ 5
2.3 DMA (DIRECT MEMORY ACCESS)................................................................................... 7
2.4 USART (UNIVERSAL SYNCHRONOUS/ASYNCHRONOUS RECEIVER/TRANSMITTER) ..... 9
2.4.1 Taxa de Transmissão .......................................................................................... 10
2.4.2 Paridade ................................................................................................................ 10
2.4.3 Controle de Fluxo................................................................................................. 11
2.4.4 Periférico USART................................................................................................. 11
2.4.5 Estilo de Programação ........................................................................................ 12
2.5 TEMPORIZADORES (TIMERS) ......................................................................................... 13
2.5.1 Geração de Interrupções .................................................................................... 18
2.5.2 Canais de Captura de Entrada e Comparação de Saída.............................. 19
2.6 CONVERSOR A/D ........................................................................................................... 24
2.6.1 Clock do Conversor A/D ..................................................................................... 26
2.6.2 Tempo de Conversão .......................................................................................... 26
2.6.3 Acionamento Externo .......................................................................................... 27
2.7 AMBIENTE DE DESENVOLVIMENTO................................................................................. 28
2.8 BIBLIOTECA DE FIRMWARE PARA A FAMÍLIA STM32 FORNECIDA PELA ST
MICROELECTRONICS ............................................................................................................ 29
2.9 O PROGRAMADOR JTAG OLIMEX ARM-USB-TINY ................................................... 30
5 CONCLUSÃO ......................................................................................................... 69
5.1 TRABALHOS FUTUROS ................................................................................................... 70
REFERÊNCIAS ......................................................................................................... 71
ANEXOS ................................................................................................................... 72
xii
1
1 INTRODUÇÃO
O projeto de sistemas microprocessados ganha, a cada dia, um
espaço maior na área de Microeletrônica. Um sistema eletrônico embarcado consiste
em um sistema microprocessado no qual o computador é completamente
encapsulado ou dedicado ao dispositivo que ele controla e realiza um conjunto de
tarefas predefinidas, geralmente com propósitos específicos. Além disso, o sistema
embarcado encontra-se no limiar entre o projeto de sistemas eletrônicos e
computacionais. Dessa forma, pode-se dizer que o projeto de sistemas eletrônicos
embarcados é uma combinação de ambos, ou seja, de um lado projeta-se o circuito
eletrônico no qual o microprocessador está inserido, e do outro se escreve um
software que interfaceia com este hardware por meio de periféricos do
microcontrolador. Como o sistema é dedicado a tarefas específicas, pode-se otimizar
o projeto reduzindo tamanho, recursos computacionais, custo do produto, dentre
outros.
O uso de microprocessadores justifica-se pela facilitação que pode
trazer no desenvolvimento de um projeto, uma vez que o projeto de sistemas
analógicos de alto desempenho pode tornar-se uma tarefa bastante complexa,
enquanto o desenvolvimento da parte analógica de um sistema de sinal misto é bem
mais simples e atinge um melhor desempenho.
A evolução dos processos de fabricação dos semicondutores e a
queda de custo de um componente eletrônico também são fatores extremamente
importantes que favoreceram o maior uso de microcontroladores. O primeiro permitiu
integrar grandes quantidades de transistores em uma pequena pastilha de silício e o
segundo decorre de os fatores que determinam o preço de um componente
eletrônico (desenvolvimento, encapsulamento, transporte, marketing, etc.) não
evoluírem da mesma maneira. Assim, circuitos digitais usando portas lógicas não
conseguem competir, exceto nas aplicações mais simples (5 – 10 portas lógicas).
Por fim, deve-se acrescentar o fato de que o uso de
microprocessadores permite expansão e reprogramação do sistema, oferecendo
maior flexibilidade ao projetista.
O objetivo geral do trabalho é a implementação de um circuito
analógico que fornece ondas quadradas e outras (basicamente um gerador de
2
funções), em que o sinal pode ser variado pelo usuário em função da freqüência,
razão cíclica e amplitude. Posteriormente, será utilizado um microprocessador da
família STM32, mais especificamente o STM32F103RB, que fará o cálculo da
freqüência, razão cíclica e amplitude do sinal e, em seguida, tais valores serão
amostrados em quatro displays de sete segmentos.
Esta monografia contém além da introdução, mais 4 capítulos que
podem ser assim resumidos. No segundo capítulo são descritas as principais
características do microcontrolador utilizado, bem como seus principais periféricos,
dando destaque para os GPIOs, Timer e Conversor A/D. Além disso, é apresentado
o software utilizado para a programação do sistema implementado. O terceiro
capítulo é dividido em três partes. A primeira delas descreve o circuito analógico,
composto pelo circuito gerador de sinais elétricos, atenuador e detector de pico. A
segunda descreve a programação do microcontrolador para processamento do sinal.
A terceira e última descreve a programação do microcontrolador para a amostragem
de valores no display. Já no quarto capítulo, é apresentado o problema e os
resultados que validam o funcionamento do sistema implementado. No quinto e
último capítulo é apresentado um resumo da conclusão do trabalho e também as
perspectivas para novos projetos.
3
2 FUNDAMENTAÇÃO TEÓRICA
2.2 INTERRUPÇÕES
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.4.2 Paridade
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.
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.
Figura 2.5 – Diagrama de temporização do contador para cima, clock interno dividido por 1.
Figura 2.6 – Diagrama de temporização do contador para baixo, clock interno dividido por 1.
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.
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).
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
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
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
3 DESENVOLVIMENTO PRÁTICO
Assim, a saída V’0 pode ser alterada de uma onda triangular para
uma onda dente de serra pelo controle de simetria feito pelo potenciômetro R2. O
capacitor C2 determina a amplitude de V’0. Geralmente, o capacitor C2 deve ser
maior com freqüências de saída menores. Se C2 for muito pequeno, a saída V’0
torna-se cortada porque a saída do Amp Op satura em cada alternância. Se C2 é
muito grande, a amplitude de V’0 torna-se pequena, especialmente em altas
freqüências.
A Figura 3.2 mostra as saídas V0 e V’0 correspondentes ao circuito
da Figura 3.1, resultado da simulação no software OrCAD.
33
20V
10V
0V
-10V
-20V
100ms 120ms 140ms 160ms 180ms 200ms 220ms 240ms 260ms 280ms 300ms
V(D4:1) V(U1D:OUT)
Time
Figura 3.2 – Saídas V0 e V’0 do circuito gerador de funções que correspondem às ondas quadradas e
triangular, respectivamente.
Figura 3.5 – Tensão de saída como uma função do resistor R3 colocado no pino 3.
v0 − RF
=
vi Ri
Como RF é menor que Ri, a razão v0/vi torna-se menor que um.
Assim, a amplitude do sinal de saída será menor se comparada ao sinal de entrada.
Na implementação, foi utilizado um resistor de 10kΩ para RF e um de 100kΩ para
Ri, resultando, teoricamente, em uma atenuação do sinal de entrada de 10 vezes.
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.10 – Fluxograma descrevendo metodologia para o cálculo de freqüência e razão cíclica.
GPIO_SetBits(GPIOC, GPIO_Pin_0);
GPIO_ResetBits(GPIOC, GPIO_Pin_1);
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
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
Figura 4.1 – Sinais de saída V0 (onda quadrada) e V’0 (onda triangular) referentes ao circuito da
Figura 3.1.
1
f mín =
R2 × C
Capacitor f mín
470pF 966,68Hz
1nF 454,34Hz
1,5nF 302,89Hz
4,7nF 96,68Hz
Figura 4.15 – Detecção de pico do sinal quadrado gerado pelo circuito da Fig. 3.1.
5 CONCLUSÃO
REFERÊNCIAS
ANEXOS
73
ANEXO A
Distribuição dos periféricos pelos canais do DMA1
ANEXO B
Distribuição dos periféricos pelos canais do DMA2
ANEXO C
Diagrama de blocos do periférico USART
ANEXO D
Canal de captura/comparação do periférico temporizador
ANEXO E
Diagrama de blocos do conversor A/D
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);
while (1)
{
while(contador<1000)
79
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);
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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"
void TIM1_CC_IRQHandler(void)
{
ANEXO G
Programa para o cálculo da amplitude
#include "stm32f10x.h"
#include <cross_studio_io.h>
int main()
{
/* Habilitar clock do timer */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
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);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
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);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
82
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);
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
ANEXO I
Programa para a amostragem de parâmetros no display
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
int teste;
/* Primeiro Display */
/* Segundo Display */
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);