275d4331b707ea3584a475038a96813954a1e6ba
[HVPSU.git] / PSUTest.ino
1 #include <avr/io.h>
2 #include <avr/interrupt.h>
3
4 static const int CONTROLINPUT = A0;
5 static const int DETECT = 2;  // Zero cross detect input
6 static const int GATE = 3;    // TRIAC gate output
7 static const int VOLTSREAD = A1;
8 static const int CURRENTREAD = A2;
9 static const int ONDELAY = 50; // TRIAC delay loop
10
11 static int ControlInput = 0;
12 static volatile int CrossCount = 0;
13 static volatile int GateCount = 0;
14 static volatile int dump = 0;
15
16 void setup()
17 {
18     Serial.begin(115200);
19     Serial.println("Grahams Switch Mode PSUTest, "__DATE__" ("__TIME__")");
20
21     // Set up pins
22     pinMode(DETECT, INPUT);     // Zero cross detect
23     digitalWrite(DETECT, LOW); // Disable pull-up resistor
24     pinMode(GATE, OUTPUT);      // TRIAC gate control
25
26     // Set up Timer1
27     //  (see ATMEGA 328 data sheet pg 134 for more details)
28     OCR1A = 100;      // Initialize the comparator
29     TIMSK1 = 0x03;    // Enable comparator A and overflow interrupts
30     TCCR1A = 0x00;    // Timer control registers set for
31     TCCR1B = 0x00;    // Normal operation, timer disabled
32
33     // Set up zero crossing interrupt
34     
35     attachInterrupt(0, zeroCrossingInterrupt, FALLING);
36 }  
37
38 void zeroCrossingInterrupt()
39 {
40     TCCR1B=0x04; // Start timer with divide by 256 input
41     TCNT1 = 0;   // Reset timer - count from zero
42
43     CrossCount++;
44 }
45
46 ISR(TIMER1_COMPA_vect)
47 {
48     TCCR1B = 0x00;         // Disable timer stop unintended triggers
49
50     PORTD |= (1 << GATE);  // Set TRIAC gate to high
51
52     for (int count = 0; count < ONDELAY; count++)
53        dump=0;
54
55     PORTD &= ~(1 << GATE); // Turn off TRIAC gate
56
57     GateCount++;
58     
59     EIFR = 0x01;
60 }
61
62 void loop()
63 {
64     int Output;
65     int Volts = analogRead(VOLTSREAD);
66
67     ControlInput = ((1024 - analogRead(CONTROLINPUT))>>3) + 440;
68
69     Output = (ControlInput < 565)? ControlInput : 0;
70
71     OCR1A = Output;     // Set the compare register brightness desired.
72
73     Serial.print("ControlInput=" );
74     Serial.print(ControlInput);
75     Serial.print("\tVolts=" );
76     Serial.print(Volts);
77     Serial.print("\tCurrent=");
78     Serial.print(analogRead(CURRENTREAD));
79     Serial.print("\tCrossCount=" );
80     Serial.print(CrossCount);
81     Serial.print("\tOutput=" );
82     Serial.println(Output);
83
84     CrossCount = 0;
85     GateCount = 0;
86
87     delay(100);
88 }
89