Transistor como chave projetado com Algoritmo Genético
Acessado 2212 vezes.Como citar esse artigo: VERTULO, Rodrigo Cesar. Transistor como chave projetado com Algoritmo Genético. Disponível em: <http://labdeeletronica.com.br/noticias/transistor-como-chave-projetado-com-algoritmo-genetico/>. Acessado em: 20/03/2025.
No artigo anterior vimos como um algoritmo genético pode ser utilizado para auxiliar no projeto de circuitos eletrônicos. Na ocasião foi utilizado como exemplo um circuito resistivo simples e o algoritmo, mesmo sem que ele conhecesse as leis da eletrônica relacionadas ao problema, foi capaz de determinar corretamente os valores dos componentes do circuito.
A conclusão daquele artigo foi que as técnicas de inteligência artificial, no caso os algoritmos genéticos, poderiam ser utilizadas no projeto de circuitos eletrônicos. Contudo, como o estudo de caso foi baseado em um circuito bastante simples mostra-se necessária a utilização dessa técnica em outros mais complexos e esse será o foco nesse momento.
Nesse estudo de caso, um algoritmo genético será utilizado para o projeto de um circuito clássico que utiliza um transistor como chave eletrônica. O objetivo será utilizar o mesmo algoritmo do artigo anterior realizando uma pequena adição de código para que ele seja capaz de determinar o valor de dois resistores e não apenas um como foi feito anteriormente. É importante frisar que isso não altera a essência do algoritmo e que o ‘coração’ dele basicamente continua sendo o mesmo. Em outras palavras, a função ‘fitness’ utilizada será exatamente igual, mostrando que o mesmo algoritmo pode ser utilizado para a resolução de diversos problemas distintos dentro do projeto de circuitos eletrônicos. Essa é uma das grandes vantagens da utilização dessa abordagem, pois uma vez criado o código capaz de inferir a forma de se resolver problemas em uma determinada área, ele se torna capaz de extrapolar seus procedimentos para resolver uma outra infinidade de problemas dentro da mesma área.
Também é interessante perceber que no artigo anterior foi criado um circuito cuja resolução utilizando-se o método analítico poderia ser feita com a aplicação simples da Lei de Ohm. No exemplo deste artigo a resolução analítica envolve muitos outros conceitos sobre o funcionamento de semicondutores, em especial a utilização de transistores BJT na configuração de emissor comum. Sem dúvida alguma é um circuito consideravelmente mais complexo que o anterior, contudo, o algoritmo utilizado é basicamente o mesmo. Isso indica que o algoritmo genético foi inteligente o suficiente para evoluir uma solução para o problema sem que esforço adicional de projeto fosse necessário, além de sua adaptação para contemplar a descoberta de dois componentes e não apenas um como no circuito anterior.
Os detalhes sobre a técnica utilizada, tais como ferramentas, linguagem de programação, etc. foram bem apresentados no artigo anterior e não serão novamente apresentados aqui. O foco é apresentar o resultado obtido na aplicação do algoritmo genético para a resolução de um circuito mais complexo como o mostrado a seguir.
Fig. 1 – Circuito com transistor como chave na configuração emissor comum.
No caso do circuito apresentado na Fig. 1, o objetivo do algoritmo genético será determinar os valores dos resistores Rc e Rb de modo que a corrente de coletor no transistor Q1 seja de 15mA. O algoritmo não faz a mínima ideia de como resolver esse problema pelo método analítico tradicional, tão pouco conhece as características de um transistor BC547B. Ele resolverá o problema por meio da realização de uma sucessão de simulações para evoluir seus cromossomos em direção à resposta do problema.
A seguir é mostrado o algoritmo utilizado. Note que é basicamente o mesmo apresentado no artigo anterior.
import ltspy3 import subprocess from PyGARV import * import matplotlib.pyplot as plt class TransistorChave(PyGARV): def __init__(self): super().__init__(popSize = 10, values = 40, mutationRate = 0.3, fullMutation = True, symmetricCut = False, crossoverRate = 1, elitism = 0.1, digits = 2) self.correnteDesejada = 0.015 self.correntes = [] self.nota = 0 def trocaResistencia(self, novoValorR1, novoValorR2): arq = open('transistor_chave_1.txt', 'r') dados = arq.readlines() arq.close() dados[9] = '.param Rc=' + str(novoValorR1) + ' Rb=' + str(novoValorR2) + '\n' arq = open('transistor_chave_1.txt', 'w') arq.writelines(dados) arq.close() def avaliaCircuito(self): subprocess.call('C:\Program Files\LTC\LTspiceXVII\XVIIx64.exe -b transistor_chave_1.txt') sd = ltspy3.SimData('transistor_chave_1.raw') dc_op = sd.values return dc_op def converteCromoToNumber(self, cromo): soma1 = 0 soma2 = 0 v1 = cromo[0:20] v2 = cromo[20:40] for i in range(len(v1)): if v1[i] == 1: soma1 = soma1 + (2**i) for i in range(len(v2)): if v2[i] == 1: soma2 = soma2 + (2**i) return [soma1, soma2] def fitness(self, cromossomo): self.convertToBin(cromossomo) valores = self.converteCromoToNumber(cromossomo) self.trocaResistencia(valores[0], valores[1]) ic = self.avaliaCircuito()[7] self.nota = 1 - ((self.correnteDesejada - ic)**2)**0.5 return [cromossomo, self.nota] def finishedGeneration(self, melhorCromossomo): valores = self.converteCromoToNumber(melhorCromossomo) self.trocaResistencia(valores[0], valores[1]) self.correntes.append(self.avaliaCircuito()[7]) print(melhorCromossomo, 'RC='+str(valores[0]) + ' Rb=' + str(valores[1]), self.avaliaCircuito()[7]) pygarv = TransistorChave() while pygarv.nota < 0.999: pygarv.runGA(1) plt.plot(pygarv.correntes) plt.show() |
Diferentemente da forma como foi definido no artigo anterior, o algoritmo genético agora não foi executado por um número pré determinado de gerações. Ao invés disso, ele continuou gerando novas populações de cromossomos até que o melhor apresentasse resultados superiores a 93.3% de precisão. Foram feitas três execuções do algoritmo e os resultados podem ser observados nos gráficos a seguir.
Fig 2 – Primeira execução do algoritmo genético. Rc = 128 Ohms, Rb = 82390 Ohms e Ic = 0.01400326 A
A primeira execução gerou um valor de corrente de coletor (Ic) de aproximadamente 14 mA, ou seja, uma precisão de 93,3% com o valor de Rc igual a 128 Ohms e Rb igual a aproximadamente 82.4 kOhms. Para chegar a esse resultado, o algoritmo foi executado por pouco mais de 250 gerações.
Fig 3 – Segunda execução do algoritmo genético. Rc = 157 Ohms, Rb = 73003 Ohms e Ic = 0.01546618 A
Em sua segunda execução o valor de Ic foi de aproximadamente 15.4 mA atingindo 99,97% de precisão com Rc igual a 157 Ohms e Rb equivalente a aproximadamente 73 kOhms. Nesta segunda execução o algoritmo genético precisou de pouco mais de 160 gerações para finalizar seu processamento.
Fig 4 – Terceira execução do algoritmo genético. Rc = 317 Ohms, Rb = 48076 Ohms e Ic = 0.01531965 A
Finalmente, em sua terceira execução o algoritmo conseguiu gerar uma corrente de coletor IC de aproximadamente 15.3 mA, ou seja, uma precisão de 99,98% com Rc igual a 317 Ohms e Rb com valor aproximado de 48 kOhms. A terceira execução foi a mais rápida com apenas 35 gerações aproximadamente.
Nota-se que apesar de em nenhuma das execuções o algoritmo ter obtido o valor para Ic de exatamente 15 mA, os resultados foram muito bons com precisão de até 99,98%. Considerando as tolerâncias típicas dos componentes eletrônicos é possível considerar que os valores para Rc e Rb obtidos pelo algoritmo, principalmente na segunda e terceira execução, foram praticamente perfeitos. É preciso não esquecer-se de que ele conseguiu isso sem conhecer a forma tradicional de se resolver o circuito como o apresentado no artigo e utilizando-se basicamente o mesmo código criado na resolução do circuito resistivo mais simples do artigo anterior.
Os resultados obtidos neste experimento apontam novamente a viabilidade em se utilizar algoritmos genéticos para o projeto de circuitos eletrônicos, mesmo em casos mais complexos.
Comentários