Archive for April 2014

Filtro para leitura de ADC

screenshot.73
Durante muitos anos eu desenvolvo técnicas de filtros passa baixo por software em leitura de ADCs, para obter um sinal médio mais estável e mais funcional.

Existem diversas técnicas, já usei muitas.

Ao final das contas, ultimamente estou optando por uma técnica muito rápida e que ocupa pouco software, mesmo que ela faz uma média de 16 leituras.    Essa técnica, que vou chamar aqui de “MDM” (média das médias), vai ocupar o mesmo espaço em variáveis e praticamente a mesma quantidade de código para memorizar 1, 2, 4, 8, 16, 32 ou 64 leituras.

Para facilitar o software é interessante sempre optar por uma quantidade de amostragens que seja equivalente a 2^n, a fim de facilitar a divisão, que será feita usando só a instrução “shift-right”.

Uma técnica que eu vinha usando por anos era a do “buffer rotativo”, ou seja, eram alocados 32 bytes na memória, para 16 leituras (2 bytes cada), e um ponteiro que ficava rodando nesse buffer a cada nova leitura, substituindo a leitura mais antiga pela mais nova, então todos os 2×16 bytes eram somados e o total era dividido por 16, a fim de obter a média das ultimas mais recentes 16 leituras.

A técnica que apresentarei aqui hoje, a “MDM”, não é a média de 2^n leituras, mas é a média das médias infinitas, o que apresenta uma estabilidade muito maior, e na prática quase que independe de acumular 4, 8, ou 64 leituras, a média das médias será praticamente a mesma, o que mudará com mais ou menos leituras é a resolução do ultimo bit do valor a mostrar.

A idéia é diluir a medida atual num balde de “n” medidas anteriores, de forma a obter a média simples das leituras, mas sempre manter a média de “n” leituras anteriores.

Atenção ao detalhe, estarei mantendo A MÉDIA de “n” leituras anteriores, e não as “n” leituras anteriores.

No caso de um microcontrolador que possui um ADC de 10 bits, precisarei de dois bytes para armazenar o valor lido (VL) e a média das leituras (ML) , e também precisarei de outra variável que caiba a soma de “n” leituras (SL) de valor máximo do ADC, no caso de 10 bits, é 1024.

Portanto, precisarei de duas variável de 16 bits, e uma terceira de também 16 bits, para conter o valor máximo somado de 16 x 1024 = 16384.

Inicialmente carrego SL com a metade do valor máximo de 16 leituras, que é 8191 (0x1FFF). Pode ser qualquer valor, até 1 ou 16383, só não pode ser 0×0000 ou 0×8000, senão dá problemas na rotina.

Em seguida leio o ADC em VL, digamos que foi lido 0x13A.  Subtraio ML de SL e somo VL.

Portanto, a variavelzona SL terá :   0x1FFF – 0×0000 + 0x013A = SL = 0×2139.
Agora copio SL para ML e faço quatro shifts right em ML, obtendo o valor 0×213.
Nesse instante, o valor médio ML  será 0×213.

Leio novamente o ADC em VL, digamos que pela instabilidade foi lido 0x13D, subtraio ML de SL e adiciono VL, copio VL para ML, faço quatro shifts para a direita em ML, o que o divide por 16.
Vejamos, SL era 0×2139, subtrai 0×213 e somei 0x13D, agora SL = 0×2063, copio para ML e faço 4 shifts para a direita, resultando no novo valor médio ML de 0×0206.

Aproximadamente após 100 leituras e rodadas acima, o valor ML será a média simples das leituras do ADC, com grande estabilidade.

Uma centena de leituras parece muito, mas se a fizer a cada 5ms, significa 500ms para estabilizar a leitura.  A partir dai, as mudanças no sinal lido serão menores e poucas rodadas estabilizam.

Note que essa técnica funciona melhor quando o ADC roda continuamente, alimentando a rotina das médias.  A qualquer instante, para saber o valor da média das leituras, basta ler o valor de ML.

A teoria da rotina é que ao retirar a média das médias do valor de 16x médias, essa soma passa a ser 15x medias, e então soma-se o valor lido do ADC, e divide-se por 16, que seria o mesmo que subtrair 1/16 da média obtida e somar 1/16 do valor lido.  O problema é que fazendo dessa maneira, perde-se-ia quatro bits de baixa ordem do valor lido, e na prática seria como se eliminando os 4 bits de baixa ordem, obtendo estabilidade na marra com 6 bits do ADC.

Com a técnica acima, obtem-se a mesma estabilidade dos 6 bits da alta ordem nos 10 bits do ADC, o que é muito interessante.

Na tabela abaixo, feita no Excel, temos SL (que inicia com 0x1FFF), VL (um valor randomico entre 251 e 258) e ML (a média das médias).  Note que após aproximadamente 80 rodadas, ML já está estabilizando em torno de 256/255.


O gráfico abaixo da “perseguição” de “ML” com base em “VL”, mostra a aproximação sucessiva e a centralização em 254/255.

screenshot.76

Multiplicação Binário 2

Já expliquei em outro post como multiplicar em binário, mas agora explico uma nova maneira de multiplicar, que talvez seja até mais simples de entender e fazer, apesar de ser sempre a mesma coisa, ter a mesma base, e usar a mesma mecânica.

Consideremos que a nossa multiplicação tenha dois operadores, A e B.

Digamos que A=1537 e B=723

O resultado esperado é 1527 x 723 = 1104021

Vamos nomear uma variável R como sendo o resultado.

   1) R=0
   2) Shift A um bit para a direita
   3) Se ocorreu carry bit, ou seja, A “era” impar, some B em R
   4) Shift B um bit para a esquerda

   5) Repita 2-4 até A ser zero.

Pronto, R contém o resultado de A x B

A técnica é somar o valor atual de B em R, só quando A é impar, e desprezar B quando A é par.

Duvida? Veja:

                   A                         B                         R

Isso é muito simples, não é?

Ventilador na Placa de Motor de Passo TB6560AHQ

image.851

Olá, tenho uma daquelas placas Driver de Stepper Motor do eBay, para 4 motores, fabricados pela empresa chinesa www.huy68.com , ela usa o chip Toshiba TB6560AHQ, que é uma dupla ponte de potência, capaz de fornecer 3.5A @ 40Vdc aos motores .

Essa placa contém um dissipador único e longo sobre os chips, com um ventilador de 40mm, 12Vdc, que roda a toda velocidade, todo o tempo.  Ele é barulhento e não faz tanto vento, o que é comum para ventiladores de baixo custo como esse.  Além disso, o ventilador é alimentado pelo regulador 12Vdc exitente na placa. O ventilador consome entre 100 a 120 mA, parece pouca corrente, mas se o usuário alimenta a placa com os 24Vdc recomendados, o regulador LM7812 irá se dissipar a tensão e corrente extra, de até 1,5W apenas para alimentar o ventilador, energia e calor desperdiçado.

Devido a esse pequeno problema de projeto, o LM7812 fica desnecessariamente quente.

image.853

Além disso, este regulador 12Vcc, alimenta o regulador LM7805 que fornece o +5Vdc para os foto-acopladores e os chips TB6560AHQ.  Qualquer consumo nos +5V irá dissipar ainda mais calor no regulador LM7812.

O LM7812 é instalado em um pequeno dissipador negro, que pode não refrigerar adequadamente o regulador com a placa em funcionamento. Você pode ver os dois dissipadores negros na foto à direita, com os respectivos reguladores parafusados. O fios vermelho e preto no pequeno conector branco são os que alimentam o ventilador com 12Vdc.

Então, inicialmente eu cortei um fio do ventilador e inserí 6 diodos 1N4007 em série, para reduzir os 12Vdc ao ventilador, o que resultou em 8Vdc.  Isso reduziu a velocidade, o barulho e a energia consumida, baixando um pouco a temperatura do LM7812, mas não foi suficiente.

Air Flow do duto para as 7805 e 7812 os reguladores

Então, eu criei uma canaleta de fluxo de ar feito com cartão de papel (cartões de visita), de forma a orientar o ar empurrado pelo ventilador para os lados do dissipador maior, e no final (parte de baixo da foto) fiz o duto virar à esquerda e continuar ar sobre os dissipadores de calor LM7805 e LM7812.  Dava para sentir o ar mais frio fluindo sobre os dissipadores dos reguladores 7805 e 7812, que os refrigerava melhor, mas não o ideal.

Mas essa foi uma solução feia e trabalhosa.

Então eu pensei para mover o regulador LM7812 para o dissipador maior dos TB6560AHQ, que possui o ventilador.   Então eu dessoldei oLM7812, soldei três fios longos (vermelhos na foto) e movi o LM7812 para entre duasduas aletas do radiador do dissipador maior.

A 7812 foi deslocada da sua posição original, para ser inserido entre duas aletas do dissipador de calor grande. Eu lambusei o LM7812 com um pouco de pasta térmica branca e o inserí entre as aletas do dissipador. Foi necessário usar uma chave de fenda para abrir um pouco as aletas, o LM7812 entrou justo e ficou bem preso. Não foi necessário nenhum parafuso de fixação, pois é impossível remove-lo sem forçar as aletas com uma ferramenta qualquer.  Com as aletas forçadas abertas, a trazeira do LM7812 assentou certinho sobre uma aleta e a pasta térmica.  Assim a transferência térmica do LM7812 ficou muito melhor que quando no seu pequeno dissipador original.

Okay, o problema do LM7812 foi resolvido, agora precisei resolver a velocidade da rotação do ventilador.  Eu pensei em duas possíveis soluções, a primeira usar um simples circuito de três op-amps, gerando onda quadrada, convertendo em triangular, comparando com uma tensão sobre um NTC e gerando um PWM que alimentaria o ventilador.

A tensão dividida entre um resistor fixo de 10kΩ e o NTC, varia em torno de 6Vdc com 75°F.  Quando a temperatura sobe, a tensão no NTC é reduzida.  O terceiro op-amp compara a tensão do NTC com a forma de onda triangular, e quando a triangular for maior que a do NTC, isso alimentará o ventilador.  Quanto maior a temperatura sobre o NTC, mais tempo a triangular é maior que a tensão do NTC, e mais tempo o ventilador é alimentado. Essa comparação ocorre milhares de vezes por segundo, gerando um controle por PWM sobre o ventilador. Como a saída deste op-amp alimenta a base de um transistor PNP que alimenta o ventilador, , quanto mais largoé este pulso, mais rápido gira o ventilador.

Ao redor de  90°F a tensão NTC é cerca de 4.8Vdc, menor que a parte inferior da tensão da forma de onda triangular, de modo que a saída do terceiro op-amp será constante, aplicando-se energia 100% ao ventilador, com a intenção entre 75 e 80°F.

Se a temperatura do dissipador cair abaixo de 75°F, o ventilador irá parar de girar, reduzindo o consumo de energia e barulho. Essa idéia é boa, mas usa 9 resistores a bordo, requer alguns ajustes para funcionar nas temperatura desejada e não é exatamente “alta tecnologia”, é uma solução analógica simples.

Abaixo o esquema dessa solução analógica, ela funciona muito bem.   Eu desenvolvi o esquemático no simulator da Linear Technology CAD (LTspiceIV), então montei num protoboard e testei adequadamente. Funcionou muito bem, de acordo com o esperado.

image.855

Mas eu tinha a segunda idéia.

Apesar da solução analógica acima funcionando muito bem, eu sempre procuro ver se não é possível resolver o problema usando um microcontrolador, pois as vezes isso economiza componentes e o ajuste é feito por software, o que as vezes é mais fácil.

Por ser pequeno, o Atmel AtTiny13 atendia muito bem a solução, resuzindo diversos componentes usados na solução analógica.  A solução com o AtTiny13 usa só dois resistores, um para formar o divisor resistivo com o NTC, e outro em série com a base do transistor PNP, que alimenta o ventilador.

Claro que a solução usando o AtTiny13, requer +5Vdc, e que, apesar disso existir na placa, iria requerer mais um fio entre a placa e a plaquinha do AtTiny.   Chegando na plaquinha do AtTiny eu já tinha “terra”, “+12V”, e os fios do ventilador.  A solução foi usar um LM78L05, involucro TO92, pequeno suficiente para não causar nenhum incomodo ao projeto em questões de tamanho.  O consumo do AtTiny é muito pequeno, portanto o 78L05 atende perfeitamente sem aquecer.

A placa de controle. Veja o NTC no lado direito, protegido com fita kapton.

À esquerda uma foto do prototipo contendo o AtTiny13, seis pinos de programação ISP, dois resistores, um capacitor, o regulador 78L05, e o transistor BDxxx para alimentar o ventilador.  Saindo ao lado direito da plaquinha, dois fios, amarelo e vermelho, liga ao NTC protegido por fica Kepton.  A idéia é enfiar esse NTC no fundo da canaleta do dissipador e captar a temperatura mais próxima aos chips TB6560AHQ.

Então, a emenda do divisor resistivo entre o resistor 10kΩ ligado à +5Vdc e o NTC ligado à terra, vai diretamente ligado à uma entrada ADC (conversor analógico-digital) do AtTiny1. A idéia aqui é escrever um programa simples no AtTiny que lê o ADC, que utilizando a função Timer / Contador à bordo, controla pulsos na forma PWM que alimenta a base do transistor PNP que alimenta o ventilador.   O programa lê o ADC, e enquanto o valor estiver dentro de uma certa faixa de valores, liga o PWM com diferentes larguras de pulso, de acordo com a temperatura lida pelo ADC.

Sendo programável, isso se torna muito mais maleável que a solução analógica usando os tres op-amps acima. Uma das desvantagens do sistema analógico é que o ventilador inicia a rodar muito lentamente, e as vezes nem parte adequadamente com pequena diferença térmica.  Usando o AtTiny13, eu posso dar um tranco maior no ventilador para iniciar a rodar e reduzir o PWM para mante-lo lentamente, se for o caso de pequena diferença térmica.

A placa de controle que está sendo instalado, consulte o regulador 78L05 eo corpo transistor BDxxx acontecendo entre duas aletas do dissipador de calor.

A foto ao lado mostra a pequena placa protótipo sendo instalada. Note do corpo do transistor BDxxx indo entre as aletas do dissipador de calor, juntamente com o corpo do TO92 78L05. Ambos entram apertados nas aletas, ficando bem presos. Ambos os transistores descem isolados bem para dentro das aletas, servindo tanto como suporte à plaquinha protótipo, quanto dissipando o possível calor gerao pelo BDxxx e o 78L05.

A fita Kepton amarela no dissipador é para prevenir os pinos ISP tocarem o aluminio.  Numa possível placa final, esses pinos não existiriam. A altura do corpo DIP8 do AtTiny13 serve como espaçador entre o topo das aletas do dissipador e a placa protóripo.

Foi usado um BDxxx para alimentar o ventilador, claro que eu testei com um TO92 2N4103, que funcionou bem, mas pensando em situações ainda não previstas, decidi manter o BDxxx que aguenta maior abuso e também um ventilador maior, um mesmo um segundo ventilador em paralelo, se necessário.

O próximo passo seria produzir uma PCI profissional, que irá alojar também os reguladores 7812 e 7805, e coloca-la à venda no website http://www.urkit.com, por um preço baixo.

image.854

À direita você pode ver a placa sobre o dissipador de calor, na placa final acredito que um simples parafuso a fixaria ao dissipador.

No software do AtTiny13, fiz com que, ao alimentar a placa com energia, o ventilador ligasse tres vezes em máxima rpm por um ou dois segundos, como sinalizador de que o ventilador e a plaquinha de controle estão funcionando adequadamente.  O problema é que ao alimentar a placa, no início o dissipador está frio e o ventilador irá demorar algum tempo para ligar, e só o fará após o dissipador aquecer. Se existir algum problema, o operador pode não peerceber.  Assim, ao ligar, o operador ouvirá as tres acelerações do ventilador e saberá estar funcionando.

Penso que para um prototipo até que ficou funcional.

Wiring Pen

Existe um tipo especial de fio magnético (fio esmaltado) que derrete o esmalte com a temperatura do ferro de solda.  Esse fio é especial para fabricar protótipos de circuito impresso, e evita descascar uma pancada de fios para tal.  Basta encostar a ponta do fio no ponto a soldar, encostar o ferro de solda e pronto, o esmalte queima / recolhe, e a solda adere ao cobre.

Parece algo mágico, não é? Não, não é bem assim.  Precisa dar uma apertada no fio, esfregar a ponta do ferro de solda e a temperatura tem que estar um pouquinho acima do usual.  Também que o esmalte não queima ou recolhe assim tão limpo, fica lixo do esmalte sobre o cobre.

Dá um pouco de trabalho, mas ainda assim compensa usa-los ao invés de fios com ponta descascada, etc.

Esse fio chama-se “Magnetic Wire Solder” ou “Magnetic Wire Solderable”.  Existe à venda em diversos lugares, principalmente no eBay, é só um tiquinho mais caro mais caro que o fio esmaltado comum.

Bem, até ai tudo bem.

Mas para facilitar o uso e solda desse fio, eu montei uma ferramentinha que permite aplicar o fio com melhor precisão.  Isso até existe comercialmente para vender, e chama-se “Wiring Pen”, que em português se traduz para “Caneta de Passar Fio”.

Eu fiz a minha, porque as comerciais são de plástico injetado e custam mais de $30, um roubo e tanto.

Usei o corpo de canetas um pouquinho mais grossas, removi o interior, fiz um furinho to topo para passar o fio para dentro dela, na ponta colei com durepoxy agulhas de injeção com a ponta serrada, usei um clip prendedor de papel, uma bucha de parede e um carretel de linha de máquina de costura, uma capinha plástica de ponta de ferro de estante sobre a ponta da bucha, para evitar o carretel sair.  Beleza… Funciona muito bem.   O carretel não pode ficar soldo na bucha, e não fica, o que evita do fio desenrolar todo. As fotos abaixo explicam melhor.

DSCF0713s

Uma pequena entortada no Clip de papel para que ele vestisse melhor sobre o corpo da caneta, veja nas laterais.  Na orelha do clip, entrou a bucha plástica de parede, sobre ela o carretel, depois as duas orelhas do clip de papel são levantadas e o terminador plástico segura tudo no lugar.  Um carretel desses de máquina de costura cabe diversos metros de fio, isso dá para meses de brincadeira.

DSCF0724s

Elástico em volta dos bracinhos do clip de papel para manter as orelhas fechadas, sim ou não, o elástico prende melhor o carretel e realmente evita dele girar fácil.  As vezes você precisa do fio sair com mais dificuldade lá na ponta para poder rotear ele melhor no protótipo.  Eu também escrevi com caneta permanente o número AWG do fio no corpo do clip.  Na prática o fio 34 é mais dificil de usar, e o 27 é um tiquinho grosso demais, mas para barramentos de tensão e terra o 27 vai bem e dá mais ‘segurança’ mental.  O AWG 31 é ‘pau-prá-toda-obra’ e é o que mais uso.

DSCF0727s

Aqui dá para ver as pontas das agulhas de injeção.  Usei duas medidas diferentes de agulhas, veja que o fio mais fino usa uma agulha mais fina.  Não é tão importante, mas eu as tinha à mão.  Infelizmente para passar o fio pela agulha tem que desmontar a caneta, então eu tomo cuidado de não deixar o fio entrar de volta.

Ferramenta Agulha

Recentemente comprei diversos pacotes de agulhas para as máquinas de costura, overlock e overstitch da patroa, e vieram 40 agulhas erradas, muito espessas (120/19) e recobertas por titanium. Nenhum tipo de costura que ela faz usará essas agulhas gigantes e próprias para costurar couro de 4mm ou mais, então ficaram comigo.

Rapidamente as converti em uso na bancada. Sempre tem uso, raspar algo, limpar PCI suja, furar, cutucar ou enxotar visita chata.

Inicialmente fiz usando uma seringa plástica, ficou bom, principalmente porque a agulha ficou retractil. Depois procurei uma caneta plástica adequada, mas todas tem o corpo muito fino, ruim de manusear, então encontrei os markers permanente secos… “quem guarda o que não presta, tem o que precisa”.

Uso o mesmo tipo de seringa para graxas de todo tipo a usar em mecanismos pequenos. Também uso seringa para solda em fio, enrolado dentro dela, fica fácil de segurar ao soldar. Pretendo também fabricar um “wiring pen” com esse mesmo corpo de caneta, para rotear PCI prototipo usando os fios esmaltados soldáveis que chegarão essa semana, AWG de 26 a 34.

Para quem não sabe, existem fios esmaltados que a capa isolante derrete na ponta do soldador, permitindo soldar sem descasca-la. Isso é muito prático para reparar PCI ou fabricar protótipos. Aquele japonezinho maluco que fez um zilhão de fios assim, postado aqui há meses atrás, usa esse tipo de canetinha e fio.

Alguém pode perguntar: mas por que então não usar a seringa com própria agulha de injeção? Porque é muito frágil e dobra… agulha de máquina de costura, principalmente essa ai com capa de titanium… nem a pau, a ponta não entorta nem por decreto.

O que é aquela coisa azul enrolada no corpo da agulha, próximo ao embolo da seringa? fita isolante. Pensei em evoluir para epoxy… mas funcionou tão bem, não desliza sozinho e mantém a agulha firme. Tirei a escrita da caneta (Rekord) com acetona e marquei com fita isolante azul para saber que não é mais uma caneta.

 

imageb1

imageb2

imageb3