#include #include unsigned int suma; unsigned int P; unsigned int I; unsigned int D; unsigned int T; unsigned int ref; char PID_flag; unsigned int ms; unsigned int brojac; unsigned int received_bajt; unsigned int gornji_bajt; unsigned int donji_bajt; int Imax; int Imin; unsigned int ostatak; long int rpm; long int inkrement; int greska; int prethodna_greska; int P_greska; int D_greska; int I_greska; long int u; int prethodni_rpm; unsigned int suma; unsigned int nobrtaj; int t,j; char step,restart; unsigned int srednji_rpm; unsigned int suma_rpm; ///////FUNKCIJE ZA INICIJALIZACIJU MIKROKONTROLERA/////////// void init_usart(unsigned int baud)// FUNKCIJA ZA PODESAVANJE BAUDRATE-A { UCSRC=0x06; UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; UCSRB = (1 << RXEN) | (1 << TXEN);// | (1 << UDRIE); UCSRC = (1<>8); while(!(UCSRA & (1<Imax) { I_greska=Imax; } if (Imin>I_greska) { I_greska = Imin; } u=(P_greska+D_greska+I_greska)/100; if(u<0) { u=0; } if(u>266) { u=266; } TCCR1B=0x00; //zaustavi brojac PORTD=0x00; OCR1AH=(u>>8); OCR1AL=u; ICR1H=0x01; ICR1L=0x0A; TCCR1A=(1 << COM1A1); TCCR1B=((1 << CS10) | (1 << WGM13));//pokreni brojac } void BrojObrtaja()/// FUNKCIJA KOJA IZRACUNAVA BROJ OBRTAJA U MINUTI(RPM) { TCCR0=0x00; //zaustavi brojac 0 ostatak=TCNT0; TCNT0=0x00; nobrtaj=brojac; brojac=0; TCCR0=0x07;//pokreni brojac 0 t=1000/T; inkrement=(nobrtaj*255)+ostatak; rpm=((((inkrement*t*1000)/23552)*6)/100); PID_flag=1; } //////////////INTERAPT RUTINE////////////// ISR(TIMER2_COMP_vect) ////TIMER2-SLUZI ZA GENERISANJE VREMENA ZA PERIOD ODABIRANJA { if(T!=0) { ms++; if(ms==T) { ms=0; BrojObrtaja(); } } } ISR(TIMER0_OVF_vect)/////BROJAC0-BROJI IMPULSE SA ENKODERA { brojac++; } ////////////////GLAVNA PETLJA//////////////// int main() { while(1) { switch(step) { case 0: { step=1; init_usart(103); init_params(); init_timers(0); init_timers(1); init_timers(2); break; } case 1:// AKO JOS NISMO USPOSTAVILI VEZU SA APLIKACIJOM, ONDA CEKAMO DA NAM SE JAVI. { GetInt(); if(received_bajt==10000) { posalji(10000); step=2; } else { posalji(11111); break; } break; } case 2:// CEKAMO DA KORISNIK POSALJE PARAMETRE ZA PID REGULATOR { ResetPID(); InitPid(); suma=P+I+D+T+Imax+ref; posalji(suma); // SALJEMO NAZAD SUMU PRISTIGLIH PAKETA ZBOG PROVERE GetInt(); if(received_bajt==20000)// APLIKACIJA JE POTVRDILA VALIDNOST PAKETA { step=3; } else { Projektni zadatak iz Digitalne upravljacke elektronike 27 posalji(22222); step=1; break; } break; } case 3:// AKTIVIRAMO PID REGULACIJU { while(!(UCSRA & (1<