Entrar    Registrar

Erro ao ler tensão

Software e Hardware para uC PSoC

Moderadores: andre_teprom, 51

  • Autor
    Mensagem

Erro ao ler tensão

Mensagempor kaoalex » 04 Mar 2009 13:03

Fala pessoal!
Eu estou usando esse código do Designer, mas ele apresenta um erro na leitura.

Ele está mostrando 822 para a tensão de 2,5 volts.

Onde estará o meu erro?

Desde já agradeço a ajuda.


Código: Selecionar todos
#include <m8c.h>                         // part specific constants and macros
#include "PSoCAPI.h"                     // PSoC API definitions for all User Modules
#include <stdlib.h>
   
#define RESOLUTION 12                    // ADC resolution
#define SCALE_BG  (( 1 << RESOLUTION)/55) // BarGraph scale factor

float  iResult; 

void Tempo(void)   // rotina para gastar tempo
{
BYTE Tempo1, Tempo2;

for(Tempo1 = 0; Tempo1 <= 254; Tempo1++)
   {
   for(Tempo2 = 0; Tempo2 <= 254; Tempo2++)
      {
      }
   }
}               // fim da rotina gasta tempo                          // ADC result variable

void main()
{
    BYTE bgPos;                          // BarGraph position

    UART_1_Start(UART_PARITY_NONE);      // Enable UART
    UART_1_CPutString("Example ADC_UART_LCD"); // Example string
    UART_1_PutCRLF();
     
    PGA_1_Start(PGA_1_MEDPOWER);         // Turn on PGA power
    ADCINC12_1_Start(ADCINC12_1_MEDPOWER); // Turn on ADC power
    ADCINC12_1_GetSamples(0);            // Sample forever

    M8C_EnableGInt;                      // Enable Global interrupts
   
    while (1)// Main loop
    {   
       if (ADCINC12_1_fIsDataAvailable() != 0) // If ADC sample is ready...
       {
          iResult = ADCINC12_1_iGetData() + 2048; // Get result, convert to unsigned and clear flag
          ADCINC12_1_ClearFlag();
         
          UART_1_PutSHexInt(iResult);    // Print result to UART
          UART_1_PutCRLF();              // Tack on a CR and LF
         
          Tempo();
       }
    }
}
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor barboza » 04 Mar 2009 20:19

Ainda não trabalhei com PSOC (apesar de ter um kit), mas acho que o seu erro esta na interpretação da informação que esta recebendo do AD.

O valor que terá como retorno do AD não é o valor da tensão diretamente em volts como acho que esta esperando. Você precisa conhecer a resolução do mesmo, a tensão de referencia e o circuito de entrada do sinal para conseguir transformar esta informação em decimal como quer (2,5V).

Usando os dados que deu, acho que é o seguinte:

Resolução de 12 bits, neste caso 4096 steps de medição.
Código: Selecionar todos
#define RESOLUTION 12                    // ADC resolution


Como recebe o valor 822 (considerando este valor em decimal e não em hexadecimal) para a medida de 2,5V, você tem uma resolução de ~3mV de medida (2,5/822).
Código: Selecionar todos
UART_1_PutSHexInt(iResult);    // Print result to UART
         


Como seu AD tem 4096 pontos, sua medida máxima é de >12V (~3mV * 4096).

Como é feito a sinalização do valor conforme o código abaixo, sua entrada deve ser de -~6V a +~6V.


Código: Selecionar todos
iResult = ADCINC12_1_iGetData() + 2048; // Get result, convert to unsigned and clear flag
         
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 941
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Ricardo_Franco » 18 Abr 2009 22:32

Ola a todos.
Senhores, vou dar meus pitacos.
KaoAlex, você forneceu poucos dados para analise, mas como conheço este código (é um exemplo de projeto da Cypress), posso ajudar um pouco.

Ele usa um ADC incremental de 12bits. Cuja a referencia é GND (0 Volt), o PSoC trabalha com dados analógicos “rail to rail”, ou seja a entrada pode excursionar entre o vRef (no caso 0 volt) e o VDD do micro (pode ser 5 volts, ou 3 Volts), mas neste projeto especifico o micro está configurado para 5Volts.

Logo temos que 12bits = 4095(decimal). Ou seja, cada passo na leitura do AD corresponde a 5(dec)/4095(dec) = 0,001221(dec) Volts.

A função que você está usando, retorna o valor em hexadecimal, logo 822(hex) -> 2082(dec).

Multiplicando o valor de precisão que encontramos pela leitura obtida temos:
0,001221(dec) x 2082(dec) = 2.542122Volts, exatamente o valor que você mediu.

Como disse o Barboza, o valor deve ser “convertido” em Volts. Para isso basta multiplicar o valor obtido pelo AD, pela constante acima mencionada.
Ou seja o código está perfeito, foi apenas um erro de interpretação.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor kaoalex » 19 Abr 2009 19:55

Ricardo_Franco,

Código: Selecionar todos
UART_1_PutSHexInt(iResult);    // Print result to UART

Eu acreditava que a função fazia o contrário, convertia hexadecimal em inteiro.

A saída na tela era 822 então nem desconfiei que estaria em hexadecimal. Se fosse 81A.... :lol:


Agora sim tudo faz sentido. Obrigado pelo esclarecimento.

Código: Selecionar todos
UART_1_PutString(itoa(OutputString, iResult, 10));
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Mensagempor Ricardo_Franco » 19 Abr 2009 21:23

Código: Selecionar todos
UART_1_PutSHexInt(iResult);    // Print result to UART


Na verdade esta função converte um valor numérico em caracteres ASCII para ser enviado pela serial (lembrando que tudo que vemos no terminal serial, está em ASCII)
Logo:
Código: Selecionar todos
UART_1_

Significa que é uma função pertinente a UART_1 (caso você tenha mais de uma UART, poderá diferenciá-la com números ou nomes mais amigáveis, eu costumo usar "UART_Console" por exemplo).
Código: Selecionar todos
PutS

PutS é acrônimo para "Put String", uma tradução aproximada seria "Colocar String".
Código: Selecionar todos
HexInt

O valor será expresso em Hexadecimal, e possui um tamanho Inteiro -> "HexInt", o valor inteiro para o PSoC são 16bits, logo pode ser compreendido entre 0000(Hex) até FFFF(Hex).
Infelizmente o PSoC não possui uma função pronta para expressar os números em base decimal.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP

Mensagempor kaoalex » 20 Abr 2009 01:51

Ricardo_Franco,

Obrigado pela paciência e ajuda!
Avatar do usuário
kaoalex
Byte
 
Mensagens: 237
Registrado em: 12 Out 2006 01:52

Voltar para Cypress

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes