2oj kanalova fazova regulacia

Odpovědět
Uživatelský avatar
eMZet
Příspěvky: 133
Registrován: 24 úno 2013, 15:02

2oj kanalova fazova regulacia

Příspěvek od eMZet »

Ahojte

Potrebujem vyrobit 2oj kanalovu fazovu regulaciu na jednom arduine NANO. S kamaratom robime upravu teplovzdusnej pajkovacky a chceme regulovat kompresor aj vyhrevne teleso. Obe su na 230 V ~.
1 kanalova funguje bez problemov no pouziva Timer1 a my potrebujeme nasatvit parametre pre Timer2 pre 50Hz.
Kazda rada dobra.

Dik
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: 2oj kanalova fazova regulacia

Příspěvek od jrt »

Třeba pomůže tohle, pokud ne, projdi si tohle.
jrt
mroks
Příspěvky: 1
Registrován: 05 dub 2013, 19:57

Re: 2oj kanalova fazova regulacia

Příspěvek od mroks »

Odkazy veľmi nepomohli, lebo my sme potrebovali hardverovú dvojkanálovú reguláciu pomocou časovačov a obsluhou prerušení a v odkazoch viackanálovosť riešia v "loope-e" programovo.
Moje programátorské začiatky boli spojené s asemblerom a procesormi PIC, a ATMELy som po hardverovej stránke veľmi nepoznal a jednoduchosť používania arduina ma k datasheetom "nedokopala". Riešenie bolo nakoniec veľmi jednoduché, stačilo iba pozrieť do datasheetu. Timer 1 má totiž 2 nezávislé komparačné registre, vyvolávajúce pri dosiahnutí nastavenej hodnoty 2 nezávislé prerušenia.
Ak by to niekomu pomohlo, prikladám upravený vzorový príklad pre "AC phase control"

Kód: Vybrat vše

/*
vzor // AC Control V1.1
 * skuska 2 kanalovej fazovej regulacie, akurat toto je na 60 Hz, tak uvidime
 nabuduce lepsie prestuduj datasheet, Timer 1 ma 2 nezavisle komparacne registre a pri dosiahnuti
 ich hodnoty vyvola 2 nezavisle prerusenia
 pouzitie casovacov pozri http://svetelektro.com/clanky/programujeme-avr-v-jazyku-c-4-cast-453.html
 pripadne avr_kniha.pdf (v download)  POZOR popis registrov je pre AtMega 8 a su tam rozdiely oproti AtMega 328
 POZERAJ  DATASHEEET AtMega 328 !!!

Timer1 bezi na 16MHz, pouzita preddelicka 256 s T= 1,6 E-5
1/2 periody je 625 pre f=50Hz, T=10ms (pre 60Hz, 520, 8,333 us)

uprava pre 2 komparatory (TIMSK1=0x06)
*/

#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT 2  //zero cross detect
#define gateA 9    //triac gate A
#define  gateB 10  // triac gate b

int i = 570;  // prepocitane pre 50Hz
int  hodAkan = 100;  // offset A a B pri starte
int  hodBkan = 500;
boolean aGateOn = false, bGateOn = false;

void setup() {

  // set up pins
  pinMode(DETECT, INPUT);     //zero cross detect
  digitalWrite(DETECT, HIGH); //enable pull-up resistor
  pinMode(gateA, OUTPUT);      //triac gate control
  pinMode(gateB, OUTPUT);      //triac gate control
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);  // ukaz, ze nieco robis !!!
  delay(4000);
  digitalWrite(13, LOW);
  delay(2000);

  // set up Timer1
  //(see ATMEGA 328 data sheet pg 134 for more details)
  //OCR1A = 100;      //initialize the comparator
  TIMSK1 = 0x06;    //prerusenie od komparatorov A a B, zakazane pri preteceni Timer 1
  TCCR1A = 0x00;    //timer control registers set for
  TCCR1B = 0x00;    //normal operation, timer disabled


  // set up zero crossing interrupt
  attachInterrupt(0, zeroCrossingInterrupt, RISING);
  //IRQ0 is pin 2. Call zeroCrossingInterrupt
  //on rising signal

}

// obsluzne rutiny preruseni

void zeroCrossingInterrupt() { //zero cross detect
  TCCR1B = 0x04; //start timer with divide by 256 input
  TCNT1 = 0;   //reset timer - count from zero
  OCR1A = hodAkan;  // hodnoty komparatorov
  OCR1B = hodBkan;
  aGateOn = true;  // gate triakov budeme zapinat
  bGateOn = true;
}

ISR(TIMER1_COMPA_vect) { //komparator A
  if (aGateOn) {
    digitalWrite(gateA, HIGH); //set triac gate to high
    aGateOn = false;
    OCR1A = hodAkan + 10;
  }
  else {
    digitalWrite(gateA, LOW);
  }
}

ISR(TIMER1_COMPB_vect) { //komparator B
  if (bGateOn) {
    digitalWrite(gateB, HIGH); //set triac gate to high
    bGateOn = false;
    OCR1B = hodBkan + 10;
  }
  else {
    digitalWrite(gateB, LOW);
  }
}

/*
ISR(TIMER1_OVF_vect) { //timer1 overflow
  digitalWrite(GATE, LOW); //turn off triac gate
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
}
*/

void loop() { // sample code to exercise the circuit

// pridavaj jas oboch kanalov s periodou 15 ms
  if (hodAkan < 60)  hodAkan = 570;
  else  hodAkan --;

  if (hodBkan < 60) hodBkan = 570;
  else hodBkan --;

  delay(15);

}
Odpovědět