{"id":892,"date":"2020-12-11T21:51:25","date_gmt":"2020-12-11T20:51:25","guid":{"rendered":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/?p=892"},"modified":"2021-03-16T14:58:39","modified_gmt":"2021-03-16T13:58:39","slug":"preamplificatore-in-classe-a","status":"publish","type":"post","link":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/preamplificatore-in-classe-a\/","title":{"rendered":"Preamplificatore in Classe A"},"content":{"rendered":"\r\n<p><em><strong>Premessa: <\/strong>Un amplificatore in classe A \u00e8 un amplificatore che dissipa la stessa potenza a prescindere che vi sia applicato un segnale in ingresso oppure no. In protica un amplificatore in classe A da 5W consumer\u00e0 sempre 5 watt dal momento che viene alimentato anche se all\u2019ingresso non applicherete nessun segnale. Per questo motivo non si usa quasi mai negli amplificatori audio di potenza.<\/em><\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<p>Ogni volta che inizio ad imparare un nuovo linguaggio di programmazione sorge il problema di come mettere in pratica quello che ho imparato. O almeno una parte di questo.<\/p>\r\n\r\n\r\n\r\n<p>Avendo una fantasia che si spegne quando serve, risolvo &#8216;brillantemente&#8217; applicando una parte di quanto studiato a scuola in epoca remota nelle ore di Elettronica e cio\u00e8:<\/p>\r\n\r\n\r\n\r\n<p class=\"has-vivid-cyan-blue-color has-text-color\">\u201c<em>BJT: progetto della rete di polarizzazione di un preamplificatore monostadio in bassa frequenza in classe A<\/em>\u201d.<\/p>\r\n\r\n\r\n\r\n<p>Il progetto \u00e8 affrontato in maniera semplificata dato che il suo scopo \u00e8 quello di applicare i concetti della programmazione, gli statements, la sintassi e quant\u2019altro e possibilmente fissarli nella memoria.<\/p>\r\n\r\n\r\n\r\n<p>Il programma \u00e8 scritto in Python e non usa le classi cos\u00ec da essere di pi\u00f9 semplice comprensione per la maggioranza.<\/p>\r\n\r\n\r\n\r\n<p>Perch\u00e9 Python? Perch\u00e9 \u00e8 simile al Basic, che mi ha guidato negli anni \u201980 in un percorso da programmatore per approdare poi al Fortran. Non si compila e quindi \u00e8 utile per cose veloci e poco impegnative che ci si pu\u00f2 trovare a dover svolgere a sostegno di altre pi\u00f9 complesse. Mi \u00e8 sembrato utile come un coltellino svizzero che ti aiuta a risolvere i problemi contingenti del momento.<\/p>\r\n\r\n\r\n\r\n<p>Oltre a ci\u00f2 ha usa meno segni di interpunzione e caratteri speciali. Possiamo visualizzare un esempio preso da Internet (magari anche un po&#8217; di parte) contrapponendolo al C++ che pure \u00e8 un ottimo linguaggio di programmazione:<\/p>\r\n\r\n\r\n\r\n<p>An <strong>example of C++ code<\/strong>:<\/p>\r\n\r\n\r\n\r\n<pre class=\"lang:python decode:true\">#include\r\n#include\r\nusing namespace std;\r\nint main() {\r\nstring name;\r\ncin &gt;&gt; name;\r\ncout &lt;&lt; \"Good evening, \" &lt;&lt; name &lt;&lt; endl;\r\nreturn 0;\r\n}<\/pre>\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p class=\"has-text-align-left\">And here is an <strong>example of Python code<\/strong>:<br \/><br \/><\/p>\r\n<pre class=\"lang:python decode:true\">name = input()\r\nprint(\"Good evening, \" + name)&lt;code&gt;&lt;\/code&gt;<\/pre>\r\n<p class=\"has-text-align-left\">\u00a0<\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Lo schema<\/h2>\r\n\r\n\r\n\r\n<p>Nello schema presentato possiamo vedere che sono presenti i due principali resistori di polarizzazione, Rb ed Rc pi\u00f9 il resistore di emettitore Re che ha funzione di stabilizzazione del punto di riposo per le variazioni del deltaVbe del transistor. Tale variazione \u00e8 funzione della temperatura. Questa variazione non \u00e8 l\u2019unica dato che pupossono variare anche l\u2019ICB0, ed il BETA. Oltre a questo bisognerebbe tenere anche conto della dispersione delle caratteristiche del semiconduttore, ma tutto questo va oltre l\u2019obiettivo del nostro esercizio di programmazione.<\/p>\r\n\r\n\r\n\r\n<p>In aggiunta abbiamo anche calcolato il valore dei condensatori di accoppiamento in ingresso ed in uscita oltre a quello di disaccoppiamento in alternata sulla resistenza di emettitore. E\u2019 sottinteso che si useranno transistor al silicio e non i vecchi ed obsoleti transistor al germanio e di tipo NPN.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"508\" class=\"wp-image-894\" src=\"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-content\/uploads\/2020\/12\/PreClasse_A-1024x508.jpg\" alt=\"\" srcset=\"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-content\/uploads\/2020\/12\/PreClasse_A-1024x508.jpg 1024w, http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-content\/uploads\/2020\/12\/PreClasse_A-300x149.jpg 300w, http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-content\/uploads\/2020\/12\/PreClasse_A-768x381.jpg 768w, http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-content\/uploads\/2020\/12\/PreClasse_A.bmp 1440w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">A cosa mi pu\u00f2 servire?<\/h2>\r\n\r\n\r\n\r\n<p>Pu\u00f2 essere utile a volte preamplificare un microfono, ad esempio per un robot che deve direzionarsi in base al suono. Se l&#8217;amplificazione di uno stadio non fosse sufficiente ad avere in uscita una ampiezza di segnale consona, se ne possono mettere in cascata due o pi\u00f9. Lo stesso circuito abbinato ad un multivibratore bistabile pu\u00f2 essere usato per spegnere ed accendere luci con il battito delle mani. E poi tante altre cose che la fantasia pu\u00f2 immaginare.<\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">I parametri di progetto<\/h2>\r\n\r\n\r\n\r\n<p>I parametri richiesti all\u2019avvio del programma sono in prima istanza, se si vuole applicare la resistenza di emettitore oppure no dato che questa serve solo per la stabilizzazione del punto di riposo. Poi chiede la frequenza minima da amplificare. E\u2019 bene non usare valori assurdi tipo 2 Hz perch\u00e9 questo comporterebbe condensatori di accoppiamento dal valore eccessivo e non \u00e8 detto che funzioni sempre.<\/p>\r\n\r\n\r\n\r\n<p>Tenete presente che questo circuito potrebbe arrivare ad amplificare anche frequenze molto alte, oltre 300 KHz. Quindi se volete potete mettere in ingresso o in uscita un filtro passa-basso di tipo RC per tagliare oltre i 20 KHz.<\/p>\r\n\r\n\r\n\r\n<p>Fatto questo verr\u00e0 chiesto a che tensione viene alimentato il circuito, il guadagno in tensione del transistor, la corrente di collettore richiesta e la Vce richiesta. Questi parametri si pod+ssono trovare sui datasheet del transistor usato.<\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Valori risultanti<\/h2>\r\n\r\n\r\n\r\n<p>Come risultati di uscita avremo banalmente i resistori di base, di collettore e di emettitore oltre ai condensatori di disaccoppiamento. Quelli in ingresso ed uscita servono (ma questo gi\u00e0 lo saprete) per evitare che eventuali tensioni indotte dai circuiti in ingresso ed uscita spostino il punto di riposo del nostro circuito lasciando passare solo la componente alternata del segnale. Il condensatore sulla Re serve per non far vedere questa al segnale in alternata (ne abbassa il valore ad un decimo).<\/p>\r\n\r\n\r\n\r\n<p>Vengono stampati anche altri valori intermedi, ma ci serviranno in una implementazione futura.<\/p>\r\n\r\n\r\n\r\n<p>Come si pu\u00f2 vedere dal primo RUN, tutti i valori dei componenti non sono normalizzati. Non hanno cio\u00e8 valori standard, quelli dovete deciderli voi scegliendo il valore standard pi\u00f9 vicino. Per i meno esperti consiglio di usare resistori al 2% o 1%. Gli altri potranno scegliere valori al 5%. Questo perch\u00e9 valori non scelti bene potrebbero cambiare troppo il punto di riposo del transistor BJT. In futuro si implementer\u00e0 anche questa funzione, magari usando delle classi.<\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Il Programma<\/h2>\r\n\r\n\r\n\r\n<p>Il programma \u00e8 semplice da capire. E\u2019 formato da tre funzioni principali richiamate dal main-program.<\/p>\r\n\r\n\r\n\r\n<p><strong>inputParameter()<\/strong> come dice il nome si occupa di chiedere i parametri di progetto e di normalizzarli prima dell&#8217;invio alla funzione:<\/p>\r\n\r\n\r\n\r\n<p><strong>calculateValues()<\/strong> che effettua tutti (e solo) i calcoli per determinare i valori dei componenti necessari a polarizzare il transistor e determinare i valori dei condensatori di disaccoppiamento. Nel caso non venga richiesta la presenza della <strong>Re <\/strong>non effettuer\u00e0 i calcoli non necessari.<\/p>\r\n\r\n\r\n\r\n<p><strong>printValues()<\/strong> infine stampa tutti i risultati ottenuti, finali ed intermedi. I valori vengono stampati in notazione anglosassone, quindi le virgole diventano punti ed i punti diventano virgole.<\/p>\r\n\r\n\r\n\r\n<p>Oltre a queste funzioni principali, sono presenti altre funzioni accessorie come <strong>resPower()<\/strong> e <strong>condVoltage()<\/strong> che scelgono la potenza di dissipazione dei resistori e la tensione di funzionamento dei condensatori elettrolitici.<\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Esecuzione del Programma<\/h2>\r\n\r\n\r\n\r\n<p>Aprire un programma di editig per script come Notepad++ (Windows) o Gedit (Linux) e incollarci dentro il programma presente alla fine di questo articolo. Salvarlo col nome PreClasse_A.py nella directory preferita.<\/p>\r\n\r\n\r\n\r\n<p>Per mandare in esecuzione il programma sotto Linux basta andare nella directory dove \u00e8 il nostro programma e digitare:<\/p>\r\n\r\n\r\n\r\n<p>[greybear@localhost ~]$01<strong> python PreClasse_A.py<\/strong><\/p>\r\n\r\n\r\n\r\n<p>Mentre sotto Windows bisogner\u00e0 installare prima Python3 ricordandosi di far aggiornare in automatico il PATH con i percorsi di python. Poi si andr\u00e0 nella cartella del nostro programma e si digiter\u00e0:<\/p>\r\n\r\n\r\n\r\n<p><strong>C:\\dir\\&#8230;\\dir\\python.exe PreClasse_A.py<\/strong><\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Listato in Python<\/h2>\r\n<pre># Calcolo per la polarizzazione statica di un preamplificatore monostadio BF a BJT<br \/># greybear (@officinecibernetiche.net) 16\/03\/2021 Rev. 1.1<br \/><br \/>''' Calcolo delle resistenze di polarizzazione di un amplificatore<br \/>monostadio in bassa frequenza a BJT. Vengono richiesti i seguenti<br \/>parametri: <br \/>Tensione di alimentazione,<br \/>corrente di collettore (Ic),<br \/>guadagno statico (hfe) <br \/>e tensione collettore-emettitore (Vce).<br \/>Dati questi parametri verranno calcolate le resistenze di<br \/>polarizzazione di base (Rb), di collettore (Rc) e su richiesta<br \/>anche la resistenza di emettitore (Re) con relativo condensatore<br \/>di disaccoppiamento. Si suppone che il BJT sia al silicio e di<br \/>tipo NPN, quindi con negativo a massa.<br \/>I valori risultanti sono stampati secondo la notazione angloassone. '''<br \/><br \/>import math<br \/><br \/>def inputParameter():<br \/>    ''' Inserendo i parametri di progetto si avr\u00e0 in uscita il valore delle<br \/>    resistenze di polarizzazione. Verranno calcolati anche i condensatori di<br \/>    accoppiamento in ingresso ed in uscita in funzione della frequenza minima<br \/>    del segnale audio da amplificare.<br \/>    '''<br \/>    i = 0<br \/>    Vce = 100<br \/>    Vcesat = 0.5<br \/><br \/>    # ingresso dati di progetto<br \/>    print('\\n======================================')<br \/>    print ('Parametri di progetto:')<br \/>    print('---------------------------------------')<br \/>    Vcc = float(input('Vcc (1-50V) = '))<br \/>    hfe = int(input('hfe = '))<br \/>    Ic = float(input('Ic (mA) = '))<br \/><br \/>    while Vce &gt;= (Vcc - Vcesat):<br \/>        #if (Vce &gt;= Vcc) and i == 1:<br \/>        print('Vce deve sufficientemente inferiore a Vcc-Vcesat')<br \/>        Vce = float(input('Vce (V) = '))<br \/>            #i = 1<br \/><br \/>    # normalizazione parametri di progetto<br \/>    Vcc = float(Vcc)<br \/>    hfe = int(hfe)<br \/>    Ic = float(Ic) * pow(10, -3)<br \/>    Vce = int(Vce)<br \/>    return Vcc, hfe, Ic, Vce<br \/><br \/><br \/>def resPower(RmW):<br \/>    ''' Calcola la dissipazione della resistenza con parametro di sicurezza pari a 1.5 '''<br \/>    valSic = 1.5<br \/>    W = ''<br \/>    if (RmW * valSic) &lt; 250:<br \/>        W = '1\/4 W'<br \/>    elif (RmW * valSic) &lt; 500:<br \/>        W = '1\/2 W'<br \/>    elif (RmW * valSic) &lt; 1000:<br \/>        W = '1 W'<br \/>    elif (RmW * valSic) &lt; 2000:<br \/>        W = '2 W'<br \/>    elif (RmW * valSic) &lt; 5000:<br \/>        W = '5 W'<br \/>    else:<br \/>        W = 'maggiore di 5 W'<br \/>    return W<br \/><br \/><br \/>def condVoltage(Vcc):<br \/>    ''' Calcola la tensione di lavoro degli elettrolitici '''<br \/>    if Vcc &lt; 6.0:<br \/>        vCe = '6 V'<br \/>    elif Vcc &lt; 12.0:<br \/>        vCe = '12 V'<br \/>    elif Vcc &lt; 25.0:<br \/>        vCe = '25 V'<br \/>    elif Vcc &lt; 50.0:<br \/>        vCe = '50 V'<br \/>    elif Vcc &lt; 100.0:<br \/>        vCe = '100 V'<br \/>    else:<br \/>        vCe = 'maggiore di 100 V'<br \/>    return vCe<br \/><br \/><br \/>def calculateValues(Vcc, Vce, Vbe, hfe, Re, Ic, RE, lowFt):<br \/>    # calcolo resistenze di polarizzazione statica<br \/>    Ce = 0<br \/>    vCe = 0<br \/>    deltaVbe = 0.22 # per ora la fissiamo arbitrariamente<br \/><br \/>    Ib = Ic \/ hfe<br \/>    if RE.lower() == 'si':<br \/>        # Re per variazione termica del Vbe<br \/>        Re = 15 * deltaVbe \/ (Ic + Ib) # 10_20*DeltaVbe\/Ic+Ib<br \/>        reattCe = Re \/ 10<br \/>        Ce = 1 \/ (2 * math.pi * lowFt * reattCe)<br \/><br \/>    vCe = condVoltage(Vcc)<br \/>    Rc = (Vcc - Vce - Re * Ic) \/ Ic<br \/>    Rb = (Vcc - Vbe) \/ Ib<br \/>    print('Vbe (V) =', Vbe)<br \/><br \/>    if Re == 0:<br \/>        RR = 'not available'<br \/>        We = 0<br \/>    else:<br \/>        RR = int(Rb \/ Re)<br \/>        RemW = Re * pow((Ic + Ib), 2) * pow(10, 3)<br \/>        We = resPower(RemW)<br \/><br \/>    RbmW = Rb * pow(Ib,2) * pow(10,3)<br \/>    RcmW = Rc * pow(Ic,2) * pow(10,3)<br \/>    Wb = resPower(RbmW)<br \/>    Wc = resPower(RcmW)<br \/><br \/>    Rx = (hfe + 1) * (26 * pow(10, -3) \/ (Ic + Ib))<br \/>    Ry = Rb<br \/>    rIngresso = Rx * Ry \/ (Rx + Ry)<br \/>    Cinput = 1 \/ (2 * math.pi * rIngresso * lowFt)<br \/>    return Ib, Rb, Rc, Re, Ce, vCe, RR, Wb, Wc, We, Cinput<br \/><br \/><br \/>def printValues(Ib, Rb, Rc, Re, vCe, RR, Wb, Wc, We, Cinput):<br \/>    # stampa risultati di calcolo<br \/>    print('\\n======================================')<br \/>    print('Parametri intermedi:')<br \/>    print('---------------------------------------')<br \/>    print('Ib =', '{:.3f}'.format(Ib * pow(10, 3)), 'mA')<br \/>    print('Rb\/Re =', RR)<br \/>    print('\\n======================================')<br \/>    print('Valore componenti per la polarizzazione')<br \/>    print('---------------------------------------')<br \/>    print('Rc =', '{:,}'.format(int(Rc)), 'ohm', Wc)<br \/>    if Rc &lt; 0:<br \/>        print('Alcuni parametri di progetto sono incoerenti (Es. Vce, Re)')<br \/>        quit()<br \/><br \/>    print('Rb =', '{:,}'.format(int(Rb)), 'ohm', Wb)<br \/>    if Re != 0 or Ce != 0:<br \/>        print('Re =', '{:,}'.format(int(Re)), 'ohm', We)<br \/>        print('Ce =', round(Ce * pow(10, 6)), 'uF', vCe)<br \/><br \/>    print('C in\/out =', round(Cinput * pow(10, 6)), 'uF', vCe)<br \/><br \/><br \/># MAIN PROGRAM<br \/>if __name__ == '__main__': # execute only as standalone, not as imported module<br \/>    print(inputParameter.__doc__)<br \/>    # parametri fissi<br \/>    Vbe = 0.6<br \/>    Re = 0<br \/>    RE = input(\"E' presente la R sull'emettitore? si\/no \")<br \/>    RE = RE.strip()<br \/>    lowFt = int(input('Frequenza di taglio inferiore? (20-1000 Hz) '))<br \/><br \/>    Vcc, hfe, Ic, Vce = inputParameter()<br \/>    Ib, Rb, Rc, Re, Ce, vCe, RR, Wb, Wc, We, Cinput = calculateValues(Vcc, Vce, Vbe, hfe, Re, Ic, RE, lowFt)<br \/>    printValues(Ib, Rb, Rc, Re, vCe, RR, Wb, Wc, We, Cinput)<\/pre>\r\n<p>&nbsp;<\/p>\r\n<p>&nbsp;<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Premessa: Un amplificatore in classe A \u00e8 un amplificatore che dissipa la stessa potenza a prescindere che vi sia applicato un segnale in ingresso oppure no. In protica un amplificatore in classe A da 5W consumer\u00e0 sempre 5 watt dal momento che viene alimentato anche se all\u2019ingresso non applicherete nessun&#8230;<\/p>\n","protected":false},"author":1,"featured_media":964,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61,60,18],"tags":[],"_links":{"self":[{"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/posts\/892"}],"collection":[{"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/comments?post=892"}],"version-history":[{"count":22,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/posts\/892\/revisions"}],"predecessor-version":[{"id":961,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/posts\/892\/revisions\/961"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/media\/964"}],"wp:attachment":[{"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/media?parent=892"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/categories?post=892"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.officinecibernetiche.net\/ocnet\/wordpress\/wp-json\/wp\/v2\/tags?post=892"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}