int trf_205634145_1;
const int volt_in_adc_channel_205634145_1= A5;
float K1_205634145_1= 1.015;
int Volt_in_ind_205634145_1= 0;
float Izm_var_205634145_1= 0;
int Z_mode_205634145_1= 1;
int V_kalibr_205634145_1= 0;
const int Ycount_205634145_1= 8;
const int NumMeasurements_205634145_1= 20; // Количество измерений для выборки
int TRAFO_205634145_1[NumMeasurements_205634145_1]; // Массив для хранения измеренных значений
void setup()
{
DDRC &= ~(1 << DDC0);
}
void loop()
{
//Плата:1
Check_in();
Ind();
//Zastavka_2();
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
}
void Check_in()
{
// Очистим предыдущие значения в массиве TRAFO_205634145_1
memset(TRAFO_205634145_1, 0, sizeof(TRAFO_205634145_1));
// Проведем 20 измерений напряжения
for (int i = 0; i < NumMeasurements_205634145_1; i++)
{
float Volt_in = Rms(volt_in_adc_channel_205634145_1);
float X2 = Volt_in / 10;
TRAFO_205634145_1
= round(X2);
}
// Дополнительные действия, если необходимо
}
float Rms(int Adc_ch)
{
float X2 = V2avg(Adc_ch);
float Rms_var = Izm(X2, Adc_ch);
switch (Adc_ch)
{
case volt_in_adc_channel_205634145_1:
Rms_var = Rms_var * K1_205634145_1;
break;
}
return round(Rms_var);
}
float V2avg(int Adc_ch)
{
unsigned long Sumv2 = 0;
int Nzamer = 0;
bool Fl_zero = false;
int Zerowaitcounter = 0;
int Waitcounter = 0;
int W;
// Ожидаем, пока напряжение станет не нулевым
while (Zerowaitcounter < 3)
{
W = analogRead(Adc_ch);
float V2 = W;
if (V2 == 0)
{
Zerowaitcounter++;
PORTD &= ~(1 << PD7);
delay(3);
PORTD |= (1 << PD6);
delay(1);
PORTD &= ~(1 << PD6);
delay(8);
}
else
{
PORTD |= (1 << PD7);
Zerowaitcounter = 0;
}
Waitcounter++;
if (Waitcounter > 300)
{
return 0; // Или другой код обработки ошибки
}
}
// Измеряем напряжение
while (!Fl_zero)
{
W = analogRead(Adc_ch);
float V2 = W;
if (V2 == 0)
{
Fl_zero = true;
}
else
{
Sumv2 += V2 * V2;
Nzamer++;
}
}
// Рассчитываем среднеквадратичное значение
float V2avg1 = static_cast<float>(Sumv2) / Nzamer;
return sqrt(V2avg1);
}
float Izm(float X, int Adc_ch)
{
X = X * 5000.0 / 1023.0; // Преобразование значения обратно в напряжение
X = X * 2.2;
int Y = round(X);
// Рассчитываем среднее значение для Ycount_205634145_1 измерений
long sumY = 0;
for (int i = 0; i < Ycount_205634145_1; i++)
{
sumY += Y;
}
X = static_cast<float>(sumY) / Ycount_205634145_1;
return round(X);
}
void Ind()
{
// Вычисляем среднее значение и выводим в терминал
int sum = 0;
int count = 0;
for (int i = 0; i < NumMeasurements_205634145_1; i++)
{
if (TRAFO_205634145_1 != 0)
{
sum += TRAFO_205634145_1;
count++;
}
}
if (count > 0)
{
float average = static_cast<float>(sum) / count;
trf_205634145_1 = average;
}
}
вопервых вот это блокирует код delay(3);
PORTD |= (1 << PD6);
delay(1);
PORTD &= ~(1 << PD6);
во вторых если вы запустите проект в ппротеусе вы увидети импульсы в отрицацельном полупериода
эти умульсы должны быть в положительной части тоже . Это с делайм делаю но тогда код тормозит.и для срабатывание этих импульсов в нужных местах есть свои условиия.Тоесть для импульса в положительном периудда одно услоовие а для отрицацеельноого полупериуда другое
а насчет кода незнаю но помоюму вы интернете врядлли найдети такой простой код для измерение переменного напрежени.и знаете он довольна точный если кто хочет может проверить
кому интересно и кто поможет могу предложить бесплатно гербер файл. Все отлично работает протестировано это по измерению наприжениее выволда информации на индикаторы тоесть говый проект с одним недостаткомю.компоненты деталей простые