ATTiny85 PWM для 4 светодиодов - PullRequest
0 голосов
/ 30 января 2019

Мне нужно управлять 4 отдельными светодиодами через ШИМ на ATTiny85.Я нашел много информации о том, как управлять 3 светодиодами.Но, по-видимому, чтобы управлять 4 с помощью ШИМ, вы должны действительно скрутить 85 в узлы.Есть ли более простой способ справиться с 4 светодиодами на 85, или было бы лучше перейти на 84?Если бы я пошел с 84, я бы столкнулся с теми же кирпичными стенами, что и с 85?

Я нашел этот код для управления 4 на 85, но он выше моего уровня квалификации.Кто-нибудь видит какие-либо проблемы с этим?

/* Four PWM Outputs */

// ATtiny85 outputs
const int Red = 0;
const int Green = 1;
const int Blue = 4;
const int White = 3;
volatile uint8_t* Port[] = {&OCR0A, &OCR0B, &OCR1A, &OCR1B};

void setup() {
  pinMode(Red, OUTPUT);
  pinMode(Green, OUTPUT);
  pinMode(Blue, OUTPUT);
  pinMode(White, OUTPUT);
  // Configure counter/timer0 for fast PWM on PB0 and PB1
  TCCR0A = 3<<COM0A0 | 3<<COM0B0 | 3<<WGM00;
  TCCR0B = 0<<WGM02 | 3<<CS00; // Optional; already set
  // Configure counter/timer1 for fast PWM on PB4
  TCCR1 = 1<<CTC1 | 1<<PWM1A | 3<<COM1A0 | 7<<CS10;
  GTCCR = 1<<PWM1B | 3<<COM1B0;
  // Interrupts on OC1A match and overflow
  TIMSK = TIMSK | 1<<OCIE1A | 1<<TOIE1;
}

ISR(TIMER1_COMPA_vect) {
  if (!bitRead(TIFR,TOV1)) bitSet(PORTB, White);
}

ISR(TIMER1_OVF_vect) {
  bitClear(PORTB, White);
}

// Sets colour Red=0 Green=1 Blue=2 White=3
// to specified intensity 0 (off) to 255 (max)
void SetColour (int colour, int intensity) {
  *Port[colour] = 255 - intensity;
}  

void loop() {
  for (int i=-255; i <= 254; i++) {
    OCR0A = abs(i);
    OCR0B = 255-abs(i);
    OCR1A = abs(i);
    OCR1B = 255-abs(i);
    delay(10);
  }
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

enter image description here

Вместо использования встроенного ШИМ вам нужно будет выполнить ШИМ вручную, установив таймер, а затем каждый раз меняя вход / выход и ВКЛ / ВЫКЛ каждого из выводов.таймер истекает.

+-----+----------+----------+----------+
| LED |    A     |    B     |    C     |
+-----+----------+----------+----------+
|   1 | OUTPUT 1 | INPUT    | OUTPUT 0 |
|   2 | OUTPUT 0 | INPUT    | OUTPUT 1 |
|   3 | INPUT    | OUTPUT 1 | OUTPUT 0 |
|   4 | INPUT    | OUTPUT 0 | OUTPUT 1 |
+-----+----------+----------+----------+

Обновите или прокомментируйте, если хотите узнать больше об этой стратегии.

0 голосов
/ 30 января 2019

Простая стратегия состоит в том, чтобы объединить 4 светодиода на один вывод ШИМ.Это позволит независимо контролировать яркость каждого светодиода на ATTINY, используя всего 5 контактов.

Так, например, вы можете соединить все 4 катода вместе и подключить их к одному выводу ШИМ.Затем вы подключаете каждый из 4 анодов к другому выводу ввода-вывода.

В любой данный момент только один из анодов находится в режиме вывода - остальные остаются плавающими.Означает, что активен не более 1 одиночного светодиода, а его яркость регулируется рабочим циклом ШИМ.

Затем можно использовать функцию ISR переполнения для таймера ШИМ, чтобы активировать следующий светодиод в последовательности после каждого цикла ШИМ.,Вы также обновляете соответствие ШИМ, чтобы отразить яркость следующего светодиода.

Если вы поворачиваете светодиоды быстро (быстрее, чем, скажем, 60 раз в секунду), то визуально все они выглядят так, как будто они включены на нужной яркости.В конце концов, ШИМ просто слишком быстро мигает светодиодом, чтобы видеть его, поэтому мы просто добавляем к нему второе измерение.

Один недостаток: поскольку в любой момент горит только один светодиод, максимальное значениеЯркость теоретически будет 1/4 от того, что было бы, если бы вы включили все светодиоды независимо друг от друга.На практике это, вероятно, проблема, так как ATTINY ограничен тем, какой ток он может пропустить, несмотря на то, что все его контакты одновременно, если вы пытались зажечь все светодиоды одновременно.

Один совет: при настройке таймера ШИМ, сделайте так, чтобы светодиод выключался в начале цикла и включался в середине.Это даст ISR время для перехода к следующему светодиоду, пока все светодиоды выключены.Это лучше, потому что легко увидеть светодиод, который включен, когда он не должен быть, но не так легко увидеть светодиод, который выключен, когда он должен быть включен.

Одно предложение: я буду за это гореть, но при этом вы можете пропустить любые резисторы, ограничивающие ток, так как каждый светодиод включен только в течение не более 1/4 времени.Это даст вам больше яркости, а также сделает так, чтобы вы могли набирать рабочий цикл ШИМ, чтобы у вас было больше времени в начале каждого цикла, чтобы перейти к следующему индикатору.

Я успешно использовал эту технику много раз, и даже смог объединить 6 светодиодов RGB (по три канала каждый) в одну микросхему, и она прекрасно работает.

Обновите вопрос, если у вас есть какие-либо вопросы о деталях!

...