Um pequeno video com o teste de alcance do nRF24L01+.
Por agora, sem aplicação (uma vez que surgiu outro rádio para testar), vai ficar parado mas totalmente funcional como uma Wireless UART.

PS: O facto de mostrar sempre 2 pacotes de perda deve-se ao facto de um dos rádios ter um chip clonado, um Si24L01+.

Mais um projecto...
Este esteve para avançar à uns meses, mas como houve alguns erros no desenho das PCB's e com a entrada de outros projectos, voltou para a gaveta. Isso até Domingo passado.
Tratei de perder algum tempo, fazer todas as correcções necessárias e deixar estas pequenas PCB's prontas para o desenvolvimento.
O circuito contém um regulador de tensão para 3.3V, um PIC16F1508 e um rádio NRF24L01+.
Estes rádios são óptimos! Super baratos, low-power, com uma boa arquitectura interna e já com um protocolo de comunicação (Enhanced ShockBurst) embebido. No entanto, por outro lado, a sua configuração pode levar algum tempo (construindo as bibliotecas de raiz) e algumas partes do seu funcionamento tornam-se confusas, tornando-se uma dor de cabeça. O datasheet deste rádio é daqueles que todas as linhas contam e todas têm informação essencial.
Bom mas após fazer algumas experiências e ler tudo com atenção, lá se começaram a fazer comunicações.

Mais um update do projecto.
Aqui fica um pequeno video do movimento do eixo Y.
Falta ainda muito trabalho, mas vai avançando...

Este é um pequeno video do estado em que se encontra o projecto.
Todo o circuito foi soldado com sucesso e tal como escrevi no ultimo post já corre um programa "válido" no MCU.
Esta foi a hora de testar os drivers dos motores de passo assim como o controlo para os mesmos.
Daqui em diante o trabalho estará focado na construção do firmware a correr no Happy Gecko. 
Após o video estão 3 fotografias do conjunto que completam as do artigo anterior.


E o projecto vai avançando...
chegaram as PCB's (de fabrico asiático :D) e já todos os componentes foram soldados.
O MCU utilizado é um EFM32HG222 que já sai do fabrico com um bootloader para fazer programação via UART.
Já fiz com sucesso o teste de programação via UART e um pequeno programa de teste já corre. LED's já piscam livremente :).
Fiquei feliz com o resultado, até ao momento.
Estava receoso em soldar o QFP-48, mas correu muito melhor do que esperava.

Mais alguma fotos devem surgir nos próximos dias.

A empresa americana SpaceX conseguiu, após 4 tentativas falhadas, realizar a aterragem do seu foguete Falcon 9 pela primeira vez. Este foi um feito inédito na história espacial, motivado pelo desejo de reduzir custos e de transformar os foguetes em naves com possibilidade de reutilização. A SpaceX lançou com sucesso o Falcon 9 com o objetivo de transportar 11 satélites à órbita baixa da Terra e depois conseguiu fazer regressar ao planeta a primeira fase do engenho.

Junto podem vê-se 2 fotos do aspecto final do sistema construído.
De forma breve, pode fazer-se a seguinte legenda:
1 - conversor USB-serie: foi soldado o módulo directamente de modo a tornar a construção mais rápida;
2 - conversor DC/DC: este é o responsável pela obtenção das tensões +15V e -15V para alimentar toda a instrumentação.
3 - conector para a célula de carga: por aqui segue a alimentação e o sinal a medir;
4 - amplificador de instrumentação INA126: responsável pela amplificação diferencial do sinal medido;
5 - dual opamp LM358: responsável pela referencia ao amplificador de instrumentação e pela detecção do zero;
6 - microcontrolador PIC12F1822: responsável pela amostragem, processamento e envio dos valores medidos para um computador.
De frisar, na segunda fotografia, o pormenor da atenção dada na colocação dos condensadores SMD o mais junto possível aos pinos de alimentação e com um desenho sem o recurso a trilhas de sinal demasiado longas e/ou a percorrer caminhos "estranhos". Por isso, e como de costume, não foi utilizado nenhuma ferramenta de auto-routing. 

Eis que se chega à ultima parte, relacionada com o hardware construído - construção do funcionamento global.
A imagem seguinte mostra um pequeno diagrama de blocos com as principais tarefas realizadas pelo PIC12F1822 e que serão brevemente explicadas.
O MCU aguarda que pela USART seja recebido o comando para realizar e enviar uma nova leitura de peso, medido através da célula de carga.
Assim que esse pedido chega e é confirmado como tal, são realizadas 16 leituras da ADC, com a sua referência programada para 5V, posteriormente calculando a sua média. O objectivo, como já descrito na PART3, é determinar qual a melhor referência para a ADC com o intuito de melhorar também a sua resolução. As configurações do periférico são novamente modificadas para corresponder à referencia escolhida.
A função mostrada em seguida, não só aplica a referencia como realiza a medição da ADC e retorna esse valor.
unsigned int ADC_ref_read(unsigned char ref)
{
   
switch (ref)
    {
       
case 0:
            FVRCONbits.FVREN    =   1;      //enable reference
            FVRCONbits.ADFVR    =   0b01;   //ADC FVR Peripheral output is 1x (1.024V)
            while(!FVRCONbits.FVRRDY);      //Fixed Voltage Reference output is ready for use
            ADCON1bits.ADPREF   =   0b11;   //V+ = FVR
            break;
        case 1:

            FVRCONbits.FVREN    =   1;      //enable reference
            FVRCONbits.ADFVR    =   0b10;   //ADC FVR Peripheral output is 2x (2.048V)
            while(!FVRCONbits.FVRRDY);      //Fixed Voltage Reference output is ready for use
            ADCON1bits.ADPREF   =   0b11;   //V+ = FVR
            break;
        case 2:

            FVRCONbits.FVREN    =   1;      //enable reference
            FVRCONbits.ADFVR    =   0b11;   //ADC FVR Peripheral output is 4x (4.096V)
            while(!FVRCONbits.FVRRDY);      //Fixed Voltage Reference output is ready for use
            ADCON1bits.ADPREF   =   0b11;   //V+ = FVR
            break;
        case 3:

            FVRCONbits.FVREN    =   0;      //disable reference
            ADCON1bits.ADPREF   =   0b00;   //V+=vcc
            break;
    }
        _delay(40);       //Wait the required acquisition time(2)  - 5uS
        
        ADCON0bits.GO_nDONE = 1;        //Start conversion by setting the GO/DONE bit.
        while(ADCON0bits.GO_nDONE);
    return (ADRESH<<8)+ADRESL;
}
Ultrapassada esta parte, são realizadas 31 medições com uma frequência de amostragem de 10KHz (uma amostra a cada 100uS). Estas são utilizadas para criar um filtro FIR de 30ª ordem com uma frequência de corte de 10Hz. Esta etapa é muito importante para reduzir ao máximo possíveis erros de leitura provocados por ruído ou qualquer outro relacionado. Tudo sobre filtros FIR, incluindo o cálculos dos coeficientes para a multiplicação, pode ser encontrado AQUI.
A particularidade utilizada por mim, nesta parte, consiste na multiplicação dos coeficientes por uma constante que os torne a todos números inteiros de 8 bits, para facilitar os cálculos pelo MCU.
No código acima, o vector x[] armazena os valores resultantes da medição da ADC, o vector h[] contém os coeficientes do filtro (todos multiplicados por 2^12, para os tornar inteiros de 8bits), a variável "filtro" corresponde ao valor de medição obtido pelo filtro e por ultimo a variável "cod" volta a dividir o valor calculado e resultante do filtro por 2^12 de modo a obter um valor na mesma relação que a ADC.
Posteriormente estes dados são organizados em 2 bytes, junto com um checksum de 4bits e enviado pela USART para o computador. Lá são recebidos, "descompactados" convertidos em valores de força (peso) que podem ser mostrados à plateia.

O artigo seguinte deverá conter algumas fotos do circuito construído assim como uma breve explicação da sua utilização.

Deste não posso dar muitas informações (para já), mas trata-se de um posicionador triaxial para um sensor.
Com o avançar do projecto, vou tentar colocar cá mais fotos e videos para mostrar o progresso conseguido.
Por agora, fica somente uma imagem da PCB que estou à espera de receber nos próximos dias. A PCB mostra um EFM32, da familia Happy Gecho que controlará 4 drivers de motores de passo e como entradas, devidamente filtradas, 4 fins de curso para indicar a posição zero de todos os eixos.
Dado a dimensão da estrutura a montar (4m x 2m x 0.85m), de momento estou a terminar o planeamento e dar inicio à montagem mecânica. Estas serão as primeiras imagens a surgir.

A digitalização do sinal obtido na PART2, fica a cargo de um pequeno grande MCU, o PIC12F1822.
Este micro possui uma referencia de tensão fixa (FVR), a partir da qual se podem obter as tensões de 1.024V, 2.048V e 4.096V. Este periférico de FVR pode ser ligado internamente à referencia de tensão da ADC de 10bits.
Vantagens?
Bem... o aumento da resolução de medição é a principal. Com uma referencia na ADC de 5V a resolução é de 4.89mV (5/1023), mas com uma referencia de 1.024V a resolução passa para 1mV. Esta mudança de referencia produz um aumento da resolução em quase 5 vezes, com, obviamente, o sinal a digitalizar tem de ser inferior à referencia da ADC.

Para determinar qual a melhor referência a aplicar, é feita a média de 16 leituras da ADC com referencia de 5V. O resultado desse calculo é posteriormente comparado com os valores que definem os intervalos das escalas, habilitando a ligação da ADC ao valor mais apropriado.
Do ponto de vista prático, a utilização deste método, faz com que tenha uma resolução (valor do LSB) dinâmica de acordo com o peso exercido na célula. Com uma referencia fixa na ADC de 5V, a resolução em toda a escala seria de 244gr (250Kg/1023), mas com a mudança de referencia no momento certo, com pesos menores a resolução é também ela menor.
* Até 51.2Kg (correspondente a 1.024V), resolução de 50gr (51.2Kg/1023);
* Até 102.4Kg (correspondente a 2.048V), resolução de 100gr (102.4Kg/1023);
* Até 204.8Kg (correspondente a 4.096V), resolução de 200gr (204.8Kg/1023);
* Até 250Kg (correspondente a 5V), resolução de 244gr (250Kg/1023);

No artigo seguinte será uma breve explicação de como implementar um filtro digital FIR assim como o fluxograma de funcionamento geral.

Após subir até aos 100.5Km (329.839 feet) o Blue Origin, New Shepard, conseguiu fazer uma aterragem histórica, não implicando a destruição do foguete.

No artigo anterior, já se concluiu que a variação de tensão à saída da célula de carga é de 30mV na sua carga máxima, 250Kg, quando alimentada a 15V.
Para melhor explicar passo-a-passo a construção do circuito, a imagem em baixo divide-se em vários blocos (numerados) e que serão descritos em maior detalhe.
Embora não mostrado, a alimentação será feita a partir de uma porta USB e usando um conversor TRACO TEN 3-0523. Daqui se obtém as tensões de +15V e -15V e as quais são devidamente filtradas com o intuito de reduzir ao máximo o ruído na alimentação.


1 - Conector da célula.
Local onde será feita a ligação da célula de carga com a PCB.

2 - Condensadores de alisamento.
Além de todos os condensadores já existentes do "bloco de alimentação" estes condensadores de valor mais baixo contribuem para a anulação do ripple de alta frequência, tornando a alimentação mais estável.

3 - Amplificador de instrumentação INA126.
Circuito responsável pela ampliação da diferença de potencial medida na célula de carga.
A seguinte imagem é retirada do datasheet e mostra uma aplicação típica, semelhante à utilizada por mim.


4 - Resistências de ganho.
Fazem um total de 494R e por isso o ganho do amplificador corresponde a 166,94. Isto significa que quando a diferença no Vin for de 30mV o Vout será de 5V, pronto a ser filtrado e digitalizado.

5 - Ajuste de referência.
Este ajuste é essencial para uma correcta leitura dos valores, pois é comum a célula não ser perfeita e o diferencial de saída da célula ser negativo, com peso zero, e depois com o aumento de peso passar a positivo. Então é necessário acertar o Vref adequadamente. O bloco 7 serve para isso mesmo.

6 - Filtro RC.
Filtro passa baixo para complementar o que virá a ser feito por software. Estes filtros serão muito importantes pois as tensões resultantes da célula são tão baixas que têm praticamente a mesma amplitude que o ruído. É então necessário ter em atenção técnicas para atenuação dessas perturbações não desejadas.
Filtro passa baixo de primeira ordem, com frequência de corte nos 4.8Hz.

7 - Detecção de "zero" para ajuste inicial.
É feita uma comparação entre Vout e a referencia (ground). Quando a célula não tiver qualquer carga, o potenciómetro de ajuste à referencia do INA126 deve ser rodado até que o LED deste bloco acenda. Isso significa que a saída do amplificador para um peso de 0Kg, corresponde a uma tensão muito próxima de zero (mas que deve ser tida em consideração no software) maximizando a ganha de trabalho.

8 - Saída do bloco analógico para a ADC.
É aqui deverá ser ligado um MCU, mais precisamente um pino correspondente à sua ADC.

No próximo artigo será revista em pormenor a parte de digitalização e filtragem (FIR) da tensão resultante do bloco aqui descrito.

Com a chegada de mais um Concurso Pontes de Esparguete (a realizar a 4 de Dezembro, na UBI), faz todo o sentido descrever aqui este projecto.
Trata-se de um sistema de medição de força (peso) projectado e construído há cerca de um ano e o mesmo já foi utilizado no ultimo concurso. O recorde foi atingido, tendo uma ponte com 350gr de esparguete, aguentado um peso de 167Kg!
O objectivo é medir a força (peso) exercida do tabuleiro da ponte construída em esparguete, tendo um registo continuo e classificando o peso máximo suportado.

A resolução do sistema de medição deverá ser a máxima possível sem que isso venha complicar desnecessariamente o projecto, no entanto considera-se resolução mínima aceitável 500gr para um peso de 250Kg. Na verdade, com alguma mestria, foram conseguidos cerca de 50gr de resolução mínima, mas será explicado em artigos futuros.
Posteriormente os valores resultantes da medição devem ser filtrados enviados para um computador que fará a projecção, para a plateia, da carga exercida na ponte.
Mas uma coisa de cada vez!
Para medir o peso exercido na ponte é utilizada uma célula de carga do tipo "S", como ESTA.
O video seguinte ilustra em maior pormenor o funcionamento de uma célula de carga. Ela possui 4 extensómetros (2 à compressão e 2 à tracção para maximizar a diferença de potencial), numa Ponte de Wheatstone.


A diferença de potencial na saída da célula é de 2mV por cada volt de alimentação e a uma carga de 250Kg. Ou seja, com uma alimentação máxima de 15V e uma carga de 250Kg, a ddp é de apenas 30mV (2*15). Apenas  120uV por cada Kg!!!

Nos artigos seguintes será descrito os passos realizados em seguida até à conclusão do sistema totalmente funcional.

Esta é a primeira peça feita na minha impressora 3D que faz alguma venda. Algumas dezenas já foram instaladas com total satisfação dos "clientes".
É um sistema de fecho para a porta do congelador de um mini-frigorífico de marca DeLonghi, impresso em plástico PLA super resistente. O conjunto é composto por um pega, um dente de fecho e um parafuso onde roda a pega.
Graças a esta peça, que substitui a original facilmente quebrável, mantém a porta do congelador bem comprimida contra a estrutura oferecendo a vedação adequada. Após aplicar a peça, o frigorífico deixa de criar gelo nas paredes, deixa de estar em constante funcionamento e por isso contribui para a redução do gasto energético.
Estes frigoríficos encastrados são encontrados em alguns condomínios, como por exemplo o Studio Residence Covilhã. Apartamentos semelhantes também podem ser encontrados em outros locais do país, como por exemplo no Studio Residence Coimbra e no Studio Residence Arrábida.
O KIT completo é vendido por 12,5€, composto pelas partes já indicadas.
Se houver algum interessado, pode contactar através de cs7aek@gmail.com .

A ausência de mensagens aqui no blogue deve-se a algumas alterações que ocorreram no meu percurso e que levaram a um replaneamento dos meus horários.
Parte desse trabalho, que se acentuou em demasia nos últimos tempos, foi a minha Dissertação de mestrado que felizmente chegou ao fim (por agora.)
Por isso, e em breve suma, vão voltar a surgir novidades por aqui :)


Este projecto já se encontra terminado à alguns meses, mas só agora houve disponibilidade para apresentar o seu aspecto final.
A imagem em baixo mostra o aspecto do circuito já totalmente montado e pronto a utilizar. Aliás, esta foto foi tirada já durante uma análise de corrente a um circuito.


Posteriormente basta copiar os valores recebidos no terminal, colar no excel e fazer o belo de um gráfico para melhor análise.


Mais um projecto que se dá por concluído :).

No passado dia 19 dei mais um passo num hobby já com alguns anos e que por falta de tempo ainda não tinha conseguido concretizar.
Para quem não sabe, eu sou radioamador desde 2011. Em Portugal a legislação dita que se faça exame para categoria 3, onde a estação de amador (CR7) apenas deve ser usada para radio-escuta e permanecer nessa categoria por 2 anos (até um máximo de 5 anos, após isso o CAN caduca). Após esse período, o amador por ir novamente à ANACOM realizar exame para a categoria 2 e quando aprovado poderá então usar a sua estação de rádio (CS7) para transmitir em quase todas as bandas de amador destinadas para o efeito. Um ano após estar em categoria 2, o amador pode ir novamente realizar exame para categoria 1 (CT7).
A comunidade está a decrescer muito e isso deve-se bastante à legislação actual e ao custo dos exames, pois cada exame custa 50€. Se a este valor juntar-mos a perda do dia de trabalho, os custos de viagem, os custos de alimentação, etc... ainda custa bastante.
Bem, mas lamentos à parte, 4 anos depois de ter realizado exame para categoria 3, lá fui em direcção à ANACOM, junto com a minha namorada (actual CR7AML) e com o amigo Luís Garcia (actual CT7AEL), realizar exame e obter aprovação para subida deixando de ser CR7AEK e passando a CS7AEK.

PS: infelizmente em todo o distrito de Castelo Branco sou, actualmente, o único CS7 e desde 2009 (ano em que entrou em vigor a actual legislação) apenas 6 pessoas (do distrito) realizaram exame para radio amador, sendo que 3 delas são CR7...

Link's que vale a pena ver:




73 51
CS7AEK

Na imagem em baixo está representado um fluxograma básico do funcionamento do programa que corre no microcontrolador.
Uma breve descrição:
* O sistema é inicializado;
* A ADC é configurada;
* Entra no estado zero;
Aguarda alteração de estado, que será obtida na interrupção do botão. O botão deverá ser clicado para começar a leitura;
* Após o botão ser clicado a primeira vez, é enviada uma mensagem de inicialização.
* Aguarda novamente pelo botão, para dar inicio ao envio de valores;
* Quando o botão é clicado, entra no estado 2, estado de envio de valores, como pode ser visto na interrupção do timer;
* Se o botão for clicado novamente, entra no estado de pausa, estado 3, onde fica a aguardar novamente por um novo clique, que forçará novamente a entrada no estado 2;
* São feitas sucessivas leituras do byte de configuração da ADC e verificado o bit "RDY", para saber se os bytes da conversão foram actualizados;
* Quando se obtém uma nova leitura, os valores de ganho e ADC são alterados pelos mais recentes;
* É feito o ajuste do ganho do PGA (ver parte anterior) e é calculado o valor de corrente em uA;
* Em seguida a variável global é actualizada e contém o valor de corrente mais recente, pronto a ser utilizado quando ocorrer a interrupção do timer;
* O ciclo repete novamente;


No terminal, o utilizador pode ver algo como na imagem seguinte.

Hoje ao saber que a Philae tinha contactado novamente a Rosetta, encontrei esta sequência de vídeos.
Sinto-me tão burro por não conhecer isto ainda (primeiro video de 2013) e por os estar a ver pela primeira vez, mas por outro lado sinto que acabei de ver os melhores vídeos de sempre.
Por favor, vejam isto!!!
Para quem mal conhece a missão, esta é uma óptima oportunidade.













A comunicação utilizada pela ADC é I2C, em que neste caso o MCU é o mestre e a ADC é o escravo. Mais informações e detalhes sobre I2C podem ser encontrados AQUI.
O endereço da ADC será o 0x68, pois "Adr0" e"Adr1" por opção minha vão ficar ligados a GND, ou seja em low state.
0x68 == 0b01101000

Para proceder à configuração da ADC, basta enviar o comando de escrita (ultimo bit do endereço == 0) com o endereço 0x68 e em seguida enviar o byte de configuração.
Este pode ser visto na pagina 18 do datasheet.
Para a aplicação pretendida, o primeiro byte de configuração enviado é 0b10010100.
Após isto a ADC fica pronta a fazer amostragens de forma automática, recorrendo ao oscilador interno. A periodicidade de amostragens será de 16.6mS (1/60Hz).
O programa a correr no MCU fica a fazer leituras constantes ao byte de configuração (enviado o comando "read" após o endereço 0x68) para fazer verificação do bit "RDY". Como mostrado na parte anterior (AQUI) quando enviado o comando de leitura, a ADC retorna 3 bytes: 2 primeiros referentes à conversão e o ultimo referente ao byte de configuração (que contém o bit de estado "RDY").
Assim que esse bit mudar de estado e passar a "0", zero, significa que os primeiros 2 bytes já recebidos, correspondem a uma nova conversão.
A próxima verificação feita é a do ganho do PGA. De acordo com o seu valor a interpretação do valor medido, da ADC, terá de ser diferente também. Na parte anterior este procedimento já foi explicado e o bloco em baixo penso que se "auto-explica"...
 switch (gain)  
 {  
   case 0:               //ganho 1  
     if(adc < 1023)  
       MCP3428_config(3);     //ganho 8  
     else if(adc < 2047)  
       MCP3428_config(2);     //ganho 4  
     else if(adc < 4095)  
       MCP3428_config(1);     //ganho 2  
     uA_temp = 12.327 * adc;  //valor de calibração - fluke 724
     pga_gain = 1;  
     break;  
   case 1:                //ganho 2  
     if(adc >= 8191)  
       MCP3428_config(0);      //ganho 1  
     else if(adc < 2047)  
       MCP3428_config(3);      //ganho 8  
     else if(adc < 4095)  
       MCP3428_config(2);      //ganho 4  
     uA_temp = 12.389 * adc;   //valor de calibração - fluke 724  
     pga_gain = 2;  
     break;  
   case 2:                //ganho 4  
     if(adc >= 8191)  
       MCP3428_config(1);      //ganho 2  
     else if(adc < 4095)  
       MCP3428_config(3);      //ganho 8  
     uA_temp = 12.518 * adc;   //valor de calibração
     pga_gain = 4;  
     break;  
   case 3:                 //ganho 8  
     if(adc >= 8191)  
       MCP3428_config(2);      //ganho 4  
     uA_temp = 12.644 * adc;   //valor de calibração
     pga_gain = 8;  
     break;  
 }  
Por fim é actualizada uma variável global com o valor da corrente medida em uA. Essa variável contem sempre o valor válido mais recente e é expectável que seja actualizada a 60 vezes por segundo.
Um timer com interrupções a 50Hz (20mS), ligeiramente mais lento que a actualização da ADC para haver margem na alteração de ganhos do PGA, dá a ordem de partida dos dados (via USART) para o computador.
Os dados são então visualizados num terminal como mostra a imagem:

Assim se concluo mais um parte, mas as seguintes já vêm a caminho ;).

A sonda Philae acordou e saiu do modo de hibernação.
Entrou em hibernação em Novembro de 2014, após a aterragem no asteróide não ter corrido como esperado e ter ficado num zona sem luz solar. Isso impedia de recarregar as baterias e continuar devidamente a missão.
Ontem, dia 13 de Junho pelas 22:38 CEST, 21:38 hora portuguesa, a sonda "falou" durante 85 segundos com a equipa na Terra, através da Rosetta.
Agora a equipa espera que a sonda volte a entrar em contacto para descarregar os dados acumulados durante os últimos dias.



Agora que a corrente já foi medida e o sinal ampliado, o próximo passo é converte-lo para digital.
A procura pela ADC é uma coisa interminável, pois existem muitas, com várias funções etc...
O que procurei foi uma ADC com o máximo de bits, dentro do possível, pois com as comuns ADC de 10bits dos MCU a resolução mínima de leituras seria algo como 38uA (100mA/1023)... o objectivo é medir bem abaixo disso!
Uma vez que se pretende medir com algum rigor, a ADC tem de suportar uma entrada de Vref, sobre a qual serão feitas todas as divisões para a conversão.
Após alguma pesquisa e de ter conversado com o meu amigo Vitor Goulão (desde já um obrigado), consegui no stock dele uma MCP3428. Esta ADC tem mais do que aquilo que estaria a imaginar...
É uma ADC de 16bits, com 4 canais diferenciais (embora só vá usar 1 deles), com uma referencia interna de 2.048V (erro +-0.05%) e com um PGA na entrada (ganhos 1, 2, 4, 8), que me permite facilmente e de forma "digital" variar os ganhos de forma a ter sempre a máxima resolução possível. Esta ADC permite a medição de tensões negativas (canal diferencial) e por isso, os 16bits máx são aplicados de -2.048V a +2.048V. Como a tensão a medir será sempre positiva, quando configurada para leituras de 16bits, vou apenas ter resolução de 15bits, uma vez que não estou a usar a metade negativa da escala.
A frequência de leitura também afecta a resolução, pelo que para esta ADC:
 SPS - Samples Per Second
De forma a dar alguma rapidez na leitura e manter o máximo de resolução, optei pelo modo de 60SPS, ou seja, 14bits.
Qual a ideia geral?
Bem, para quando estiver a medir um sinal muito pequeno, ajustar a ADC para o PGA tenha o ganho máximo, à medida que esse sinal vai aumentando ir reduzindo o ganho do PGA. Simples... desde que se tenha em atenção a escolha dos valores, para que o programa não fique retido, mas isso vem a seguir.
O ganho do PGA é 1:
Topo de medição da ADC vai corresponder a 100mA;
Meio da medição da ADC vai corresponder a 50mA, então podemos subir o ganho.
O ganho do PGA é 2:
Topo de medição da ADC vai corresponder a 50mA;
Meio da medição da ADC vai corresponder a 25mA, então podemos subir o ganho.
O ganho do PGA é 4:
Topo de medição da ADC vai corresponder a 25mA;
Meio da medição da ADC vai corresponder a 12.5mA, então podemos subir o ganho.
O ganho do PGA é 8:
Topo de medição da ADC vai corresponder a 12.5mA;
O contrário também deverá ser feito, de modo a reduzir o ganho, quando o valor medido começa a subir. Para qualquer ganho abaixo de 1, se o valor medido for de 2^13-1, então o melhor é reduzir o ganho, porque se atingiu um topo de escala.

No que toca à comunicação, é utilizado I2C. Tem apenas um byte de configuração e aquando da leitura a resposta tem 3 bytes. Os primeiros 2 correspondem à leitura da ADC e o último é o byte de configuração que informa também se já foi feita uma nova leitura (utilizando o oscilador interno da ADC).


No proximo artigo irei descrever um pouco melhor os aspectos da comunicação, configuração e a gestão que o MCU terá de fazer.


Como escrito na 1ª parte deste projecto, para fazer a medição da corrente, não deveria provocar uma queda de tensão superior a 100mV na alimentação afim de medir um máximo de 100mA.
Para isso vou usar uma resistência de 1ohm.
R = V/I
R = 100mV/100mA
R = 1 ohm
Dado o baixo valor de queda de tensão é necessário um bom ampop, que tenha um input offset baixo.
Vamos tomar como exemplo o conhecido LM358, que tem um input offset de +-2mV. Isto significa que na medição de 100mV (correspondente a 100mA) teríamos um erro de +- 2mA. Um erro de +-2% é demasiado para o que tinha idealizado.
Após algumas pesquisas, surge então o MCP6V02 que tem um input offset de apenas +-2uV e ainda por cima é rail-to-rail. Com este ampop o erro será de apenas +-2uA, bem melhor do que aquilo que eu esperava.
Encontrado o ampop ideal para o serviço, resta determinar qual o ganho a usar... mas essa parte fica para a próxima parte. O ganho irá depender da referencia de tensão que conseguir encontrar ara a ADC.

PS: Como temos uma entrada de alta impedância, convém atenuar as altas frequências e por isso o conjunto R3 e C1 fazem um passa baixo com frequência de corte aprox. 16KHz.
A relação entre R1 e R2, que define o ganho da montagem, ficará como referia para a próxima parte.


Já passou bastante tempo desde que deixei de conseguir documentar algumas engenhocas que tenho vindo a fazer (principalmente devido ao mal comum a muita gente... a falta de tempo), mas agora com a necessidade surge mais um projecto pessoal, o uAmp Serial Monitor.
Motivado pela necessidade de fazer um registo temporal de corrente, para determinar com mais rigor a energia consumida por um sistema embutido, por um módulo rádio, etc...
O comum multímetro mostra-nos o valor instantâneo da corrente, mas não tem uma taxa de actualização muito significativa nem permite o registo de modo a conseguir ver com clareza qual o perfil de tempo x corrente do circuito a analisar.
Com um futuro cada vez mais low power, é útil a presença de um equipamento destes, quer para a medição quer para o registo das correntes e determinar o quão low power realmente é.
O meu objectivo geral é conseguir medir um máximo de 100mA (suficiente para o tipo de circuitos/sistemas já referidos) com uma queda de tensão máxima no Rsense de 100mV (Rsense será portanto de 1 ohm), o máximo de resolução possível, máxima frequência de amostragem possível e, claro, pelo menor preço possível. Na questão do preço, possivelmente com a ajuda de samples, pois trata-se de um prototipo...
O desafio aqui será manter uma resolução alta, sabendo que a escala também será bastante grande, pois, por exemplo, um simples módulo rádio pode consumir alguns uA (micro amperes) em sleep mode e dezenas de mA (mili amperes) em TX mode. Manter uma resolução consideravelmente boa em toda a escala, sem a intervenção humana para fazer alterações na escala de medição seria óptimo!
No entanto, para correntes tão reduzidas vários pontos vão ter de ser tidos em consideração para respeitar todos os requisitos iniciais.

PS: Não! Não vai dar para usar a ADC de 10 bits comum nos microcontroladores! Uma resolução de 97uA é grande de mais (100mA/1023)...


Não percam as próximas actualizações ;)