3ee15de49fd496b6f6255edb990ae19c8bd9fea0
[HVPSU.git] / PSUTest.cpp
1 #include <arduino.h>
2 #include <avr/io.h>
3 #include <avr/interrupt.h>
4
5 static const unsigned int CONTROLINPUT = A0;
6 static const unsigned int DETECT = 2;   // Zero cross detect input
7 static const unsigned int GATE = 3; // TRIAC gate output
8 static const unsigned int CURRENTREAD = A3;
9 static const unsigned int ONDELAY = 50; // TRIAC delay loop
10
11 static unsigned int ControlInput = 0;
12 static volatile unsigned int CrossCount = 0;
13 static volatile unsigned int GateCount = 0;
14 static volatile unsigned int dump = 0;
15
16 static const unsigned int HISTORYSIZE = 128;
17 static unsigned int History[HISTORYSIZE];
18 static unsigned int HistoryLast = 0;
19 static unsigned int HistorySum = 0;
20
21 void setup ()
22 {
23     puts ("Grahams Switch Mode PSUTest, " __DATE__ " (" __TIME__ ")");
24
25     // Set up pins
26     DDRD &= ~(1 << DETECT);
27     PORTD &= ~(1 << DETECT);
28     DDRD |= (1 << GATE);
29
30     // Set up Timer1
31     //  (see ATMEGA 328 data sheet pg 134 for more details)
32     OCR1A = 100;                // Initialize the comparator
33     TIMSK1 = 0x03;              // Enable comparator A and overflow interrupts
34     TCCR1A = 0x00;              // Timer control registers set for
35     TCCR1B = 0x00;              // Normal operation, timer disabled
36
37     // Set up zero crossing interrupt
38 /*
39     ISC01       ISC00   Description
40     0       0       The low level of INT0 generates an interrupt request.
41     0       1       Any logical change on INT0 generates an interrupt request.
42     1       0       The falling edge of INT0 generates an interrupt request.
43     1       1       The rising edge of INT0 generates an interrupt request.
44 */
45     EIMSK |= (1 << INT0);       // Enable INT0
46     EICRA |= 1 << ISC01 | 0 << ISC00;   // Trigger INT0 on falling edge
47
48     sei ();                     // Enable Global Interrupt
49
50     memset (&History, 0, sizeof (History));
51 }
52
53 ISR (INT0_vect)
54 {
55     TCCR1B = 0x04;              // Start timer with divide by 256 input
56     TCNT1 = 0;                  // Reset timer - count from zero
57
58     CrossCount++;
59 }
60
61 ISR (TIMER1_COMPA_vect)
62 {
63     TCCR1B = 0x00;              // Disable timer stop unintended triggers
64
65     PORTD |= (1 << GATE);       // Set TRIAC gate to high
66
67     for (int count = 0; count < ONDELAY; count++)
68         dump = 0;
69
70     PORTD &= ~(1 << GATE);      // Turn off TRIAC gate
71
72     GateCount++;
73
74     EIFR = 0x01;
75 }
76
77 void UARTReceive (char chrCharacter)
78 {
79 }
80
81 void loop ()
82 {
83     int Output;
84     int Current = analogRead (CURRENTREAD);
85
86     History[HistoryLast++] = Current;
87     HistorySum += Current;
88     if (HistoryLast >= HISTORYSIZE)
89         HistoryLast = 0;
90     HistorySum -= History[HistoryLast];
91
92     ControlInput = ((1024 - analogRead (CONTROLINPUT)) >> 3) + 440;
93
94     Output = (ControlInput < 565) ? ControlInput : 0;
95
96     OCR1A = Output;             // Set the compare register brightness desired.
97
98     int CurrentValue = ((int) HistorySum - 4470) >> 3;
99
100     printf ("ControlInput=%4d Current=%4d HistorySum=%5d Average=%4d CurrentValue=%5d CrossCount=%3d Output=%3d\n",
101             ControlInput, Current, HistorySum, HistorySum >> 7, CurrentValue, CrossCount, Output);
102
103     CrossCount = 0;
104     GateCount = 0;
105
106     delay (10);
107 }