Filip Butumovic / Mbed 2 deprecated Diplomski_FB_E504_Final

Dependencies:   mbed-rtos mbed

Committer:
filabutum
Date:
Wed Dec 23 11:14:09 2015 +0000
Revision:
1:921e6706811e
Parent:
0:cc685a553e75
Diplomski rad E504

Who changed what in which revision?

UserRevisionLine numberNew contents of line
filabutum 1:921e6706811e 1 //************************Filip Butumović - Diplomski rad br. E504****************************
filabutum 1:921e6706811e 2 //*****Realizacija dvopoložajnog regulatora temperature upotrebom mbed mikroupravljača********
filabutum 1:921e6706811e 3
filabutum 0:cc685a553e75 4 #include "mbed.h"
filabutum 0:cc685a553e75 5 #include "rtos.h"
filabutum 0:cc685a553e75 6
filabutum 0:cc685a553e75 7 BusOut Seg1(p12, p11, p10, p9, p8, p7, p6, p5); //Izlazi segmenata
filabutum 0:cc685a553e75 8 BusOut Disp1(p30,p29,p28,p27); //Izlazi pojedinih zaslona
filabutum 0:cc685a553e75 9 InterruptIn TP1(p24); //Signal lijeve tipke
filabutum 0:cc685a553e75 10 DigitalIn TP2(p25); //Signal srednje tipke
filabutum 0:cc685a553e75 11 DigitalIn TP3(p26); //Signal desne tipke
filabutum 0:cc685a553e75 12 AnalogIn TempIN(p20); //Analogni ulaz vrijednosti senzora temperature
filabutum 0:cc685a553e75 13 Timer uzorkovanje; //Citanje analognog ulaza s vremenskom odgodom, uzorkovanje
filabutum 0:cc685a553e75 14 Serial pc(USBTX, USBRX); //Serijska komunikacija između mikroupravljača i PC-a putem USB sučelja
filabutum 0:cc685a553e75 15 PwmOut AKT(p21); //Aktuator (grijac)
filabutum 0:cc685a553e75 16
filabutum 0:cc685a553e75 17 char SegConvert(char SegValue);
filabutum 0:cc685a553e75 18 const int disp[5]= {0x01,0x02,0x04,0x00,0x08};
filabutum 0:cc685a553e75 19 int menu=0, T1_Temp=0, T2_Temp=0, T3_Temp=0,Temp_SP=0, Temp_DB=0, Temp1=0, Temp2=130, TempIN1=0, TempIN2=1, NumbAct=0,counter=0, i=0,Numb=0, AKT_marker=0,Temp_Act=0;
filabutum 0:cc685a553e75 20 //Temp_SP - Zadana vrijednost temperature, Temp_DB - Zadana vrijednost tolerancije (Dead-Band), Temp1=x1 (min u rasponu), Temp2=x2(max u rasponu), TempIN1=y1, TempIN2=y2, Temp_Act - Stvarna izmjerena temperatura (skalirana)
filabutum 0:cc685a553e75 21 float AN_IN_Temp=0; //Varijabla u koju se privremeno sprema vrijednost učitane analogne vrijednosti
filabutum 0:cc685a553e75 22
filabutum 0:cc685a553e75 23 int Reference(int Ref);
filabutum 0:cc685a553e75 24 void MenuSwitch(void);
filabutum 0:cc685a553e75 25
filabutum 0:cc685a553e75 26 void funkc_prikaz(void const *argument)//Funkcija za upravljanje prikazom 7 segmentnog zaslona
filabutum 0:cc685a553e75 27 {
filabutum 0:cc685a553e75 28 while(true) {
filabutum 0:cc685a553e75 29 TP1.rise(&MenuSwitch); //Pritiskom na lijevo tipku, mjenja se vrsta prikaza na zaslonu
filabutum 0:cc685a553e75 30 uzorkovanje.start();
filabutum 0:cc685a553e75 31 if (uzorkovanje.read_ms()>=100) {
filabutum 0:cc685a553e75 32 AN_IN_Temp=TempIN;
filabutum 0:cc685a553e75 33 Temp_Act=Temp1+(((AN_IN_Temp-TempIN1)*(Temp2-Temp1))/(TempIN2-TempIN1));//Jednadzba pravca kroz dvije tocke - skaliranje ulazne vrijednosti temperature
filabutum 0:cc685a553e75 34 uzorkovanje.reset();
filabutum 0:cc685a553e75 35 }
filabutum 0:cc685a553e75 36 //pc.printf("Stvarna vrijednost:%f Skalirana vrijednost:%d Stanje aktuatora:%d\n\r",AN_IN_Temp, Temp_Act, AKT_marker); //Ispis vrijednosti na terminalu
filabutum 0:cc685a553e75 37 if(menu==0) { //Prikazuje vrijednost stvarne temperature ("A" na zaslonu)
filabutum 0:cc685a553e75 38 NumbAct=Temp_Act;
filabutum 0:cc685a553e75 39 }
filabutum 0:cc685a553e75 40 if(menu==1) { //Prikazuje vrijednost referentne temperature ("S" na zaslonu)
filabutum 0:cc685a553e75 41 Temp_SP=Reference(Temp_SP);
filabutum 0:cc685a553e75 42 NumbAct=Temp_SP;
filabutum 0:cc685a553e75 43 }
filabutum 0:cc685a553e75 44 if(menu==2) { //Prikazuje vrijednost tolerancije na zaslonu ("d" na zaslonu)
filabutum 0:cc685a553e75 45 Temp_DB=Reference(Temp_DB);
filabutum 0:cc685a553e75 46 NumbAct=Temp_DB;
filabutum 0:cc685a553e75 47 }
filabutum 0:cc685a553e75 48 if(NumbAct<10) { //Ako je broj koji se treba prikazati jednoznamenkasti, upravljanje vrsi ova petlja
filabutum 0:cc685a553e75 49 for(i=0; i<2; i++) {
filabutum 0:cc685a553e75 50 if(i==0) {
filabutum 0:cc685a553e75 51 Disp1=disp[i];
filabutum 0:cc685a553e75 52 Seg1=SegConvert(NumbAct);
filabutum 0:cc685a553e75 53 }
filabutum 0:cc685a553e75 54 if(i==1) {
filabutum 0:cc685a553e75 55 Disp1=disp[4];
filabutum 0:cc685a553e75 56 Seg1=SegConvert(menu+11);
filabutum 0:cc685a553e75 57 }
filabutum 0:cc685a553e75 58 wait(0.001);
filabutum 0:cc685a553e75 59 }
filabutum 0:cc685a553e75 60 }
filabutum 0:cc685a553e75 61 if(NumbAct>=10&&NumbAct<100) { //Ako je broj koji se treba prikazati dvoznamenkasti, upravljanje vrsi ova petlja
filabutum 0:cc685a553e75 62 for(i=0; i<3; i++) {
filabutum 0:cc685a553e75 63 if(i<2) {
filabutum 0:cc685a553e75 64 if(i==0) {
filabutum 0:cc685a553e75 65 Numb=NumbAct%10;
filabutum 0:cc685a553e75 66 }
filabutum 0:cc685a553e75 67 if(i==1) {
filabutum 0:cc685a553e75 68 Numb=NumbAct/10;
filabutum 0:cc685a553e75 69 }
filabutum 0:cc685a553e75 70 Disp1=disp[i];
filabutum 0:cc685a553e75 71 Seg1=SegConvert(Numb);
filabutum 0:cc685a553e75 72 }
filabutum 0:cc685a553e75 73 if(i==2) {
filabutum 0:cc685a553e75 74 Disp1=disp[4];
filabutum 0:cc685a553e75 75 Seg1=SegConvert(menu+11);
filabutum 0:cc685a553e75 76 }
filabutum 0:cc685a553e75 77 wait(0.001);
filabutum 0:cc685a553e75 78 }
filabutum 0:cc685a553e75 79
filabutum 0:cc685a553e75 80 }
filabutum 0:cc685a553e75 81 if(NumbAct>=100&&NumbAct<1000) { //Ako je broj koji se treba prikazati troznamenkasti, upravljanje vrsi ova petlja
filabutum 0:cc685a553e75 82 for(i=0; i<4; i++) {
filabutum 0:cc685a553e75 83 if(i<3) {
filabutum 0:cc685a553e75 84 if(i==0) {
filabutum 0:cc685a553e75 85 Numb=NumbAct%10;
filabutum 0:cc685a553e75 86 }
filabutum 0:cc685a553e75 87 if(i==1) {
filabutum 0:cc685a553e75 88 Numb=NumbAct/10;
filabutum 0:cc685a553e75 89 Numb=Numb%10;
filabutum 0:cc685a553e75 90 }
filabutum 0:cc685a553e75 91 if(i==2) {
filabutum 0:cc685a553e75 92 Numb=NumbAct/100;
filabutum 0:cc685a553e75 93 }
filabutum 0:cc685a553e75 94 Disp1=disp[i];
filabutum 0:cc685a553e75 95 Seg1=SegConvert(Numb);
filabutum 0:cc685a553e75 96 }
filabutum 0:cc685a553e75 97 if(i==3) {
filabutum 0:cc685a553e75 98 Disp1=disp[4];
filabutum 0:cc685a553e75 99 Seg1=SegConvert(menu+11);
filabutum 0:cc685a553e75 100 }
filabutum 0:cc685a553e75 101 wait(0.00075);
filabutum 0:cc685a553e75 102 }
filabutum 0:cc685a553e75 103 }
filabutum 0:cc685a553e75 104 }
filabutum 0:cc685a553e75 105 }
filabutum 0:cc685a553e75 106 void MenuSwitch() //Funkcija za promjenu prikaza na zaslonu, izbornik (0-stvarna temperatura, 1-zadavanje referentne vrijednosti, 2- zadavanje tolerancije
filabutum 0:cc685a553e75 107 {
filabutum 0:cc685a553e75 108 menu=menu+1;
filabutum 0:cc685a553e75 109 if(menu>2) {
filabutum 0:cc685a553e75 110 menu=0;
filabutum 0:cc685a553e75 111 }
filabutum 0:cc685a553e75 112 }
filabutum 0:cc685a553e75 113
filabutum 0:cc685a553e75 114 char SegConvert(char SegValue) //Funkcija koja dekodira broj za ispravan prikaz na zaslonu 7 segmentnog zaslona
filabutum 0:cc685a553e75 115 {
filabutum 0:cc685a553e75 116 char SegByte=0x00;
filabutum 0:cc685a553e75 117 switch(SegValue) {
filabutum 0:cc685a553e75 118 case 0 :
filabutum 0:cc685a553e75 119 SegByte=0x03; // Broj 0
filabutum 0:cc685a553e75 120 break;
filabutum 0:cc685a553e75 121 case 1 :
filabutum 0:cc685a553e75 122 SegByte=0x9F; // Broj 1
filabutum 0:cc685a553e75 123 break;
filabutum 0:cc685a553e75 124 case 2 :
filabutum 0:cc685a553e75 125 SegByte=0x25; // Broj 2
filabutum 0:cc685a553e75 126 break;
filabutum 0:cc685a553e75 127 case 3 :
filabutum 0:cc685a553e75 128 SegByte=0x0D; // Broj 3
filabutum 0:cc685a553e75 129 break;
filabutum 0:cc685a553e75 130 case 4 :
filabutum 0:cc685a553e75 131 SegByte=0x99; // Broj 4
filabutum 0:cc685a553e75 132 break;
filabutum 0:cc685a553e75 133 case 5 :
filabutum 0:cc685a553e75 134 SegByte=0x49; // Broj 5
filabutum 0:cc685a553e75 135 break;
filabutum 0:cc685a553e75 136 case 6 :
filabutum 0:cc685a553e75 137 SegByte=0x41; // Broj 6
filabutum 0:cc685a553e75 138 break;
filabutum 0:cc685a553e75 139 case 7 :
filabutum 0:cc685a553e75 140 SegByte=0x1B; // Broj 7
filabutum 0:cc685a553e75 141 break;
filabutum 0:cc685a553e75 142 case 8 :
filabutum 0:cc685a553e75 143 SegByte=0x01; // Broj 8
filabutum 0:cc685a553e75 144 break;
filabutum 0:cc685a553e75 145 case 9 :
filabutum 0:cc685a553e75 146 SegByte=0x09; // Broj 9
filabutum 0:cc685a553e75 147 break;
filabutum 0:cc685a553e75 148 case 10 :
filabutum 0:cc685a553e75 149 SegByte=0xFE; // Decimalna tocka
filabutum 0:cc685a553e75 150 break;
filabutum 0:cc685a553e75 151 case 11 :
filabutum 0:cc685a553e75 152 SegByte=0x11; // "A" kao "Actual"
filabutum 0:cc685a553e75 153 break;
filabutum 0:cc685a553e75 154 case 12 :
filabutum 0:cc685a553e75 155 SegByte=0x49; // "S" kao "Setpoint"
filabutum 0:cc685a553e75 156 break;
filabutum 0:cc685a553e75 157 case 13 :
filabutum 0:cc685a553e75 158 SegByte=0x85; // "d" kao "Dead Band"
filabutum 0:cc685a553e75 159 break;
filabutum 0:cc685a553e75 160 }
filabutum 0:cc685a553e75 161 return SegByte;
filabutum 0:cc685a553e75 162 }
filabutum 0:cc685a553e75 163 int Reference(int Ref)//Funkcija koja generira broj koji se zapisuje u varijablu reference ili tolerancije, ovisno koja ju pozove
filabutum 0:cc685a553e75 164 {
filabutum 0:cc685a553e75 165 counter=Ref;
filabutum 0:cc685a553e75 166 if(TP2==0) {
filabutum 0:cc685a553e75 167 T2_Temp=0; //Tipka 2 ako je u "nuli", preslikava se stanje u privremenu memoriju
filabutum 0:cc685a553e75 168 }
filabutum 0:cc685a553e75 169 if(TP3==0) {
filabutum 0:cc685a553e75 170 T3_Temp=0; //Tipka 3 ako je u "nuli", preslikava se stanje u privremenu memoriju
filabutum 0:cc685a553e75 171 }
filabutum 0:cc685a553e75 172 if((T2_Temp==0&&TP2==1)||(T2_Temp==1&&TP2==0)) {//Prethodno zapamceno stanje T2 i trenutno stanje tipke T2 ako je razlicito brojac se uvecava za jedan
filabutum 0:cc685a553e75 173 counter++;
filabutum 0:cc685a553e75 174 }
filabutum 0:cc685a553e75 175 if((T3_Temp==0&&TP3==1)||(T3_Temp==1&&TP3==0)) {//Prethodno zapamceno stanje T3 i trenutno stanje tipke T3 ako je razlicito brojac se umanjuje za jedan
filabutum 0:cc685a553e75 176 counter--;
filabutum 0:cc685a553e75 177 }
filabutum 0:cc685a553e75 178 if(counter<=0) { //Limit minimalnog moguceg broja za odredivanje reference
filabutum 0:cc685a553e75 179 counter=0;
filabutum 0:cc685a553e75 180 }
filabutum 0:cc685a553e75 181 if(counter>=999) { //Limit maksimalnog moguceg broja za odredivanje reference
filabutum 0:cc685a553e75 182 counter=999;
filabutum 0:cc685a553e75 183 }
filabutum 0:cc685a553e75 184 if(TP2==1) {
filabutum 0:cc685a553e75 185 T2_Temp=1; //Tipka 2 ako je u "jedinici", preslikava se stanje u privremenu memoriju
filabutum 0:cc685a553e75 186 }
filabutum 0:cc685a553e75 187 if(TP3==1) {
filabutum 0:cc685a553e75 188 T3_Temp=1; //Tipka 3 ako je u "jedinici", preslikava se stanje u privremenu memoriju
filabutum 0:cc685a553e75 189 }
filabutum 0:cc685a553e75 190 return counter;
filabutum 0:cc685a553e75 191 }
filabutum 0:cc685a553e75 192 int main()
filabutum 0:cc685a553e75 193 {
filabutum 0:cc685a553e75 194 Thread petlja2(funkc_prikaz); //Pozivanje funkcije koja ce se paralelno izvrsavati sa glavnom funkcijom
filabutum 0:cc685a553e75 195 AKT.period(0.01);
filabutum 0:cc685a553e75 196 while(1) {
filabutum 0:cc685a553e75 197 while((Temp_SP+Temp_DB)>Temp_Act) { //Glavna petlja - dvopolozajna regulacija. Ako je zadana temperatura veca od stvarne, pali se grijac
filabutum 0:cc685a553e75 198 if(AKT_marker==1) {}
filabutum 0:cc685a553e75 199 else {
filabutum 0:cc685a553e75 200 AKT=0.5;
filabutum 0:cc685a553e75 201 AKT_marker=1;
filabutum 0:cc685a553e75 202 }
filabutum 0:cc685a553e75 203 }
filabutum 0:cc685a553e75 204 while((Temp_SP-Temp_DB)<Temp_Act) { //Glavna petlja - dvopolozajna regulacija. Ako je zadana temperatura manja od stvarne, gasi se grijac
filabutum 0:cc685a553e75 205 if(AKT_marker==1) {
filabutum 0:cc685a553e75 206 AKT=0;
filabutum 0:cc685a553e75 207 AKT_marker=0;
filabutum 0:cc685a553e75 208 } else {
filabutum 0:cc685a553e75 209 }
filabutum 0:cc685a553e75 210 }
filabutum 0:cc685a553e75 211 }
filabutum 0:cc685a553e75 212 }