@olga549 Вообще значение вот тут ни на что не влияет, оно в динамике пересчитывается потом...
unsigned long end_time = 0;
Попробуйте здесь задавать нужное время в миллисекундах (задается в 2-х местах):
end_time = millis() + (random(10,20) * 1000);
Например, 20 с:
end_time = millis() + 20000;
Режимы:
void loop()
{
LS = 0;
if (flag == 0)
{
if (counter < (N_O_S)) {sector_time--;}
if (counter > (N_O_S)) {sector_time++;}
}
if (counter == N_O_S) {flag = 1;}
if ((counter < (N_O_S - TOL)) || (counter > (N_O_S + TOL))) {flag = 0;}
if (end_time < millis())
{
end_time = millis() + (random(10,20) * 1000);
flag=0;
mode++;
if (mode == 10) {mode = 1;}
}
counter = 0;
if (offset > (N_O_S - 1)) {offset = 0;}
EnableSPI();
while (LS == 0)
{
if (counter < N_O_S) {pointer = counter;} else {pointer = N_O_S - 1;}
pointer = pointer + offset;
if (pointer > (N_O_S - 1)) {pointer = pointer - N_O_S;}
int sector_index = pointer;
if (sector_index == 0)
{
test_counter++;
}
int led_index = test_counter % 20;
if ((mode == 7) || (mode == 8) || (mode == 9))
{
led_index = 19 - led_index;
}
pointer = pointer * 15;
int bit_index = 2 * led_index;
int color_bit_offset = 0;
switch (mode)
{
case 5:
case 8:
color_bit_offset = 40;
break;
case 6:
case 9:
color_bit_offset = 80;
break;
}
int cached_bit_1 = GetBit(&test_array[0], bit_index + color_bit_offset);
int cached_bit_2 = GetBit(&test_array[0], bit_index + 1 + color_bit_offset);
SetBit(&test_array[0], bit_index + color_bit_offset);
SetBit(&test_array[0], bit_index + 1 + color_bit_offset);
digitalWrite(latchPin, LOW);
switch (mode)
{
case 1:
for (int l=0; l<15; l++){SendRecSPI(bild_01[pointer + l]);}
break;
case 2:
for (int l=0; l<15; l++){SendRecSPI(bild_02[pointer + l]);}
break;
case 3:
for (int l=0; l<15; l++){SendRecSPI(bild_03[pointer + l]);}
break;
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
for (int l=0; l<15; l++){SendRecSPI(test_array[l]);}
break;
}
digitalWrite(latchPin, HIGH);
if (cached_bit_1 == 0) ClearBit(&test_array[0], bit_index + color_bit_offset);
if (cached_bit_2 == 0) ClearBit(&test_array[0], bit_index + 1 + color_bit_offset);
counter++;
unsigned long end_micros = micros() + sector_time;
while ((micros() < end_micros) && (LS == 0)) {}
}
DisableSPI();
offset = offset + v_offset;
}
здравствуйте. вот это я знаю для чего. это привязка к скорости двигателя.
мне рассказали когда то когда я разбиралась для чего каждая строка.
// время задержки скорости двигателя
for (byte a=0; a<50; a++)
{
while (digitalRead(LS_Pin) == HIGH) {delayMicroseconds(1);}
delay(20);
}
digitalWrite(debug_pin, LOW);
end_time = millis() + (random(10,20) * 1000);
mode = 1;
//подготовить прерывание
attachInterrupt(digitalPinToInterrupt(LS_Pin), Erkenne_Flanke, FALLING);
}
это для корректировки скорости мотора. если под рукой нет подходящего мотора который был в проекте использован, то скорость мотора можно подобрать. большая скорость мотора, тогда уменьшаешь время на сектор что бы не двоило или не запаздывало, а если мотор с меньшими оборотами, то время на сектор надо увеличивать.вот расчет и пояснения принципа. Я ПРОВЕРЯЛА. ЕСЛИ НЕ ИЗМЕНЯТЬ ЭТИ ПАРАМЕТРЫ, А УВЕЛИЧИВАТЬ СКОРОСТЬ МОТОРА. ИЗОБРАЖЕНИЕ НАЧИНАЕТ ДВОИТСЯ ИЛИ НЕ ПОЛНЫЙ КАДР ПОЛУЧАЕТСЯ ПРИ МАЛОЙ СКОРОСТИ МОТОРА. ВОТ КАК ЭТО РАБОТАЕТ......
Расчет таймингов POV
Для того, чтобы в определенном положении POV отображать соответствующие данные, мы должны очень точно рассчитать все тайминги и задержки. К счастью, контроллер содержит встроенный таймер, который мы и будем использовать.
Частота вращения мотора = 3800 об/мин
Найдем частоту вращения в секунду 3800/60 = 63.3333 об/сек.
1 полный круг = 1/63.3333 = 0.015789 секунд
1° вращения = 0.015789/360 = 0.000043859 секунд
Частота выполнения инструкции 40 МГц/4 = 10 МГц
Инструкций на 1° вращения = 43.86 мкс/10000000 = 438.6
Получается 438 инструкций на каждый 1° вращения
Т.о. зная частоту вращения мотора, мы можем найти время для поворота на 1°. У нас получилось значение 43.86 мкс, это будет интервал вызова прерывания микроконтроллера, по которому будет обновляться состояние светодиодов. Для получения полной картинки, нам нужно будет выводить для каждого из 360 градусов свое состояние светодиодов. ВОТ ДЛЯ ЭТОГО И НАПИСАНЫ СТРОКИ. прошу прощения я ошиблась указав на не ту строку. вот в этой строке
#define v_offset 1 //скорость вращения отображаемого изображения
изначально стояло 3 и рядом коменты на немецком. я перевела и вот что получила. если 3, то картинки вращаются МЕДЛЕННО вокруг оси. если 0, то БЫСТРО. а вот время сколько будет висеть каждая картинка до смены на следующую я такой функции не нашла. вот исходник настоящий!! ни чьей рукой не тронутый. оригинал!!!!! вот что бы хотелось добавить ЕЩЕ!!!. какую нибудь функцию что бы время смены картинок менять ( например поставила в строке 1000 в миллисекундах ВСЕ картинки весят по минуте, разделять на у каждой свое время отображения не надо!!!! сменила на 500 по пол минуты отображаются каждая картинка и тд.
проверила!!!!! ВОТ здорово получилось!!!!!! все как и просила!!!!! время можно добавить для управления висения картинок и больше не надо ничего.
Попробуйте здесь задавать нужное время в миллисекундах (задается в 2-х местах):
end_time = millis() + (random(10,20) * 1000);Например, 20 с:
end_time = millis() + 20000;
Здесь попробуйте время настраивать.
здравствуйте. вы как всегда правы!!! эти строки отвечают за время отображения картинки. спасибо за помощь. вот теперь точно все !!!!! замучила я вас наверное с вопросами да расспросами. спасибо огромное еще раз за помощь!!!!!!!!