Два встречно-параллельных светодиода.

netigors

✩✩✩✩✩✩✩
10 Янв 2023
9
0
К двум портам Ардуино встречно-параллельно подключены два светодиода. Подав 1 в один порт и 0 в другой можно зажечь тот или иной диод. При быстром переключении визуально будет гореть оба. ШИМом можно плавно зажигать-гасить любой диод.
А вот можно ли сделать так, чтобы один диод плавно загорался, а другой при этом плавно угасал?
2023-01-11_084744.jpg
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
@netigors,на обоих выводах один сигнал ШИМ,только один из них инвертированный.
 

netigors

✩✩✩✩✩✩✩
10 Янв 2023
9
0
А можно дать пример кода? Никак не пойму как это написать ((
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
Как я вижу: создаёшь две переменных, одну инкрементируешь и это значение в ШИМ1, вторую декрементируешь и это значение в ШИМ2. Потом задержка. И так по кругу.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Вполне достаточно одного пина. Один светодиода на пин и землю, а второй на пин и +.
Тогда Если на Пине HIGH, то гореть будет тот, где пин и земля, а если LOW, то тот, у которого пин и +. Подключать соотв. образом надо. Но работать будут только в паре.
 
  • Лойс +1
Реакции: te238s

poty

★★★★★★✩
19 Фев 2020
3,230
940
Смотрите при настройке ШИМ регистры COMnA, COMnB.
 
  • Лойс +1
Реакции: te238s

netigors

✩✩✩✩✩✩✩
10 Янв 2023
9
0
Как я вижу: создаёшь две переменных, одну инкрементируешь и это значение в ШИМ1, вторую декрементируешь и это значение в ШИМ2. Потом задержка. И так по кругу.
Проверил. В этом случае сначала плавно гаснет один, потом плавно загорается другой. т.е. одновременно они не горят.

Вполне достаточно одного пина. Один светодиода на пин и землю, а второй на пин и +.
Есть длинная гирлянда, леды в ней запаяны именно так - встречно-параллельно. Т.е. к контроллеру подводится только два провода. Можно мигать, включать их через один, включать все, плавно гасить. А хочется чтобы "четные" плавно загорались, а "нечетные" при этом плавно гасли.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
Вот здесь обсуждается вопрос инверсии ШИМа. Если что - тапками в меня не бросать, это всё Яндекс.
Проверил. В этом случае сначала плавно гаснет один, потом плавно загорается другой
А как проверял, можно код глянуть?
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,230
940
@netigors, если больше ничего делать не планируется в этот момент, то можно сымитировать программный ШИМ:
C++:
void setup() { 
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

#define period_pwm        1000
#define period_cps          10
#define num_effects          10

void loop() {
    unsigned long cps = millis();
    int duty = 0;
    boolean direction = true;
    int counter = num_effects;
 
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
 
    do {
        if (millis()-cps >= period_cps) {
            cps = millis();
            if (direction) { if (++duty >= period_pwm) direction = false; }
            else if (--duty <= 0) { direction = true; --counter; }
        }
        if (duty) {
            digitalWrite(10, HIGH);
            delayMicroseconds(duty);
            digitalWrite(10, LOW);
        }
        if(period_pwm-duty) {
            digitalWrite(11, HIGH);
            delayMicroseconds(period_pwm-duty);
            digitalWrite(11, LOW);
        }
    } while (counter);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
}
Но стоит заметить, что гирлянду из светодиодов напрямую к выводу Ардуино не подключить - не хватит тока.
 
Изменено:

netigors

✩✩✩✩✩✩✩
10 Янв 2023
9
0
@netigors, если больше ничего делать не планируется в этот момент, то можно сымитировать программный ШИМ:
...
Но стоит заметить, что гирлянду из светодиодов напрямую к выводу Ардуино не подключить - не хватит тока.
Спасибо, вечером попробую.
Да, с гирляндой и Ардуиной понятно. Сейчас пока эксперименты только на двух светодиодах.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Не в курсе точного строения ШИМ у Атмеги, но если она не умеет синхронизировать выходы ШИМ относительно друг друга на половину фазы, то только программным способом получится сделать.
Смысл такой, что два выхода имеют синхронизацию ШИМа друг относительно друга на половину фазы. И у каждого заполнение не более чем на 50% - это соответствует полному возможному свечению, т.к. по-другому не сделать.

На графике примерный вид таймингов:
1673535149355.png
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@Геннадий П, насколько я понял ТС хочет выполнить задачу не влезая в регистры (решение с прямым программированием регистров по исходной задаче было предложено @viktor1703), да и я указывал на нужные регистры.
Программный способ я привёл выше.
Если нужна дополнительная гибкость и нужно делать другую задачу в фоне, то можно сделать на прерываниях таймера. Для гирлянды переключение с частотой 100Гц - вполне нормальная частота, это предполагает всего 200 прерываний в секунду. Процедуры внутри прерываний элементарные, сильно грузить проц не будут.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Если использовать 2 пина , то какой смысл встречно их подключать, когда можно задать для каждого отдельно? Что то я упустил этот момент
 

netigors

✩✩✩✩✩✩✩
10 Янв 2023
9
0
@Геннадий П, насколько я понял ТС хочет выполнить задачу не влезая в регистры (решение с прямым программированием регистров по исходной задаче было предложено @viktor1703), да и я указывал на нужные регистры.
Не, я не против влезть в регистры, если это поможет в решении. Но пока мне не хватает знаний как это сделать.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,230
940
@netigors, так выше, в обсуждении, уже даже программа была приведена. Просто попробовать в ней разобраться. Или применить как есть.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
@netigors,
Решил посмотреть, как народ делает подобные вещи. Нашел ссылку https://mysku.club/blog/diy/89410.html
Там сделано на ATtiny13 и возможно новичку разобраться будет не совсем просто.
Из особенностей Автор объединяет выводы для увеличения токовой нагрузки (у тини выводов мало, поэтому объединяются только два, на 328 можно объединить больше). В статье отмечено, что это вообще то не правильно, но у него работает.
А метод моргания он использует простейший без таймеров, просто на задержке в цикле for.
C++:
static inline void charlieplex(uint8_t led_1_value, uint8_t led_2_value) {
    if (led_1_value > 0) enable_led_1();
    for (uint8_t i = 0; i < LED_MAX_VALUE; i++) {
        if (i == led_1_value) disable_leds();
    }
    
    if (led_2_value > 0) enable_led_2();
    for (uint8_t i = 0; i < LED_MAX_VALUE; i++) {
        if (i == led_2_value) disable_leds();
    }
}

Если же не объединять выводы, то можно использовать PWM, но на одном таймере. Если на первом, то
выводы 9 и 10
C++:
void loop() {

    for(int i = 0; i < 256; i++){

        analogWrite(9,i);

        bitSet(TCCR1A, COM1B0);

        analogWrite(10,i);

        delay(10);

    }

    for(int i = 255; i >= 0; i--){

        analogWrite(9,i);

        bitSet(TCCR1A, COM1B0);

        analogWrite(10,i);

        delay(10);

    }

}
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@netigors, попробуйте сейчас. Делал на телефоне, не добавил строку
cps = millis();
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
97
@Геннадий П,да,если 2 таймера использовать,то можно синхронизировать их до такта.
Можно и на одном 16 битном таймере,если есть 2 и более каналов сравнения.
В качестве силовой части применить Н-мост.