Главная

Главная

Сообщество

Сообщество

Форум

Форум

STM32

STM32

Электроника

Электроника

Raspberry Pi

Raspberry Pi

Уведомления
Очистить все

[Решено] замена макетной платы Arduino328 на ESP32WROWER-1B

Страница 9 / 9
Aveal MT
(@aveal)
Top level Admin

@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;
}

ОтветитьЦитата
Размещено : 03.09.2026 14:21
(@olga549)
Level 3

здравствуйте. вот это я знаю для чего. это привязка к скорости двигателя.

мне рассказали когда то когда я разбиралась для чего каждая строка.

// время задержки скорости двигателя 
  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 по пол минуты отображаются каждая картинка и тд.

 


ОтветитьЦитата
Создатель темы Размещено : 03.09.2026 20:12
(@olga549)
Level 3

проверила!!!!! ВОТ здорово получилось!!!!!! все как и просила!!!!! время можно добавить для управления висения картинок и больше не надо ничего. 


ОтветитьЦитата
Создатель темы Размещено : 03.09.2026 20:34
Aveal MT
(@aveal)
Top level Admin

Запись от: @aveal

Попробуйте здесь задавать нужное время в миллисекундах (задается в 2-х местах):

end_time = millis() + (random(10,20) * 1000);

Например, 20 с:

end_time = millis() + 20000;

Здесь попробуйте время настраивать.


ОтветитьЦитата
Размещено : 03.09.2026 20:42
(@olga549)
Level 3

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


ОтветитьЦитата
Создатель темы Размещено : 07.09.2026 21:54
Aveal MT
(@aveal)
Top level Admin

@olga549 Рад, что все работает! 🙂👍


ОтветитьЦитата
Размещено : 10.09.2026 12:12
Страница 9 / 9
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.