Projetei um pequeno PCB com sensor para minha tese de mestrado com um microcontrolador ATtiny44 . Preciso de cerca de 200 dessas placas para minha aplicação e 16 estão sempre conectadas localmente à placa controladora. Toda a rede fica assim:
Para me comunicar entre o controlador e as placas do sensor, escrevi meu próprio barramento de 1 pino (com base no tempo). O único problema é que a placa do sensor deve ter um endereço para saber sua localização na rede, quando envio seus dados para a placa controladora.
Como eu tinha apenas 1 pino no ATtiny, criei um circuito DAC baseado em jumper que deveria gerar uma tensão analógica com base na configuração de quatro jumpers. Como o circuito do sensor usa os valores (47, 470, 1k, 3k, 4k7, 10k, 100k e 220k) e eu queria otimizar a produção, usei os valores abaixo para o DAC (basicamente 100k, 50k, 20k e 10k ) O que deve fornecer um bom valor entre 0 V e 760 mV, com base na configuração do jumper. Exatamente o que eu precisava ler como tensão analógica com a referência interna de 1,1 V do ATtiny. Na partida, o ATtiny lê essa tensão e deve saber sua posição.
simular este circuito - esquemático criado usando o CircuitLab
Em teoria, isso funciona bem. Até fiz uma análise de Monte Carlo no LTspice para confirmar que não tenho áreas sobrepostas, considerando a tolerância dos resistores (todos são 1% BTW). Abaixo você encontra as fotos dessa análise.
Agora eu produzi várias (felizmente, não 200) dessas placas e, ainda assim, algumas não conseguiram obter leituras corretas em seus endereços (especialmente nas regiões de endereços mais altas, onde todas as tolerâncias acontecem ao mesmo tempo). Eu medi todas as soluções possíveis e finalmente descobri o meu problema. Minha análise original não incluiu a tolerância da tensão de alimentação de 5 V, que é gerada localmente a partir de 12 V com um MC7805 em cada placa controladora. Por folha de dados, o MC7805 tem uma tensão de saída entre 4,8 e 5,2 V.
Depois que eu descobri isso, modifiquei a análise de Monte Carlo. Agora, é assim:
Como você pode ver, existem boas áreas sobrepostas, onde não posso dizer com certeza que essa voltagem pode significar apenas esse endereço. Basicamente, todos os endereços que começam com não. 8 pode obter uma leitura falsa (com maiores possibilidades de leituras falsas para endereços mais altos).
Eu não gostaria de adicionar valores de resistores diferentes dos já usados no quadro (como na tese que eu quero otimizar para a produção).
Eu não gostaria de adicionar uma referência de tensão (por exemplo, diodo Zener) para alimentar a rede de resistores DAC.
Não posso mais modificar a placa controladora (e usar um regulador de tensão mais preciso).
Ainda posso modificar o design / esquema da placa de circuito impresso!
Como garantir sempre leituras corretas no endereço (por programa ou alterando o circuito)?
fonte
Respostas:
De acordo com suas simulações, seu esquema de endereçamento funciona bem, desde que sejam consideradas apenas incertezas nos valores dos resistores. É a incerteza sobre a tensão que faz com que ela falhe.
Meu conselho é cancelar as flutuações no VCC usando-o como referência ao ADC. Você pode fazer isso programando os
REFS
bits noADMUX
registro, conforme explicado na folha de dados :Depois de mudar para o VCC como uma tensão de referência para o ADC, você não medirá mais a tensão, mas uma relação entre os valores do resistor e esses são precisos para 1%. Nenhuma mudança é necessária no esquema (embora você possa aumentar o valor de R7 para obter suas medições no meio da faixa de conversão da ADC), apenas o firmware do Attiny precisa ser atualizado.
Se você ainda estiver disposto a refazer a placa do sensor, poderá substituir seu esquema por uma escada R-2R, como Cano64 sugeriu:
simular este circuito - esquemático criado usando o CircuitLab
Isso otimizará a resolução, tornando todos os passos da escada iguais. Os resistores de 1% são precisos o suficiente para construir escadas monotônicas de até 5 bits.
fonte
Eu tive que resolver um problema semelhante uma vez. Eu precisava conectar 4 botões a um pino analógico no arduino, no entanto, precisava reconhecer pressionamentos simultâneos (todas as combinações). Eu criei o mesmo circuito que você e, em seguida, escrevi um programa para pesquisar todas as combinações possíveis de valores do resistor, para que os valores finais ao pressionar os botões fiquem o mais separados possível. Adivinha? Estamos ferrados, isso não pode ser feito. É isso, tenha um bom dia.
Aprendi que os valores ideais do resistor para os interruptores estão próximos de R, 2R, 4R, 8R e a parte inferior do divisor tem um valor de R. Seu circuito já está próximo do ideal, basta substituir R7 por 10k resistor.
Mas há uma boa notícia para você. Como você só precisa definir um endereço (não operará o comutador enquanto o dispositivo estiver em execução), recomendo usar os comutadores SPDT e a escada R2R .
fonte