Operacioni pojačavači

Autor zadatka: Relja Mihić <relja.mihic@gmail.com>

Operacioni pojačavači su elektronske komponente koje pojačavaju razliku 2 signala. Rezultat mora biti manji od napona napajanja ove komponente. Zbog nesavršenosti ove komponente u praksi se javlja napon ofseta, koji eliminišemo dodavanjem potenciometra. Pojačavači koji nemaju napon ofseta nazivaju se "Auto-Zero".

Napisati program koji pronalazi odgovarajuće pojačavače za unete naponske signale. Podaci o pojačavačima su zadati u ulaznoj datoteci u sledećem formatu:

  • naziv (jedna reč, do 10 karaktera)

  • pojacanje (celobrojna vrednost, u V/V)

  • napajanje (celobrojna vrednost, u V)

  • ofset (celobrojna vrednost, u V)

Učitati pojačavače u statički niz, zatim na osnovu jačine 2 ulazna signala u izlaznu datoteku ispisati imena operacionih pojačavača koji mogu da pojačaju razliku ulaznih signala, osim onih čiji je napon ofseta 0 (Auto-Zero pojačavače). Operacioni pojačavač može da pojača ulaznu vrednost ako važi da je napon napajanja veći od izlaznog signala, to jest:

\[napajanje > pojacanje * | ulaz1 - ulaz2 |\]

Gde su ulaz1 i ulaz2 jačine signala učitanih kao argumenti komandne linije, realni brojevi uneti u milivoltima. Pored imena ispisati vrednost izlaznog signala (realan broj), kao i procenat okretanja potenciometra koji služi za eliminaciju napona ofseta, koji se računa iz izraza:

\[(1 - \frac{napajanje - ofset}{2 * napajanje}) * 100\]

Podvući crtu ispod poslednjeg pronađenog pojačavača (sastoji se od 25 srednjih crtica -), i ispod ispisati imena odgovarajućih pojačavača čiji je napon ofseta 0, jačinu izlaznog potencijala, i karaktere AZ.

Osim ispisivanja operacionih pojačavača, potrebno je pronaći i ispisati na standardni izlaz ime i pojačanje pojačavača sa najvećim pojačanjem.

U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0 (EXIT_SUCCESS). Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:

  • U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa sa status kodom 1 (EXIT_FAILURE)

  • Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom 2

  • Ako program ne može da otvori izlaznu datoteku, izaći sa status kodom 3

Primer poziva programa:

./a.out opamps.txt 139.7 117.9

Primer ulazne datoteke opamps.txt:

LM741 200 22 6
NE5532 100 15 4
LM709 45 18 6
LTC2063 562 6 0
AI4309 100 10 0
LM1458 15 18 6
LM324 100 32 3
AD8538 300 5 0
AD8021 76 10 1
TC913 316 16 0

Primer izlazne datoteke operacioni_pojacavaci.txt:

LM741 4.36 63.64%
NE5532 2.18 63.33%
LM709 0.98 66.67%
LM1458 0.33 66.67%
LM324 2.18 54.69%
AD8021 1.66 55.00%
-------------------------
AI4309 2.18 AZ
TC913 6.89 AZ

Ispis programa na standardnom izlazu:

Najvece pojacanje ima: LTC2063, i ono iznosi: 562

Primer rešenja

  1#include <stdio.h>
  2#include <math.h>
  3#include <stdlib.h>
  4
  5#define MAX_NAZIV 11
  6
  7#define MAX_POJACAVACA 20
  8
  9#define MAX_IME_DATOTEKE 30
 10
 11typedef struct pojacavac_st {
 12    char naziv[MAX_NAZIV];
 13    int pojacanje;
 14    int napajanje;
 15    int ofset;
 16} POJACAVAC;
 17
 18FILE *safe_fopen(char *, char *, int);
 19void ucitaj_pojacavace(FILE *, POJACAVAC *, int *);
 20void ispisi_pojacavace(FILE *, POJACAVAC *, int, double, double);
 21void ispisi_auto_zero(FILE *, POJACAVAC *, int, double, double);
 22POJACAVAC pronadji_naj_pojacavac(POJACAVAC *, int);
 23
 24int main(int argc, char **argv) {
 25    POJACAVAC pojacavaci[MAX_POJACAVACA];
 26    int n;
 27
 28    if(argc != 4) {
 29        printf("Primer poziva programa: %s opamps.txt 139.7 117.9\n", argv[0]);
 30        exit(1);
 31    }
 32
 33    FILE *pulazna = safe_fopen(argv[1], "r", 2);
 34    ucitaj_pojacavace(pulazna, pojacavaci, &n);
 35    fclose(pulazna);
 36
 37    double ul1 = atof(argv[2]) / 1000;
 38    double ul2 = atof(argv[3]) / 1000;
 39    
 40    char ime_datoteke[MAX_IME_DATOTEKE] = "operacioni_pojacavaci.txt";
 41    FILE *pizlazna = safe_fopen(ime_datoteke, "w", 3);
 42    ispisi_pojacavace(pizlazna, pojacavaci, n, ul1, ul2);
 43    ispisi_auto_zero(pizlazna, pojacavaci, n, ul1, ul2);
 44
 45    POJACAVAC naj_pojacavac = pronadji_naj_pojacavac(pojacavaci, n);
 46    printf("Najvece pojacanje ima: %s, i ono iznosi: %d\n", naj_pojacavac.naziv, naj_pojacavac.pojacanje);
 47    fclose(pizlazna);
 48
 49    return 0;
 50}
 51
 52FILE *safe_fopen(char *ime, char *rezim, int kod_greske) {
 53    FILE *fp = fopen(ime, rezim);
 54
 55    if(fp == NULL) {
 56        printf("Greska prilikom otvaranja %s datoteke!\n", ime);
 57        exit(kod_greske);
 58    }
 59
 60    return fp;
 61}
 62
 63void ucitaj_pojacavace(FILE *pulazna, POJACAVAC *pojacavaci, int *pn) {
 64    int i = 0;
 65
 66    while(fscanf(pulazna, "%s %d %d %d",
 67                 pojacavaci[i].naziv,
 68                 &pojacavaci[i].pojacanje,
 69                 &pojacavaci[i].napajanje,
 70                 &pojacavaci[i].ofset) != EOF) {
 71        i++;
 72    }
 73
 74    *pn = i;
 75}
 76
 77void ispisi_pojacavace(FILE *pizlazna, POJACAVAC *pojacavaci, int n, double ul1, double ul2)
 78{
 79    int i;
 80
 81    for(i = 0; i < n; i++)
 82    {
 83        double izlaz = (double)pojacavaci[i].pojacanje * fabs(ul1 - ul2);
 84        if((pojacavaci[i].napajanje > izlaz) && (pojacavaci[i].ofset != 0))
 85        {
 86            double procenat = (1 - (pojacavaci[i].napajanje - (double)pojacavaci[i].ofset)/(2 * pojacavaci[i].napajanje)) * 100;
 87            fprintf(pizlazna, "%s %.2lf %.2lf%%\n", pojacavaci[i].naziv, izlaz, procenat);
 88        }
 89    }
 90
 91    fprintf(pizlazna, "-------------------------\n");
 92}
 93
 94void ispisi_auto_zero(FILE *pizlazna, POJACAVAC *pojacavaci, int n, double ul1, double ul2)
 95{
 96    int i;
 97
 98    for(i = 0; i < n; i++)
 99    {
100        double izlaz = (double)pojacavaci[i].pojacanje * fabs(ul1 - ul2);
101        if((pojacavaci[i].napajanje > izlaz) && (pojacavaci[i].ofset == 0))
102        {
103            fprintf(pizlazna, "%s %.2lf %s\n", pojacavaci[i].naziv, izlaz, "AZ");
104        }
105    }
106}
107
108POJACAVAC pronadji_naj_pojacavac(POJACAVAC *pojacavaci, int n)
109{
110    POJACAVAC max = pojacavaci[0];
111    int i;
112
113    for(i = 1; i < n; i++)
114    {
115        if (pojacavaci[i].pojacanje > max.pojacanje)
116        {
117            max = pojacavaci[i];
118        }
119    }
120
121    return max;
122}