ARDUINO Всем привет.У меня проблема с программой то-есть с кодом для атмеге328.В коде нужны таймеры.желательно апаратные таймеры

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
Всем привет.У меня проблема с программой то-есть с кодом для атмеге328.В коде нужны таймеры.желательно апаратные таймеры
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,724
481
@ELIK_1985, интересно, каких откровений вы тут ожидаете? Апаратные таймеры МК атмега328 описаны в даташите. Как с ними работать - гуглите, информации полно. Зачем её ещё здесь дублировать?
 

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
я немогу настроить и запустить программу с таймером

да вы правы информации много и все разные но ни одно непомогло уже месец ишу как решить проблему не получяеться
 

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
даже и в форумах ишу помоши но пока тишина.В основном все горят что они бес сильны

а что так трудно помочь.Я так думаю советы довать легче чем помочь
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,724
481
@ELIK_1985, чтобы получить знания, нужно прилагать некие усилия, работать с информацией. Это нужно вам, больше никому. Хотите разобраться - читайте раздел, там всё есть, ссылку я вам дал. С чего вы решили, что здесь кто-то будет читать бесплатные лекции?
 

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
Я это знаю и понимаю все отлично.Но есть некие моменты которые мне непонятны.

Я програмнно измеряю переменое напрежение без каких либо датчиков толька через делители.В коде програмно нахажу пересечение нулей.нужно задать условие при определеной значение включился таймер отсчитав 5 миллисекунд включил порт(условно6) и через 2 милли секунды выключился порт6 это нужно для управление семистором.Могу показать код
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
@ELIK_1985, судя по описанию, обыкновенный диммер. Зачем для этого аппаратные таймеры? Примеров кода диммера в инете десятки.

Пока я вижу что вы не умеете выражать свои мысли и правильно задавать вопросы. Полтора десятка сообщений, а вы так и не сказали, в чем у вас проблема с таймерами.
 

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
Оформи код соответствующим тэгом, см. Правила
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);


во вторых если вы запустите проект в ппротеусе вы увидети импульсы в отрицацельном полупериода

Screenshot 2024-02-09 115433.png

эти умульсы должны быть в положительной части тоже . Это с делайм делаю но тогда код тормозит.и для срабатывание этих импульсов в нужных местах есть свои условиия.Тоесть для импульса в положительном периудда одно услоовие а для отрицацеельноого полупериуда другое

а насчет кода незнаю но помоюму вы интернете врядлли найдети такой простой код для измерение переменного напрежени.и знаете он довольна точный если кто хочет может проверить

кому интересно и кто поможет могу предложить бесплатно гербер файл. Все отлично работает протестировано это по измерению наприжениее выволда информации на индикаторы тоесть говый проект с одним недостаткомю.компоненты деталей простые
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
2,898
862
Что это за код такой? Это явно не программист писал. Машинная генерация? Fl-Prog, что ли?
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
помоюму вы интернете врядлли найдети такой простой код для измерение переменного напрежени
Ничего "простого" в этом коде нет, напротив код излишне переусложнен. Что сложного выполнить несколько измерений подряд и потом взять от этого среднее? Но зачем это делать в типе float, если АДС у вас целочисленное?! Так у вас получился медленный кривой код, который к тому же раздувает программу и требует вчетверо больше памяти, чем работа с типом инт.
 

bort707

★★★★★★✩
21 Сен 2020
2,898
862
есть желаюшие мне помочь?
Сомневаюсь. Вашу программу невозможно привести в порядок изменением в паре строк, работа с точными интервалами невозможна с использованием delay(), код надо переписывать полностью с использованием миллис. К тому же код сгенерированный Флпрог плохо поддаётся редактированию.
В итоге я бы сказал что программу проще не исправлять, а выкинуть и написать заново.
Попробуйте создать заказ в платном разделе, может кто-то захочет помочь. Это должно стоить 10- 15 тыс, думаю
 

ELIK_1985

✩✩✩✩✩✩✩
9 Фев 2024
0
0
помогите с таймерами для управление семистором.

добавить в код

код ненадо изменять

не надо изменять код проста нужно почь с таймерами

Screenshot 2024-02-09 134900.png

сама программа отлично работает
 

xxx333000

✩✩✩✩✩✩✩
27 Фев 2024
0
0
@ELIK_1985,

Я вижу это как то так:

C++:
boolean flag;
uint32_t tmr1;

void setup() {
}

void loop() {

  if ("условие при определеной значение") {flag = true; tmr1 = millis();}      // "включился таймер"

  if (flag && millis() - tmr1 >= 5 ) {                                         //  "отсчитав 5 миллисекунд"
    tmr1 = millis();
    flag = false;
    digitalWrite(6, HIGH);                                                     // "включил порт(условно6)"
    delay(2);                                                                  // "и через 2 милли секунды"
    digitalWrite(6, LOW);                                                      // "выключился порт6"
  }
}
 
Изменено: