Kod: Zaznacz cały
static uint8_t start_adc(uint8_t adc_channel)
{
ADMUX = _BV(REFS0) | _BV(ADLAR) | adc_channel;
ADCSRA = _BV(ADEN) | 0x04;
ADCSRA |= _BV(ADSC);
}
static uint16_t read_adc()
{
return ADCW;
}
Kod: Zaznacz cały
static uint8_t start_adc(uint8_t adc_channel)
{
ADMUX = _BV(REFS0) | _BV(ADLAR) | adc_channel;
ADCSRA = _BV(ADEN) | 0x04;
ADCSRA |= _BV(ADSC);
}
static uint16_t read_adc()
{
return ADCW;
}
Kod: Zaznacz cały
switch (Co_mierzyc)
{
case 0: //Pomiar UI_offset
UI_offset = read_adc(); //Wyjdzie z zakresu -511...511
start_adc(1);
break;
case 1: //Pomiar I1
I_1 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
I1_buffer = I1_buffer + (I_1 * I_1); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
start_adc(2);
break;
case 2: //Pomiar I2
I_2 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
I2_buffer = I2_buffer + (I_2 * I_2); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
start_adc(3);
break;
case 3: //Pomiar I3
I_3 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
I3_buffer = I3_buffer + (I_3 * I_3); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
start_adc(4);
break;
case 4: //Pomiar U1
U_1 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
U1_buffer = U1_buffer + (U_1 * U_1); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
P1_buffer = P1_buffer + (I_1 * U_1); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
start_adc(5);
break;
case 5: //Pomiar U2
U_2 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
U2_buffer = U2_buffer + (U_2 * U_2); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
P2_buffer = P2_buffer + (I_2 * U_2); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
start_adc(6);
break;
case 6: //Pomiar U3
U_3 = read_adc() - UI_offset; //Wyjdzie z zakresu -511...511
U3_buffer = U3_buffer + (U_3 * U_3); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
P3_buffer = P3_buffer + (I_3 * U_3); //Wyjdzie z zakresu -26112100...26112100 (25 bitów)
break;
case 7:
start_adc(0);
Licznik_100ms++;
if (Licznik_100ms >= 100) //Co 100ms
{
Licznik_100ms = 0;
I1_buffer_irq_main = I1_buffer;
I2_buffer_irq_main = I2_buffer;
I3_buffer_irq_main = I3_buffer;
U1_buffer_irq_main = U1_buffer;
U2_buffer_irq_main = U2_buffer;
U3_buffer_irq_main = U3_buffer;
P1_buffer_irq_main = P1_buffer;
P2_buffer_irq_main = P2_buffer;
P3_buffer_irq_main = P3_buffer;
New_meassurments = 1;
I1_buffer = 0;
I2_buffer = 0;
I3_buffer = 0;
U1_buffer = 0;
U2_buffer = 0;
U3_buffer = 0;
P1_buffer = 0;
P2_buffer = 0;
P3_buffer = 0;
}
break;
}
}
Przy jakimś dużym prądzie tak (niekoniecznie przy 6.5 A).
Kod: Zaznacz cały
void loop()
{
for (int p=0 ; p<pomiarow ; p++) // seria pomiarów wyprostowana i zapisana do tablicy (około 1s total)
{
licznik = 0;
msSTOPER_1 = micros();
for (int pom=0 ; pom<razy ; pom++) // pomiaru 100x
{
licznik++;
prad+=analogRead(0)-505.02; // offset wyniku
}
prad/=licznik; // uśrednianie wyników
pomiary[p] = sqrt(prad*prad); // prostowanie i zapis do tablicy
prad = 0; licznik = 0;
}
float pobor = 0;
for (int pom=0 ; pom<pomiarow ; pom++) // sumowanie zebranych pomiarów
{
pobor+=pomiary[pom];
}
Serial.print("A: "); Serial.print(pobor*korekta); Serial.println();
}