asil de R$ 1.000,00 , eu acho que o projeto já começa a ficar viavel... desde que encontre pessoas dispostas a pagar...rsrsrsrs
Item
Qte
Descrição
V. Unit
Tot
1
1
CI Drive, irs2334
$6.44
$6.44
2
6
IGBTs , irgr4045d
$3.16
$18.96
3
1
Placas de CI
$25.00
$25.00
4
1
Fonte SW 15 VDC (20W)
$30.00
$30.00
Total Geral
$ 80.4
…
ê tem uma fonte de tensão, a qual tem uma saída entre 1,25V e 22V, ajustável em dois potenciômetros. Se sua fonte for exatamente como o esquema elétrico que você postou, então fica claro que um dos potenciômetros (o de 4.7k) é para ajuste "normal" da tensão, e o outro (o de 470 ohm) é para o ajuste "fino" da tensão de saída. E há dois transistores TIP 147 os quais são os drivers de potência para a tensão de saída da fonte. Inclusive, analisando as ligações destes dois TIPs, vê-se estão corretas. O regulador de tensão é o LM338T, e os diodos 1N4002 (D7 e D8) são para proteção deste LM338T. Esta é uma proteção contra corrente reversa excessiva proveniente de C4 e C5 quando a fonte é desligada, mas segundo o datasheet do LM338, ela só é necessária quando C4 e C5 tem valores muito altos (o que não é o seu caso, já no seu circuito C4 e C5 tem apenas 1uF).
E o que entendi sobre o que você deseja implementar: acrescentar à esta Fonte uma saída de corrente ajustável.
Mas há informações faltando: 1) qual a faixa de corrente ajustável que você pretende ter na saída de corrente? 2) qual a tensão máxima de saída para esta fonte de corrente?
Eu não sei qual seu conhecimento de eletrônica. Mas estou assumindo que você não conheça muito os conceitos relacionados à uma Fonte de Corrente. Assim, vou usar o conceito de Fonte de Tensão para ajudar você a entender os conceitos similares para uma Fonte de Corrente. Uma Fonte de Tensão, fornece uma tensão constante, à qual é entregue a uma carga qualquer. Mesmo que a tensão seja ajustável, ainda assim é uma Fonte de Tensão, pois uma vez ajustada, a tensão se mantém constante e independente da carga conectada. Como essa carga possui uma resistência elétrica, digamos "R1", a corrente "i1" pela carga será i1=V/R1 , sendo "V" a tensão fornecida pela fonte. Se você muda a carga, e ela tem uma resistência "R2", então a corrente "i2" nesta carga será i2=V/R2. Como você pode perceber, nos dois casos a tensão é constante e igual a "V", porém em cada caso a corrente foi diferente e dependente da resistência elétrica da carga. Em outras palavras: numa Fonte de Tensão, a tensão de saída se mantém constante, e a corrente de saída depende da carga. Uma consequencia disso, é que a Potência fornecida pela fonte será variável, e dada por: P=V*i, sendo "i" a corrente fornecida (e dependente da resistência da carga). Mas é claro que há um limite para a Potência fornecida, senão poderíamos "puxar" cada vez mais corrente (diminuindo a resistência da carga), e isso indefinidamente nos levaria a uma Potência infinita (o que não é possível). Logo, há um limite para a Potência máxima fornecida pela Fonte de Tensão, o que nos permite calcular a corrente máxima de saída, que será iMax= Pmax/V. Note na equação que "V" é o mesmo de sempre. E o que ocorre se você conectar cargas que tentem puxar mais corrente? simples: como a Potência da fonte tem um limite (Pmax), a tensão de saída começa a diminuir (olhe a equação e isto fica claro), deixando portanto de ser constante. Logo o que se conclui? também simples: que a tensão de saída de uma Fonte de Tensão, se mantém constante, desde que vc não ultrapasse a máxima potência fornecida pela Fonte.
Para uma Fonte de Corrente ocorre um comportamento idêntico, porém quem se mantém constante é a corrente. Neste caso, é a tensão de saída que mudará, conforme a resistência elétrica da carga que você conectar à fonte, e o valor desta tensão será V=R*i, sendo "R" a resistência da carga, "i" a corrente constante da Fonte de Corrente. Note que a equação é a mesma de uma Fonte de Tensão constante, porém no caso de uma Fonte de Corrente quem se mantém constante é a corrente (e a tensão se ajusta conforme a resistência elétrica da carga). Mas afinal, nós podemos aumentar "R" indefinidamente e ainda assim a corrente se manterá a mesma? Obviamente que não, porque se isso ocorresse, a tensão de saída para uma carga "aberta" (fonte sem carga conectada), seria infinita para que a corrente se mantivesse a mesma, o que sabemos não é possível. Este comportamento ocorre exatamente pelo mesmo motivo que limitava a Fonte de Tensão: a Potência máxima fornecida pela fonte. Como P=V*i, se há uma potência máxima Pmax, o valor máximo da tensão de saída em uma Fonte de Corrente será Vmax= Pmax/i, sendo "i" a corrente constante da fonte. Quando a tensão de saída atinge esse valor Vmax, terá sido alcançado a Potência máxima da fonte, e a partir daí a corrente cai, não sendo mais o valor constante nominal.
Sabendo estes conceitos e comportamentos das Fontes de Tensão e das Fontes de Corrente, permite a você calcular ou determinar os limites reais que serão possíveis de se obter na prática, quando se tem Fontes ajustáveis.
Mas há uma implicação mais severa ainda destes conceitos: não há como você ter simultaneamente nos mesmos terminais de saída de uma fonte, tensão constante e corrente constante. Note que a palavra chave aqui é "simultaneamente". Isto porque se a tensão fosse constante e a corrente fosse também constante, qualquer carga conectada a esta fonte, teria sempre a mesma resistência elétrica, a qual seria R=V/i. Sabemos que isso não é possível, já que a resistência elétrica é uma característica intrínseca dos materiais e substâncias existentes na Natureza (e não são determinadas pelas tensões e correntes de uma fonte: estas resistências são o que são e ponto!!!).
Logo, se sua intensão era ter uma fonte onde nos mesmos terminais de saída você ajusta a tensão e a corrente fornecidas, então vai ter que tentar projetar isso em uma outra dimensão espacial, onde talvez as leis da física sejam outras.
Mas é possível ter uma Fonte de Tensão e uma Fonte de Corrente de forma simultânea, desde que não compartilhem exatamente os terminais. Desenhei junto ao circuito da sua Fonte de Tensão, um protótipo de uma Fonte de Corrente ajustável, e que é mostrada na região de cor verde na figura a seguir:
A corrente é ajustável em "P1", e seu valor é "Ix", fornecida no conector marcado como "saída da corrente" (observe as polaridades + e -). Os valores dos resistores e capacitores descritos no circuito, são típicos e caso você deseje saber como eu os determinei, te explicarei em outro post.
Observe que usei o TIP 147 como "driver" para a corrente de saída, já que você já estava usando este transistor. Assim como na sua fonte original, esse TIP 147 deve ser provido de dissipador.
Note que o AmpOp (Amplificador Operacional) no circuito da fonte, é alimentado pela tensão "VF", e portanto tem que ser capaz de suportar essa tensão em condições normais. Provavelmente este é o ponto mais crítico desse projeto, já que a maioria dos AmpOp que existem por aí, não costuma trabalhar com tensões acima de 32V (e pelo que entendi, sua tensão "VF" é de 35,6V). Mas existem sim AmpOps capazes de trabalhar com tensões desse nível, mas são mais incomuns.
Outro ponto importante, é que é desejável que o AmpOp seja do tipo "Output Rail to Rail", ou então que a sua tensão máxima de saída esteja dentro de 0,5V abaixo da tensão de alimentação. Esse valor piora com o aumento da corrente na saía do AmpOp, porém na configuração mostrada, essa corrente é muito baixa, principalmente porque o TIP 147 é do tipo "Darlington" com ganho HFE maior que 1000.
O fato do TIP 147 ser "Darlington", também implica que a tensão base-emissor é bem maior que em transistores simples. Isso ajuda muito, pois para garantir o corte total do transistor, não é preciso que a tensão de saída do AmpOp esteja dentro de 0,5V abaixo da tensão de alimentação "VF", pois a tensão base-emissor do TIP é pelo menos o dobro desse valor.
Um AmpOp que quase atende tudo isso, é o LM358. Porém a máxima tensão de alimentação do mesmo, é de 32V. Caso a tensão "VF" da sua fonte possa ser reduzida para estes 32V, então o LM358 pode ser usado. Estou mencionando o LM358 devido à sua imensa popularidade e baixo custo.
E como determinar a corrente de saída? Não é complicado. Ela é determinada da seguinte forma: Ix= (VF-Vc) / Rx. Assim o que se precisa fazer, é primeiro determinar o valor máximo que se deseja para a corrente Ix. Com isso determinado, escolhe-se um valor característico para Rx (tipo 10 ohms, 5 ohms, 1 ohm, dependendo do valor máximo de Ix), e então se calcula o valor de "Vc", já que Vc=VF - (Ix*Rx). Esse valor calculado, é o valor mínimo de Vc, que dará a máxima corrente da Fonte de Corrente ajustável. Podemos chamá-lo de "VcMIN", e ele é exatamente o valor da tensão "Vy" sobre o resistor "Ry". Portanto, conhecido este valor "Vy", é possível calcular o valor de "Ry" e do Potenciômetro "P1", já que formam um divisor de tensão. A dica aqui é: escolha um valor adequado para "Ry" (exemplo: 10k, 47k, 100k), e então calcule P1 por divisor de tensão. Como P1 é um potenciômetro, não é preciso que ele tenha o "valor exato" calculado, e se esse valor for muito distante dos valores comerciais, basta alterar ligeiramente o valor de "Ry" e refazer o cálculo de P1 de forma a se obter um valor mais próximo aos comerciais. Atente que o valor de P1 determina a máxima corrente Ix e portanto procure evitar escolher um valor comercial maior que o valor calculado, justamente para que a corrente máxima Ix não ultrapasse o limite pretendido.
A princípio pode parecer complexo, mas na realidade é muito simples. Assim não se intimide pela aparente complexidade. E se vc tiver alguma dúvida, estou à disposição para ajudar a esclarecer. Não se intimide pela aparente complexidade.
Observações finais: veja que a "topologia" da Fonte de Corrente que mostrei na figura anterior, é do tipo para "Carga Aterrada", também chamada de tipo que "fornece" corrente. A característica dessa topologia, é que a carga é sempre ligada entre o GND ("terra" do circuito, que é o terminal "-" da saída da Fonte de Corrente) e o terminal "+" da saída (que é o coletor do TIP). Em outras palavras: a corrente é fornecida pelo terminal "+", passa pela carga, e retorna para o GND (o "-" da fonte de corrente). A única dificuldade dessa topologia, é que o AmpOp tem que ser alimentado pela tensão "VF", a qual pode ter valores mais altos (que é o seu caso).
No entanto, se não for uma necessidade que sua carga seja "aterrada", vc pode usar a topologia de "drenagem de corrente". Esta topologia é mais comum e portanto a mais utilizada nos circuitos. O circuito é quase idêntico ao da topologia de "carga aterrada". No entanto há uma grande vantagem na topologia de "drenagem de corrente": o AmpOp pode ter alimentação completamente diferente da tensão "VF". Por exemplo, na topologia de "drenagem de corrente" você pode estar usando o seu valor de 35,6V para "VF", e o AmpOp ser alimentado com apenas 5V. Então isso facilita enormemente escolher um AmpOp comercial (o popular LM358 é ainda mais perfeito nesta topologia). E como a carga é ligada nesta topologia "drenagem de corrente"? simples: é ligada entre o coletor do transistor driver (que passa a ser o terminal "-" da fonte), e a tensão "VF" (que passa a ser o terminal "+" da fonte). Na figura a seguir mostro a topologia de "drenagem de corrente":
Observe que nesta topologia, o transistor deve ser do tipo NPN, por isso está como TIP 142, que é o par complementar do TIP 147.
O cálculo dos componentes, é praticamente idêntico à toplogia de "carga aterrada", porém no lugar de "VF" nas equações, usamos o GND, ou seja 0V, o que causa uma ligeira simplificação.
Mais uma vez, fico à disposição para ajudar em quaisquer esclarecimentos e orientações.
Abrçs,
Elcids
…
Adicionado por Elcids Chagas ao 7:14 em 18 maio 2018
mo 5V ou 12V por exemplo). E sobre isso, falarei mais à frente (uso de um “driver” simples).
Sobre vc ter usado o TIP122 inicialmente, veja que as características de Potência são parecidas com as do TIP41, e portanto vc também estava forçando a junção Base-Emissor com correntes um tanto altas. Se a junção Base-Emissor é danificada, então o Transistor não é mais confiável, pois não irá se comportar como esperado.
Sobre a aquisição do MOSFET, verifique o famoso site de compras “ML” (pelas iniciais vc sabe qual é). Facilmente vc encontrará diversos modelos de MOSFET. Aconselho procurar anúncios que vendam múltiplos de 5 ou 10 unidades, pois neste caso compensará mais em termos de frete. E certamente vc encontrará lá no ML, anúncios de cidades de SC ou mesmo de Curitiba, o que implicará em custo de envio menor devido à sua proximidade geográfica.
Para o seu caso, eu recomendo usar o IRF540. Ele é muito comum e popular, e suas características elétricas atendem seu caso, pois seu “RDS ON” (“impedância ON”) é menor que 100 mili-Ohms. Com esse baixo “RDS ON”, a Potência dissipada pelo IRF540 a uma corrente de 3A, seria menor que 1W, dispensando o uso de um dissipador de calor.
Sobre o circuito, veja o exemplo mostrado na figura a seguir, que simulei no Proteus:
(clique na figura para “zoom”)
Observe as formas de onda no Osciloscópio virtual, principalmente a amplitude. Note que para o sinal que emula um PWM (na figura o sinal com nome “Pulse”), usei um gerador de pulsos, onde pode-se mudar o percentual % (portanto o duty cycle).
Veja que usei uma amplitude de 3.3V, para ficar conforme o ESP8266. Claro vc pode estar se perguntando: mas a amplitude não irá diminuir quando drenamos corrente? Sim, isso ocorre, porém no circuito mostrado o dreno de corrente da saída digital será muito baixo, e isso garante queda mínima na tensão correspondente ao Nível Lógico “1”.
Mas sobre este circuito, há outras características importantes que vc precisa estar a par. Seguem elas enumeradas:
1) veja que usei um BC337 como “driver” intermediário entre a saída digital do ESP8266 (o sinal “Pulse” no circuito), e o Gate do MOSFET. Isto é necessário para garantir sem falhas, que o MOSFET será acionado (explico logo adiante). Veja a figura a seguir onde marquei em verde claro o pior caso da tensão VGS do IRF540:
(clique na figura para “zoom”)
Veja que no pior caso, temos VGS = 4V. Isto significa que no pior caso, se a tensão de controle (o VGS) estiver acima de 4V, o MOSFET será acionado (irá conduzir). Além disso, é preciso garantir que o MOSFET conduza “bem”, ou seja, tenha um “RDS ON” realmente baixo. Com este “driver” via BC337, o “VGS ON” será de 12V, garantindo uma ótima condução do IRF540.
Esta figura foi preparada a partir do datasheet do IRF540 do fabricante Vishay. Os dados da figura estão na página 2 do datasheet, na Tabela de nome “SPECIFICATIONS”. O datasheet é este aqui: "IRF540_Vishay.pdf"
Atenção: não vá interpretar errado os valores mínimo e máximo mostrados na figura anterior para o VGS do IRF540. Eles se referem ao VGS(th) ou VGS de Threshold (ou VGS “limiar”). Quem não é especialista, vai achar que são valores limitantes para o VGS, mas esta interpretação está totalmente incorreta. Estes limites mínimo e máximo, se referem à produção (fabricação) do componente eletrônico, ou seja, se referem à estatística de fabricação. Assim, para os IRF540 produzidos e testados em fábrica, o pior caso medido para a tensão VGS(th), será 4V, o que significa que no pior caso, é preciso aplicar pelo menos 4V para o IRF540 conduzir. Obseve que no melhor caso estatístico, VGS(th) será de 2V, mas se vc considerar esse valor em um Projeto, pode dar “azar” e adquirir um componente que tem o VGS(th) mais próximo a 4V, e aí claro vai dar zica.
Sobre o valor “extremo” do VGS, vc encontra isso na primeira página do datasheet, na Tabela “ABSOLUTE MAXIMUM RATINGS”. Este valor é de 20V, e não deve ser alcançado. Aliás, se qualquer valor dessa Tabela for alcançado, o Fabricante não mais garante que o componente terá o desempenho especificado no restante do datasheet. Note que para o VDS, o valor extremo é 100V.
Pelas informações acima, vc pode concluir que se usar a saída digital do ESP8266 @3.3V diretamente no Gate do IRF540 (ou seja, sem o driver intermediário com BC337), vc não terá como sempre garantir o acionamento do MOSFET, caso o VGS(th) de algum IRF540 que vc venha a adquirir seja acima de 3.3V.
2) note que o Diodo em paralelo com o Motor (ou “anti-paralelo” como alguns preferem dizer), é um 1N4937. Este é um Diodo de comutação rápida. Não use diodos como 1N4007, ou da série 1N400x, pois estes são diodos “lentos”, que são ótimos para a rede de 60Hz, mas que são inadequados para circuitos de alta-frequência ou onde a comutação deve ser rápida. O papel desse diodo é absorver a energia eletromotriz gerada pelo Motor quando o MOSFET corta a corrente. Assim que essa corrente é interrompida, durante um curto instante de tempo, um spike de alta tensão será produzido nos terminais do Motor, e com polaridade contrária à tensão de 12V aplicada antes do corte. Como essa tensão gerada sobe muito rápido (em alguns micro-segundos ou até menos), é importante que o Diodo em paralelo, “perceba” rapidamente o surgimento dessa tensão, e absorva sua energia associada. E depois quando o MOSFET conduzir novamente, o Diodo ficará reversamente polarizado, e por ser rápido ele cortará também rapidamente, permitindo o acionamento do Motor.
Não precisa ser o 1N4937. Pode ser qualquer outro Diodo rápido que tolere altas tensões reversas (ou seja, diodos como 1N4148 não servem neste caso, embora sejam rápidos). A tensão reversa repetitiva para o 1N4937 é de 600V (lembrando que ao se colocar dois diodos em série, e com a polaridade correta, essa tensão dobrará).
3) observe que vc não deve aplicar ao Motor, um sinal PWM com qualquer frequência. A frequência que será efetiva, dependerá da Potência do Motor, ou seja, dependerá da Indutância que este Motor apresenta ao circuito. Motores mais potentes, terão maior indutância, e a frequência adequada do PWM diminui com o aumento dessa indutância. Maior indutância, menor frequência para o PWM.
Isso ocorre, porque ao usar o PWM no Motor, vc também estará chaveando uma indutância. Assim, conforme se aumenta a frequência do PWM, chegará a um ponto que o chaveamento não é mais eficiente, pois a inércia de energia do Motor girando não consegue acompanhar o liga/desliga do PWM. Assim é preciso usar uma frequência que permita aos enrolamentos do Motor “perceber” de forma clara que a corrente foi cortada, e sentir o efeito disso.
Este é um aspecto muito prático, pois além de depender da Potência do Motor, depende também da carga que está sendo acionada pelo eixo do Motor. Mas em geral, dificilmente vc precisará de mais que algumas centenas de Hz para o PWM. O ideal é começar com uma frequência intermediária, como por exemplo 500Hz, e então aumentar e diminuir a partir desse valor, observando se o controle PWM se comporta “suave”, ou se não responde mais. Claro, nesta avaliação, é preciso também variar o percentual do PWM, de 0% a 100%, para cada frequência avaliada, observando a resposta do Motor.
4) atenção: o driver com BC337, inverte o sinal PWM (vc pode conferir isso nos sinais mostrados no Osciloscópio virtual na primeira figura). Assim por exemplo para obter um PWM de 80%, vc deve programar o percentual PWM na saída digital do ESP8266, para 20% (ou seja, 100% - 80% = 20%). Para isso vc pode criar uma função muito simples que faz este cálculo e também já programa o PWM com este resultado. Se tiver alguma dificuldade com isso, avise aqui que coloco um exemplo conforme o caso ser com valores percentuais (0 a 100%) ou com valores absolutos (0 a 255 na resolução padrão do Arduino).
Caso use o Proteus e queira fazer algumas análises, segue o circuito que usei para simulação: "Motor_IRF540_Proteus.zip"
Observe no entanto, que o Motor que usei na simulação, é um dos que estavam disponíveis no Proteus. Mas vc pode ajustar os parâmetros do mesmo (como a indutância vista e a carga mecânica no eixo). Lembre-se também que a simulação “ocorre” num “tempo virtual” que sempre será mais lento que o “tempo real”.
Espero ter ajudado.
Abrçs,
Elcids…
Adicionado por Elcids Chagas ao 22:50 em 5 setembro 2020
exemplo, uso do Decoder 4511), e por este motivo a implementação é bastante completa permitindo que seja desenvolvida na direção que vc ou outros desejem. Esta também é uma ótima oportunidade para mostrar a implementação de coisas que podem até parecer complexas a princípio, mas que são na realidade bem simples. Para isto, o Hardware é descrito em detalhes, e o código está totalmente organizado (de forma hierárquica) e comentado funcionalmente (o que é indispensável para se entender sem esforço, como ele funciona). Mesmo assim irei descrever aqui, alguns pontos principais para aqueles que não querem se aprofundar e desejam apenas utilizar os recursos. Aconselho a quem for utilizar, ler integralmente o texto aqui publicado.
Implementei também uma Simulação no Proteus, a qual permite testar o funcionamento do Sistema e também medir alguns parâmetros importantes. Sobre a Simulação, alguns aspectos são apresentados mais adiante.
O código implementado e os arquivos para a Simulação, estão disponíveis para download no final deste post (há também um vídeo mostrando a execução da simulação).
Sobre o Circuito
A implementação do Hardware usa o Arduino UNO, o Decoder CMOS de 7 segmentos 4511 (mais "corretamente" o 4511B), e três Displays de 7 segmentos de Katodo Comum (já que o 4511 permite acionar diretamente esse tipo de Display). Há também os três Botões usados para inserção da Senha, e dois LEDs que indicam se a Senha inserida está correta ou não. Os demais componentes são Resistores e Transistores. O circuito implementado pode ser visto na figura a seguir:
(clique na figura para "zoom")
Vamos falar um pouco então sobre os elementos usados neste Hardware:
1) Arduino: está sendo usado o UNO (uma vez que foi este o Arduino informado no tópico em questão), e isto facilita muito "traduzir" este Sistema para outros Arduinos. Conforme pode ser visto na figura anterior, são usados 4 pinos para especificar um valor de 0 a 9 para o Decoder 4511, sendo estes pinos o 4, 5, 6, e 7, conectados respectivamente aos bits "A" (ou bit "0"), "B" (ou bit "1"), "C" (ou bit "2"), e "D" (ou bit "3") do 4511. Mas poderiam ser usados quaisquer pinos de saída Digital do Arduino e em qualquer ordem desejada, pois o código implementado permite isso.
Para o controle ON/OFF de cada Display, foram usados os pinos "A1", "A2", e "A3" do UNO. Aqui também, quaisquer pinos podem ser usados e em qualquer ordem.
Para leitura dos estados dos três Botões e controle dos dois LEDs, outros 5 pinos são usados, e novamente podem ser especificados quaisquer outros pinos.
Assim ainda restam disponíveis 8 pinos do Arduino UNO. Observar que os pinos restantes permitem que se use algumas funções especiais, como pelo menos uma entrada do ADC (pino A0), Interface I2C (pinos A4 e A5), Interrupções Externas (pinos 2 e 3, mas há também as Interrupções do tipo "pin change" para outros pinos), PWM (pino 3), além da conexão ao Terminal do Arduino via Serial 0 (pinos 0 e 1). Claro, todos os 8 pinos também podem ser usados para I/O convencional. Então quando vc escolher qualquer outra combinação de pinos para o Sistema, analise antes qual é a que melhor se encaixa para suas necessidades.
2) Decoder 7 segmentos e Displays: está sendo utilizado o 4511. Este Decoder embora seja CMOS, possui internamente em cada uma de suas 7 saídas para os LEDs de segmentos, um Driver com Transistor Bipolar para fornecer a corrente para os respectivos LEDs (claro, via Resistor externo para limitar e determinar a corrente de saída). É um Decoder para Displays de Katodo Comum. As entradas "LT" (Light Test), e "BI" (Blanking Input), são ativas em "0" e como não estão sendo usadas, são ligadas a "1" (os 5V da alimentação). A entrada "LE" (Latch Enable) deve ser ligada ao "0" (GND do circuito), para que o Latch interno do 4511 fique "transparente", ou seja desabilitado, para que as saídas de 7 segmentos sempre estejam reproduzindo o valor binário presente nas entradas A, B, C, e D.
Os Resistores conectados às saídas QA a QG do 4511, determinam a corrente para cada segmento. Para os valores no circuito, 330 Ω, a corrente será algo próximo a 10mA. Para este cálculo, desconte de 5V, a tensão sobre um LED de segmento, e então terá a tensão sobre o Resistor. No caso, vamos considerar que o LED do Display tem uma tensão Anodo/Katodo de 1.5V quando ligado. Então sobre o Resistor teremos 5V - 1.5V = 3.5V (aqui estamos "desprezando" a queda no Transistor Bipolar interno do 4511). Então a corrente será 3.5V / 330 Ω ≈ 10.6 mA. Da mesma forma, pode-se também calcular o Resistor, especificando-se a corrente desejada, mas evite passar de 20mA, a fim de limitar o total de corrente fornecido pelo 4511 (veja o datasheet do mesmo para mais detalhes). Caso correntes bem maiores sejam desejadas, pode-se usar Transistores adicionais (tipo NPN) nos pinos de segmentos.
Observar que estamos considerando que os Transistores Q1 a Q3 estão funcionalmente saturados quando acionados pelas saídas do Arduino. Isto é fácil de garantir, supondo-se um HFE médio (por exemplo 100) e escolhendo-se uma corrente de base em torno de 1 mA. Caso alguém queira saber sobre estes cálculos, pergunte aqui neste mesmo tópico, ou me contate via email do LDG.
Nota Importante: é possível dispensar Q1 a Q3 e R11 a R13. Para isso basta que se ligue as saídas do Arduino (no caso pinos A1, A2, e A3), diretamente aos Katodos dos Displays. Nenhuma alteração no código é necessária, uma vez que os Transistores usados são do tipo PNP, o que significa que o código aciona estes por Lógica "LOW" (isto foi feito propositalmente). Notar porém, que o uso dos Transistores traz uma maior flexibilidade na escolha das correntes dos segmentos dos Displays, já que a corrente confiável para uma saída do Arduino é de 20mA, e NÃO 40mA como muitos adoram proclamar!!! Vejam: 40mA é para os "limites máximos absolutos" e não preciso dizer mais nada. Mas há um ponto que ajuda muito aqui: os Displays são acionados de forma multiplexada, e sempre há apenas um único Display acionado de cada vez. Isso significa que a corrente média total de um Display será 1/3 (um terço, já que são três Displays) da corrente determinada pelos Resistores dos segmentos. Como temos 7 segmentos, se a corrente individual é de 10 mA, então a corrente total seria 7 x 10mA = 70mA quando todos os segmentos estiverem ligados (reproduzindo o número "8"), mas a corrente efetiva seria 1/3 disso, ou seja: 70mA / 3 = 23mA. Claro, isso é ligeiramente acima da corrente "segura" para um pino do UNO, mas considerando-se que dificilmente todos os segmentos estarão ligados nos três Displays, então esse limite marginal pode ser desconsiderado. Mas de todo caso, o uso dos Transistores Q1 a Q3 é mais sensato, garantindo inclusive que não se extrapole a máxima corrente de todos os pinos somados do processador do UNO (o AtMega328).
3) Botões: para estes, estão sendo utilizados os Pullups internos do Processador do UNO, o que dispensou o uso de Resistores externos. A Lógica implementada no código faz o "debouncing" dos Botões automaticamente (e sem travar a execução do código). Isso permite dispensar Capacitores externos para o "debouncing" (e eventuais Diodos de Proteção, necessários se os Capacitores tivessem valores relativamente altos).
Sobre a Varredura dos Displays e dos Botões
Como pode ser visto na figura inicial que mostra o circuito do Sistema, os Displays são acionados por meio da varredura dos mesmos, ou seja, a exibição dos valores em cada um dos três Displays, é feita de forma multiplexada. Logo, somente um Display está efetivamente "ligado" num determinado momento. A frequência de varredura (ou taxa de "Refresh"), foi escolhida como sendo 50 Hz. Vamos entender os motivos disso. Primeiro, deve ser uma frequência que não permita a retina do olho humano acompanhar o liga/desliga dos Displays, dando a impressão que todos os três Displays estão sempre ligados, e portanto quanto maior esta frequência, melhor. E para que as demais funcionalidades do código sejam executadas sem haver preocupação em manter a taxa de varredura do Display, essa varredura é executada em uma rotina de Interrupção (ISR), e para gerar essa Interrupção em uma taxa constante, é utilizado o "TIMER1" do Hardware do Processador do Arduino. Assim na inicialização do Sistema, o código programa o "TIMER1" para gerar a taxa de varredura dos Displays. A cada interrupção, é feita a varredura de um único Display. Logo, para varrer os três Displays a 50 Hz, é necessário uma taxa de Interrupção de 3 x 50Hz = 150 Hz. Os detalhes do código que fazem essa varredura são mostrados mais adiante. Observar que a ISR (rotina de Interrupção) deve ser eficiente, para garantir que as demais funcionalidades do Sistema sejam executadas de forma "fluida", ou seja, sem parecer que as Interrupções estão ocorrendo 150 vezes por segundo.
No código implementado, a varredura dos Displays de fato é muito eficiente, e consome efetivamente pouco tempo. Por este motivo, para tornar o Sistema também "despreocupado" com a leitura e gerenciamento dos Botões, essa tarefa também é executada na mesma rotina de Interrupção do "TIMER1". Essencialmente, ali é feita a leitura dos estados dos Botões e conforme estes estados, é determinado se um Botão foi acionado, desacionado, ou se está pressionado por um determinado tempo. O código implementa isso de forma enxuta, longe de sacrificar tempo de processamento do restante do Sistema.
Se forem acrescentados ao Sistema dispositivos "One Wire" (ex.: Sensor DS18B20) ou semelhante (ex.: DHT11 ou DHT22), alguns cuidados devem ser tomados para se garantir os tempos de "slot" para estes dispositivos. Mas é algo perfeitamente factível, e posteriormente posso mostrar como fazer isso (há pelo menos três formas de implementação).
Para dispositivos I2C, nenhum cuidado especial é necessário, uma vez que estes também são cadenciados por IRQ (Interrupt Request) e não há um momento específico para que estas IRQs sejam atendidas.
Quaisquer dúvidas relacionadas, posso responder aqui mesmo neste tópico.
Sobre o Código e Funcionamento do Sistema
A Senha do Sistema é definida no início do código, conforme mostrado na figura a seguir:
(clique na figura para "zoom")
Há no Sistema dois LEDs, um Verde (ou LED "OK") e um Amarelo (ou LED "ERRO"). O LED Verde é utilizado para sinalizar quando a Senha correta é inserida, e o Amarelo indica quando a Senha inserida está incorreta. A definição no código para a configuração de Hardware dos LEDs, pode ser vista na figura a seguir:
(clique na figura para "zoom")
Três Botões controlam a operação do Sistema. O Botão "1" decrementa o valor exibido no Display atualmente selecionado. O Botão "2" incrementa o valor exibido. Já o Botão "3" tem várias funções, sendo a mais comum, selecionar o próximo Display para entrada da Senha.
O funcionamento do código é bastante simples: enquanto no "background" a varredura dos Displays e dos Botões é executada quando as Interrupções do TIMER1 ocorrem (na taxa de 150 Hz), temos que no "foreground" (ou execução "normal") o código decrementa ou incrementa o valor exibido no Display atualmente selecionado conforme acionamento dos Botões "1" ou "2". E quando o Botão "3" é acionado, então o código simplesmente seleciona o próximo Display.
Para cada um dos três Displays há uma variável do tipo "byte", que pode assumir valores de 0 a 9. São exatamente o valor dessas três variáveis que são exibidas pelo mecanismo de varredura do Display (no "background", ou seja, na rotina de Interrupção). E no início de tudo, as três variáveis estão zeradas, o que resulta em exibir "000" nos Displays. Há também um variável do tipo byte que indica qual Display está atualmente selecionado, e a mesma assume valores de 1 a 3. E no início, esta variável assume o valor "1", selecionando assim o Display "1" para a entrada de um Dígito da Senha (neste caso o Dígito das centenas). A figura a seguir mostra as três variáveis para os valores exibidos em cada Display, além da variável que indica qual Display está atualmente selecionado:
(clique na figura para "zoom")
Se um Display está no valor "0" e é decrementado, ele "recicla" para "9". E se um Display está no valor "9" e é incrementado, ele recicla para "0". Então o que o código tem que fazer é verificar quando cada Botão é acionado e aplicar as ações descritas.
Mas quando o Display "3" está selecionado e o Botão "3" é acionado, isso deve ser interpretado como "fim da entrada de Senha", e o Sistema então deve verificar se a Senha mostrada nos Displays, corresponde à Senha do Sistema.
Se a Senha que foi "inserida" via Displays estiver correta, então o LED Verde (LD1 no circuito) acende. Mas se a Senha estiver incorreta, então o LED Amarelo (LD2) acende.
Após a verificação da Senha, o Sistema fica aguardando que o Botão "3" seja novamente acionado, para reiniciar uma nova entrada de Senha. Neste ponto, os dois LEDs apagam, sendo selecionado o Display "1" para entrada de um Dígito da Senha, e os Displays exibem "000", e portanto o Sistema volta ao "início".
A forma mais simples e confiável de implementar esse sequenciamento do código, é através de uma Máquina de Estados, que é mostrada mais a frente neste post. Apenas 3 estados foram necessários para implementar todo o processamento.
Há no código um bloco que trata de todo o gerenciamento de leitura dos Botões, e que é executado no "background", ou seja, na rotina de Interrupção do TIMER1 (onde também é feita a varredura dos Displays). Como dito anteriormente, este bloco de código verifica se um Botão foi acionado ou desacionado, e também "mede" o tempo que um Botão está acionado. Estas informações estão disponíveis para serem usadas no "foreground" do código permitindo assim que este tome as ações conforme os estados dos Botões. Mas para que isto seja possível, é necessário que os Botões sejam definidos no Sistema. Esta definição é simples e consiste de duas etapas. A primeira é a definição dos pinos de Hardware onde os Botões estão conectados, conforme mostrado na figura a seguir:
(clique na figura para "zoom")
A segunda etapa é a criação de estruturas de dados para armazenar os status dos Botões, e de funções que configuram estes Botões e atualizam os status dos mesmos. Isto pode ser visto na figura a seguir:
(clique na figura para "zoom")
Caso fossem incluídos mais Botões no Sistema, bastaria se estender a mesma ideia mostrada na figura, acrescentando as definições para estes Botões juntamente aos já existentes.
Notar que a função "atualiza_Status_Botoes" será executada no "background", ou seja, na rotina de Interrupção do TIMER1. Ela está incluída na figura anterior para se mostrar como é simples a definição completa para uso de um Botão no Sistema. Esta função será especificada como a que justamente atualiza os status dos Botões, através de um "HOOK" na rotina de Interrupção (mostrado mais adiante quando a ISR for apresentada).
Em relação ao Decoder 4511, são necessários 4 pinos do Arduino para se especificar qual valor será exibido em um determinado momento. A definição destes pinos é mostrada na figura a seguir:
(clique na figura para "zoom")
Como já dito, quaisquer pinos podem ser especificados, e em qualquer ordem, pois o código se encarrega de setar cada um deles para reproduzir o valor binário para o Decoder 4511.
Para o controle ON/OFF dos três Displays, 3 pinos devem ser especificados para este controle. Novamente, quaisquer pinos podem ser especificados, e em qualquer ordem. No código, esta definição pode ser visto na figura a seguir:
(clique na figura para "zoom")
A figura a seguir, mostra a captura da tela da Simulação do Sistema no Proteus, em um momento que o Display "1" está sendo varrido, e por isso apenas o mesmo aparece "ligado" na figura exibindo o valor "3":
(clique na figura para "zoom")
Como a taxa de varredura total é de 150Hz (ou seja, 3x 50Hz), então o período de varredura é de 6.67ms (ou seja, 1 / 150Hz). Logo a cada 6.67ms o próximo Display é ligado, sendo setado em binário nos pinos A..D do 4511, o valor a ser exibido naquele Display. Ou seja, cada Display fica "ligado" justamente por 6.67ms, e fica desligado por 13.33ms, o que resulta em um ciclo de 20ms, implicando na Frequência individual de 50Hz para cada Display.
Obs.: a captura da figura anterior foi facilitada pelo fato de que a Simulação executa em um tempo "virtual", completamente independente do tempo real, e o Simulador aumenta ou diminui o step de tempo conforme detalhes da Simulação são executados. Por isso mesmo, quando se executa a simulação, é possível acompanhar partes do processo de varredura, o que causa um efeito que pode parecer "estranho", já que nunca vemos todos os três Displays ligados ao mesmo tempo. Eu disse "partes do processo de varredura", porque enquanto a simulação evolui, o próprio Simulador faz capturas do status desta simulação, para então "printar" estes status na tela do Simulador (aqueles pontinhos vermelhos e azuis que vemos nos prints), e essa taxa de captura não tem nenhuma relação com o conteúdo da simulação, o que resulta em um efeito sub-amostrado (é o mesmo efeito que uma luz stroboscópica existente em pistas de dança das danceterias provoca em nossa retina, resultando em algo semelhante a um vídeo onde faltam cenas). Isto pode ser melhor visto no vídeo da simulação mostrado no final deste post (resulta em um "pisca/pisca" dos valores exibidos no Display, e claro isso é apenas na Simulação).
Como já dito, a taxa de varredura total deve ser 3 vezes a taxa desejada para um único Display. Assim como desejamos 50Hz para cada Display, a taxa total de varredura deve ser 150Hz, e isso é definido no código conforme mostrado na figura a seguir:
(clique na figura para "zoom")
Em uma das simulações, acrescentei um Frequencímetro para medir a frequência de varredura para cada um dos Displays, e o resultado pode ser visto na figura a seguir:
(clique na figura para "zoom")
Como pode ser visto na figura anterior, acrescentei também uma chave rotativa (no circuito é a SW1), que permite selecionar em qual dos Displays estaremos medindo a taxa de varredura. Para todos foi medido 50Hz, como seria de se esperar.
(devido à limitação de espaço este post continua logo a seguir: Link)
…
Adicionado por Elcids Chagas ao 13:49 em 15 julho 2021