Transistor como chave projetado com Algoritmo Genético

Acessado 801 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: 19/09/2021.


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

error: Conteúdo Protegido!