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
2oj kanalova fazova regulacia
Re: 2oj kanalova fazova regulacia
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"
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);
}