Automatizovani regulator temperature tecnosti
Moderators: pedja089, stojke369, [eDo], trax
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Automatizovani regulator temperature tecnosti
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
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
Re: Automatizovani regulator temperature tecnosti
Aj okaci taj kod
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
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;
}
}
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;
}
}
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
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
Re: Automatizovani regulator temperature tecnosti
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 ....
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
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
Re: Automatizovani regulator temperature tecnosti
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 ....
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
izvini sto sam zakasnio malo evo seme a sad cu i kod
http://postimg.cc/image/feb8kqvb5/
http://postimg.cc/image/feb8kqvb5/
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
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;
}
}
/*
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;
}
}
Re: Automatizovani regulator temperature tecnosti
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.
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
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
}
}
}
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
-
- Posts: 7
- Joined: 05-06-2013, 12:34
Re: Automatizovani regulator temperature tecnosti
hvala puno za ideju probacu to kad budem imao vremena pa ti javljam rezultate.