Automatizovani regulator temperature tecnosti

Projekti naših članova foruma koji su još uvijek u fazi izrade.

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

Zdravo svim clanovima,
Radim projekat za automatsko regulisanje temperature tecnosti. Koristim mikrokontroler PIC16F887. Projekat se sastoji od akvarijumskog dela gde grejem vodu pomocu 2KW grejaca i pumpicu za ladjenje u slucaju pregrevanja i drugi deo je elektronika. Za paljenje grejaca koristim optotriac MOC3021 koji pali triac BT136d a triac zatvara kolo i propusta struju. Isto tako koristim i kolo za zero-cross. Upravljanje je pomocu PID algoritma. Imam neke sitnice oko koda programiranja sto mi nedaju da zavrsim projekat uspesno. Programiram u microC. Problem je to sto imam neko kasnjenje u kod i triac nemoze da upali u odredjeni momenat, a samim tim ne dobijam rezultat zeljenog napona na izlaz (kod grejaca). Trebao bi da radi kao dimmer za svetlo primer kad mu zadam da radi 30% od mocnosti trebao bi da grije toliko. kao indikaciju na izlaz mesto grejaca stavio sam sijalicu i primecujem da sijalica treperi a ne bi trebalo.
Dali neko ima nesto ovako uradjeno. Potreban mi je kod da sve to uklopim. Hvala
vukboban
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 212
Joined: 05-12-2008, 17:49
Location: Pancevo

Re: Automatizovani regulator temperature tecnosti

Post by vukboban »

Aj okaci taj kod
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

unsigned int x, z, zc = 0, dim = 0;
float y;

void interrupt() {
if ((PORTB.f7 == 1)&&(zc == 0)) {
zc = 1;
dim = 0;
}
if (zc == 1) {
dim++;
if (dim == z) {
PORTC = 0x01;
zc = 2;
dim = 1;
}
}
if (zc == 2) {
dim++;
if (dim > 10) {
PORTC = 0x00;
}
if (PORTB.f7 == 0) zc = 0;
}
TMR0L = 173;
INTCON = 0x20;
}

void main(void) {
ADCON1 = 0x07;
PORTC = 0x00;
TRISA = 0xFF;
TRISB = 0xFF;
TRISC = 0x00;
TRISD = 0x00;
T0CON = 0xC8; // no prescaler, frequency of 1MHz, TMR0 will count 83 us before interrupt
TMR0L = 173; // 256 - 83 = 173
INTCON = 0xA0;
while (1) {
x = ADC_Read(0); // AN0 = RA0
y = -100/1023 * x + 110;
z = int(y);
PORTD = z;
}
}
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

malo pojasnjenje: koristim 4 Mhz oscilator, PIC 16f887 ima 10 bitni AD convertor, tu ulazi signal od senzora koji meri temperaturu vode. ovo nije ceo kod vec samo ono sto trazim pomoc oko paljenje triaca
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Automatizovani regulator temperature tecnosti

Post by Kukinjos »

Nešto ti ne valja s izborom timera, jer timer0 ima samo varijablu TMR0, a ne TMR0L, jer je 8 bitni. Isto vrijedi i za INTCON, koji bi trebao bit OPTION_REG. Nisi napisao što ti dolazi na port B7? Port C0 je valjda izlaz za MOC3021. Ne znam kako si taj kod uspio kompajlirat bez greške :?:
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

Da upravu si za tajmere koregirao sam TMR0 i INTCON, kod sto sam postavio bio je za PIC18fxxx koji sam ja koristio kao pravac, bilo je i drugih korekcija(nisu isti izlazi kao kod mene na semu ali to je sve nastimano prema semu) , stigo sam da iskompajlisem bez greske i rezultat nikako da dobijem da mi se pali triac u momenat kad ja hocu i plus treperi a trebalo bi da tinja, kao da nehvata 50 Hz frekvenciju vec manje... Ako znas otprilike kako treba molim te ispisi to kao kod pa cu ja probati :) namerno nisam stavio moj kod jer nesto nevalja. al dobro evo stavicu ja sta sam smenio pa proveri
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Automatizovani regulator temperature tecnosti

Post by Kukinjos »

Ne budi škrt :) , daj shemu ili barem navedi ulaz za zero crossing, izlaz na optocoupler. Kako radi zero crossing stoji na L pa skoči na H kad prođe kroz 0, ili je na H pa padne na L, ili nešto drugo. Kakav izlaz trebaš za optocopuler, H ili L. Koja varijabla utječe na kašnjenje impulsa i u kojoj mjeri, 0 - min, 255 - max kašnjenje ili obrnuto. Osim toga si rekao da ćeš postat kod kojeg si izmjenio, ne vidim ga???
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

izvini sto sam zakasnio malo evo seme a sad cu i kod
http://postimg.cc/image/feb8kqvb5/
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

dakle ovo je zadnji kod koji smo probali s kolegom i naravno nije finalna verzija jer treba da uradim PID algoritam upravljanja ali je dovoljno da se vidi princip rada

/*
Kod za rabota so LCD display
*/

int sakanatemp=25;
int br=0,zc=0,dim=0,p1,p3;
float p2;

sbit LCD_RS at RD5_bit;
sbit LCD_EN at RD4_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISD5_bit;
sbit LCD_EN_Direction at TRISD4_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections

char txt1[] = "Ref.Temp= C";
char txt2[] = "MerenaT.= C";


void printnaLCD(int stemp, int merena)
{

char s1,s2,s3,z1,z2,z3;
int k,tmp1,tmp2;
tmp1=stemp; tmp2=stemp;
s1=(stemp/100)+48;
s2=(tmp1%100)+48;
s3=(tmp2%10)+48;
txt1[9]=s1; txt1[10]=s2; txt1[11]=s3;

/*z1=(merena/10)+48;
z2=(merena%10)+48;
txt2[9]=z1; txt2[10]=z2; */

//
z1=(merena/100)+48;
z2=((merena%100)/10)+48;
z3=(merena%10)+48;
txt2[9]=z1; txt2[10]=z2; txt2[11]=z3;
//

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(2,1,txt2); // Write text in second row
// for(k=0;k<=10000;k++){;}
}

void interrupt()
{

if((PORTB.f0 == 0)&&(zc == 0)){
zc = 1;
dim = 0;
}
if (zc == 1) {
dim++;
if (dim == p3) {
PORTC.f2 = 1;
zc = 2;
dim = 1;
}
}
if (zc == 2) {
dim++;
if (dim == 3) {
PORTC.f2 = 0;
zc = 0;
}

//if (PORTB.f0 == 0)
}
TMR0 = 173;
//INTCON.INTF=0;
INTCON.TMR0IF=0;
}

void main(){
int oldstate, x, mtemp;
long int j;


ANSEL = 1; // Configure AN pins as digital I/O
ANSELH = 0;

TRISA=0xFF;
TRISB=0b00000111;
PORTB=0x00;
TRISC=0x00;
PORTC=0b00000000;
TRISD=0x00;

//INTCON.INTE=1;
INTCON.GIE=1;
INTCON.TMR0IE=1;
OPTION_REG=0b11001000;
INTCON.TMR0IF=0;

TMR0 = 173; // 256 - 83 = 173
p1=100;

while(1){
//p1 = 100;
p2 = (-100.0/1023.0)*p1 + 110;
p3 = (int)p2;


if (Button(&PORTB, 1, 5, 0)) oldstate = 1;
if (oldstate && Button(&PORTB, 1, 5, 1)) {

p1=p1+100;
oldstate = 0;
}
if (Button(&PORTB, 2, 5, 0)) oldstate = 1;
if (oldstate && Button(&PORTB, 2, 5, 1)) {

p1=p1-100;
oldstate = 0;
}


x = ADC_Read(0); // AN0 = RA0
mtemp = x/2.0;
//printnaLCD(p1,mtemp);
printnaLCD(p1,p3);


//for(j=0;j<=100000;j++){;}
PORTC.f1=~PORTC.f1;

}
}
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Automatizovani regulator temperature tecnosti

Post by Kukinjos »

Konačno sam uhvatio pet minuta pogledat ovaj kod. Mislim da ti nije potrebno imat onako kratak okidni impuls na trijaku, radije ga produži do kraja poluperiode, jer se može dogodit da ne upali svaki put. Vidim da kod nisi dovršio, pa ti u nastavku samo šaljem moju ideju za interrupt rutinu.

Code: Select all

void interrupt()
{

   if (INTCON.INTE){ // AKO SE POJAVIO ZC

     PORTC.f2 = 0; // isključi trijak
     INTCON.T0IE = 0; // zabrani interrupt timera 0
     dim = 0; // resetiraj dim

     while (PORTB.f0){ // čekaj dok traje ZC
     }
     
     INTCON.INTF=0; // obriši flag ZC
     INTCON.INTE=1; // dopusti ZC interrupt
     TMR0 = 173; // postavi timer 0
     INTCON.TMR0IF=0; // obriši flag timera0
     INTCON.T0IE=1; //dopusti inter. timera0
   }
   
   if (INTCON.T0IF) { //ako se pojavio inter. timera 0
     
     dim++; // povećaj dimer za 1
     TMR0 = 173; // postavi timer 0
     INTCON.TMR0IF=0; // obriši flag timera0

     if (dim == p3) { // i ako je dimer odbrojio do kraja
       PORTC.f2 = 1; // uključi trijak
       INTCON.T0IE = 0; // isključi interrupt timera 0
       INTCON.INTE = 1; // uključi inter. za ZC
       }
   }

}
Ovo nisam imao mogućnost ispitat jer nemam taj kontroler, možda ga i nabavim ovih dana, pa ću onda vjerojatno to probat na pravom hardware-u, za sada samo ovako :)
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Nikolic_Nenad
Posts: 7
Joined: 05-06-2013, 12:34

Re: Automatizovani regulator temperature tecnosti

Post by Nikolic_Nenad »

hvala puno za ideju probacu to kad budem imao vremena pa ti javljam rezultate.
Post Reply