Página 1 de 2

PSoC Designer (Bloco Analogico)

MensagemEnviado: 14 Mai 2007 11:36
por alessandro
Também estou iniciando nesse tipo de microcontrolador, e estou até o momento gostando, apesar demuito bate cabeça.

Agora, alguém sabe me dizer se quando implementamos bloco de AD no PSoC Designer, as entradas e saidas não aparecem para conecta-las ao barramento?

Adicionei um AD, mas não aparece nada na janela "User Module Parameters", e no bloco do AD não disponibiliza a saida nem a entrada.

Outra questão é talvez simples, em C como nos referimos ao um determinado pino I/O para setarmos como 1 ou 0? Para a porta vi que é PRT2DR = valor; (para porta 2).

Grato,

MensagemEnviado: 14 Mai 2007 12:45
por alessandro
Pessoal umas das questões encontrei, basta clicar no bloco desejado e selecionar o botão "Place User Module".

Falta descobrir como selecionar somente um pino do micro (sintaxe em C).

MensagemEnviado: 14 Mai 2007 12:47
por Ricardo_Franco
Ola Senhores.
Os blocos analógicos funcionam em barramento diferente do bloco digital, por isso devemos ligar o AD a um MUX do barramento analógico e este MUX a um pino, Se não me engano o bloco ADinc14bits pode ser ligado diretamente ao Pino 2.1, mas tenho que conferir esta informação.

Quanto as portas, seus registradores são de 8 bits um para cada pino da porta, (para o caso do PSoC utilizar uma porta inteira de 8 pinos).
Ou seja se quero utilizar apenas um pino por exemplo

P2 = 00001000, logo devemos setar o registrador,
PRT2DR=8; // 8 em decimal é 00001000 em binário

P0 = 10001001
PRT0DR = 137; // 137 em decimal é 10001001 em binário

Ou podemos utilizar a biblioteca “Ports.h”
Então a saída fica assim

Port2_3(1); // Pino 4 da porta 2 setado em “1”

Ou para o port todo

Port2(1); // Seta todo o port em “1”

MensagemEnviado: 14 Mai 2007 13:06
por alessandro
Ricardo a biblioteca Ports.h não vem com o software?

O pior é que estou querendo implentar AD para fezer um teste, mas estou com LCD acoplado na placa de Desenvolvimento CY3210, e por força do "destino", precisei usar os pinos dispostos na placa para o LCD. E agora só vejo uma opção para entrada do AD, o pino P2[0], mas esse pino já esta no LCD, e agora? Não posso usar outro pino? Ao menos não esta aparecendo essa opção.

MensagemEnviado: 14 Mai 2007 13:24
por Ricardo_Franco
Ola Senhores
Não infelizmente a biblioteca não vem, pois foi desenvolvida por um usuário.
Você pode baixá-la aqui:
http://rapidshare.com/files/31281002/ports.h.html

Para incluir um arquivo no projeto proceda da seguinte forma.
Na tela do Aplicattion Editor, menu:
Project -> Add to Project -> File.

Então uma janela de procura ira aparecer para você indicar o caminho do arquivo. Pronto

Não se esqueça de declarar a biblioteca no cabeçalho do programa.
#include “Ports.h”

Boa sorte.

MensagemEnviado: 14 Mai 2007 13:27
por alessandro
Eu posso direcionar o pino da entrada do AD para outros pinos?

MensagemEnviado: 14 Mai 2007 14:01
por Ricardo_Franco
alessandro escreveu:O pior é que estou querendo implentar AD para fezer um teste, mas estou com LCD acoplado na placa de Desenvolvimento CY3210, e por força do "destino", precisei usar os pinos dispostos na placa para o LCD. E agora só vejo uma opção para entrada do AD, o pino P2[0], mas esse pino já esta no LCD, e agora? Não posso usar outro pino? Ao menos não esta aparecendo essa opção.


Ola Senhores.
Bom sobre os blocos analógicos.
O PSoC oferece algumas restrições quanto ao uso de blocos analógicos.
O mesmo se divide em duas categorias:

Analógic Continuos time = ACB00
Analógic Switched Capacitor = ASD10, ASC20

Observe a figura abaixo.
Imagem

Para o caso dos AD, os mesmo são conversores de um único bit e utiliza capacitores chaveados para integrar o sinal em função do tempo, ou seja, quanto maior definição (bits), mais lento fica a amostragem do AD, SPS (samples por segundos).
Logo os AD utilizam os blocos de capacitores chaveados, ou seja obrigatóriamente o mesmo deve ser conectado apenas aos blocos ASDxx e ASCxx.
E estes blocos só mantém conexão com o Port2, ou com outro bloco analógico.
Portanto temos duas soluções:

1-) Troque o LCD de porta, pois o mesmo utiliza dados digitais e todas as portas são digitais. (mas então como utilizar no KIT?).

2-) Utilize um bloco analógico do tipo continous time, por exemplo um AmpOp de ganho programável (PGA).

Observe a figura.
Imagem

Configure o PGA como ganho 1 e pronto tudo que entrar neste módulo será enviado ao AD pelo pino P0_1.
Espero ter ajudado e não complicado mais
Boa sorte.

MensagemEnviado: 14 Mai 2007 14:03
por Ricardo_Franco
alessandro escreveu:Eu posso direcionar o pino da entrada do AD para outros pinos?

Pode modificando o pino no mux na entrada da PGA.
É só clicar em cima e ele abre um menu drop-down para você escolher qual pino prefere usar.

MensagemEnviado: 17 Mai 2007 17:03
por alessandro
Utilizei um PGA com ganho 1 e um AD de 12 bits. Funcionou.

Mas vi que os primeiros 30º e os 30º finais do potenciometro não são lidos ou incrementados no reg. Alguém sabe porque isso pode estar acontecendo?

MensagemEnviado: 17 Mai 2007 21:59
por bhvictor
Ricardo,

Você tem alguma biblioteca para ler o status de uma unica porta?

Victor

MensagemEnviado: 17 Mai 2007 23:13
por Ricardo_Franco
Ola Senhores.
Victor eu acho que você quis dizer Status de um único pino certo?
Na verdade não tem biblioteca não, você precisa fazer um bitwise com lógica AND.
Vou montar um programa simples e posto aqui no fórum.

MensagemEnviado: 18 Mai 2007 08:05
por alessandro
Alguém ja teve esse problema com leituras analógicas somente em uma faixa?

MensagemEnviado: 18 Mai 2007 11:01
por Ricardo_Franco
Ola Senhores.
Infelizmente sim.
O AD do PSoC é na verdade um AD de um único bit que utiliza um AmpOp para integrar as medidas em função do tempo, eu dei uma explicação mais detalhada para nosso amigo Hermecildes no tópico “Decimador”, confira no link:

http://asm51.eng.br/phpBB/viewtopic.php?t=1324

Se você observar a curva do AD incremental do PSoC, você poderá observar que ele não é linear em nenhum ponto de sua faixa.

Imagem

Este erro depende de alguns fatores, tais como:
• Ruído da leitura do AD proveniente da fonte de clock, quanto mais rápido o clock, mais ruído, logo menos precisa sua leitura.
• Se você não estiver usando cristal, logo seu clock depende de um oscilador RC, ou seja você depende de deriva térmica.

O tipo de AD empregado na leitura, se não me engano o AD incremental é o mais ruidoso.
Mas como corrigir este evento?
Tabelar toda a leitura seria a opção mais fácil, mas no entanto é muito trabalhosa e a precisão não é tão boa assim, logo eu resolvi achar a função da curva do AD.
Eu usei o software Origin e plottei os dados neste cara,que me deu a equação da curva do AD.

Y= 85,83672 – 1419,81483X + 694,26523X^2 – 98,36434X^3 + 10,88419X^4 – 1,36877X^5

De posse desse polinômio (incrivelmente um polinômio de 5ª ordem, apesar da ultima expressão ser quase 1 poderia ser desprezada, mas eu precisava de muita precisão), eu o inseri no código de leitura do AD

while(ADCINC14_fIsDataAvailable() == 0);
AD = ADCINC14_iGetData();
ADCINC14_ClearFlag();
TensaoMedida = AD/3276.8;
erro = ( (85.83672) - (1419.81483 * TensaoMedida) + (694.26523 * (TensaoMedida*TensaoMedida)) - (98.36434 * (TensaoMedida*TensaoMedida*TensaoMedida)) + (10.88419 * (TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida)) - (1.36877 * (TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida)) );
calibrado =erro+AD;

Onde a leitura que eu fizer em “calibrado” esta ainda em bits, mas agora já linearizado em toda a sua faixa.

Espero não ter complicado muito.

MensagemEnviado: 18 Mai 2007 12:10
por alessandro
O problema Ricardo é que estou lendo direto o valor do Registrador do AD:

AD = ADCINC14_iGetData();

minha variavel AD só começa a ser inclementada após 30º do potenciometro e faltando 30º para terminar ele para de ler também.

Verfiquei se a tensão neste ponto do potenciometro esta correto, esta tudo certo, mas nao estou conseguindo ler esta faixa.

MensagemEnviado: 18 Mai 2007 13:42
por Ricardo_Franco
alessandro escreveu:O problema Ricardo é que estou lendo direto o valor do Registrador do AD:

AD = ADCINC14_iGetData();

minha variavel AD só começa a ser inclementada após 30º do potenciometro e faltando 30º para terminar ele para de ler também.

Verfiquei se a tensão neste ponto do potenciometro esta correto, esta tudo certo, mas nao estou conseguindo ler esta faixa.

Ola Senhores.
Acabei de montar um programa que realiza leitura pela serial
e funciona tudo certinho, ele realiza leitura em toda a faixa de operações do ponteciometro.
Procure trocar de placa, talvez seja uma de suas placas com defeito.