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:
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:
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
./a.out 139.7 117.9 < opamps-stdinout.txt
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 ulazne datoteke opamps-stdinout.txt
:
10
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
Ispis programa na standardnom izlazu:
Unesite broj operacionih pojacavaca: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac: Operacioni pojacavac:
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
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}
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
9typedef struct pojacavac_st {
10 char naziv[MAX_NAZIV];
11 int pojacanje;
12 int napajanje;
13 int ofset;
14} POJACAVAC;
15
16void ucitaj_pojacavace(POJACAVAC *, int *);
17void ispisi_pojacavace(POJACAVAC *, int, double, double);
18void ispisi_auto_zero(POJACAVAC *, int, double, double);
19POJACAVAC pronadji_naj_pojacavac(POJACAVAC *, int);
20
21int main(int argc, char **argv) {
22 POJACAVAC pojacavaci[MAX_POJACAVACA];
23 int n;
24
25 if(argc != 3) {
26 printf("Primer poziva programa: %s 139.7 117.9\n", argv[0]);
27 exit(1);
28 }
29
30 ucitaj_pojacavace(pojacavaci, &n);
31
32 double ul1 = atof(argv[1]) / 1000;
33 double ul2 = atof(argv[2]) / 1000;
34
35 printf("\n");
36 ispisi_pojacavace(pojacavaci, n, ul1, ul2);
37 ispisi_auto_zero(pojacavaci, n, ul1, ul2);
38
39 POJACAVAC naj_pojacavac = pronadji_naj_pojacavac(pojacavaci, n);
40 printf("\nNajvece pojacanje ima: %s, i ono iznosi: %d\n", naj_pojacavac.naziv, naj_pojacavac.pojacanje);
41
42 return 0;
43}
44
45void ucitaj_pojacavace(POJACAVAC *pojacavaci, int *pn) {
46 int i;
47
48 do
49 {
50 printf("Unesite broj operacionih pojacavaca: ");
51 scanf("%d", pn);
52 } while (*pn <= 0 || *pn > MAX_POJACAVACA);
53
54
55 for(i = 0;i < *pn;i++)
56 {
57 printf("Operacioni pojacavac: ");
58 scanf("%s %d %d %d",
59 pojacavaci[i].naziv,
60 &pojacavaci[i].pojacanje,
61 &pojacavaci[i].napajanje,
62 &pojacavaci[i].ofset);
63 }
64}
65
66void ispisi_pojacavace(POJACAVAC *pojacavaci, int n, double ul1, double ul2)
67{
68 int i;
69
70 for(i = 0; i < n; i++)
71 {
72 double izlaz = (double)pojacavaci[i].pojacanje * fabs(ul1 - ul2);
73 if((pojacavaci[i].napajanje > izlaz) && (pojacavaci[i].ofset != 0))
74 {
75 double procenat = (1 - (pojacavaci[i].napajanje - (double)pojacavaci[i].ofset)/(2 * pojacavaci[i].napajanje)) * 100;
76 printf("%s %.2lf %.2lf%%\n", pojacavaci[i].naziv, izlaz, procenat);
77 }
78 }
79
80 printf("-------------------------\n");
81}
82
83void ispisi_auto_zero(POJACAVAC *pojacavaci, int n, double ul1, double ul2)
84{
85 int i;
86
87 for(i = 0; i < n; i++)
88 {
89 double izlaz = (double)pojacavaci[i].pojacanje * fabs(ul1 - ul2);
90 if((pojacavaci[i].napajanje > izlaz) && (pojacavaci[i].ofset == 0))
91 {
92 printf("%s %.2lf %s\n", pojacavaci[i].naziv, izlaz, "AZ");
93 }
94 }
95}
96
97POJACAVAC pronadji_naj_pojacavac(POJACAVAC *pojacavaci, int n)
98{
99 POJACAVAC max = pojacavaci[0];
100 int i;
101
102 for(i = 1; i < n; i++)
103 {
104 if (pojacavaci[i].pojacanje > max.pojacanje)
105 {
106 max = pojacavaci[i];
107 }
108 }
109
110 return max;
111}