Четырёхканальный ШИМ

MacMillan
Offline
Зарегистрирован: 25.10.2016

Здравствуйте!

На днях возникла необходимость управления мощными светодиодами с помощью ШИМа. 4 светодиода. 4 потенциометра или 4 энкодера. Арудино Мега 2560 или Нано. Дефолтная частота в 490 Гц не катит, ибо это мерцание может доканать до офтальмолога. Обычно я выбираю частоту за 5000 Гц и выше (чаще просто 30 000). Я по началу подумал, что крайне удобная библиотека PWM.h - мой 15-ти минутный выход из ситуации, потому как уже делал проект подсветки с регулятором на энкодере. Но не тут то было. Эта библиотека наотрез откзывается работать числом каналов больше двух. Тоесть 2 выхода и всё. И на Нано и на Меге, при чём автор указывает способность работы на всех PWM выходах.

Дальше я решил идти по пути программирования таймеров, но эта штука - просто тёмный лес.

Хоть кто нибудь, может подсказать как подойти к этой задаче лучше? Возможно ли 4 ШИМ канала с одинаковой частотой свыше 5000 Гц на Меге или Нано?

Заранее большое спасибо за ответы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MacMillan пишет:

Дефолтная частота в 490 Гц не катит, ибо это мерцание может доканать до офтальмолога.

У Вас уникальные глаза. У всех остальных людей пульсации с частотой свыше 300Гц никакого влияния на мозг не оказывают. При такой частоте (300+) они не норммируются никакимии ГОСТами ибо просто никак на организм не влияют (пруф. ГОСТ Р 54945-2012 раздел 1, там же в ГОСТе есть ссылка на справочную литературу по этому поводу).

MacMillan пишет:

Обычно я выбираю частоту за 5000 Гц и выше (чаще просто 30 000).

Ваше право.

MacMillan пишет:

программирования таймеров, но эта штука - просто тёмный лес.

Хоть кто нибудь, может подсказать как подойти к этой задаче лучше? 

Лучший (и единственный) способ - идти в "тёмный лес" и пугать там леших с кикиморами. Других путей нет. Разве что кто-то успел это сделать до Вас и Вам повезёт найти нахаляву готове решение.

b707
Offline
Зарегистрирован: 26.05.2017

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

Насколько я понимаю, вам не нужно 4 независмых канала с разной частотой? - тогда управление любым числом цифровых пинов можно организовать на одном общем таймере.  Всего-то с нужной частотой по прерыванию таймера вызывать свою функцию и писать в нужные пины LOW и HIGH

MacMillan
Offline
Зарегистрирован: 25.10.2016

b707 пишет:

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

Насколько я понимаю, вам не нужно 4 независмых канала с разной частотой? - тогда управление любым числом цифровых пинов можно организовать на одном общем таймере.  Всего-то с нужной частотой по прерыванию таймера вызывать свою функцию и писать в нужные пины LOW и HIGH

Нужно 4 канала с одинаковой частотой, но каждый канал имеет разную скважность (в зависимости от оборотов потенциометра/энкодера). Я пробовал на Меге все PWM выходы с библиотекой - работают нормально только 2 из них, ещё 2 подключеных работают крайне необычно - простейший Fade в смеси с PWM.h  заработал на 11 и 12 пине, на 10-9 он мигает, на 44-46 - вообще не включается, остальные пины так же тупят. Я по началу думал, что Мега порченая, но перепроверил все ШИМ выходы без библиотеки - работают.

Но я как понимаю - на одном таймере только 2 выхода?

MacMillan
Offline
Зарегистрирован: 25.10.2016

Евгений, ради эксперемента попробуй включить мощный светодиод в качестве личного освещения часов на 5-8, с частотой 490 Гц и скважностью где нибудь 40-50%. Глаза будут уставать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MacMillan пишет:

Евгений, ради эксперемента попробуй включить мощный светодиод в качестве личного освещения часов на 5-8, с частотой 490 Гц и скважностью где нибудь 40-50%. Глаза будут уставать.

Внушить себе можно всё, что угодно.

- Алё, это радио? Почему Вы перестали передавать про магнитные бури? Мы не знаем когда себя плохо чувствовать!

Впрочем, могу помочь немного разобраться с тёмным лесом: я как-то писал как делать ШИМ произвольной частоты на таймерах - http://arduino.ru/forum/programmirovanie/shim-proizvolnogo-razresheniya-na-unonano-328

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Можно. На ногах 3,9,10,11 для нано. У камня это PB3 PD3 и PB1 и 2. Только на этих. Если кто не напишет раньше , утром скину черновик... Пояснить и комментировать не буду. Я не Гугль и Вики.

b707
Offline
Зарегистрирован: 26.05.2017

MacMillan пишет:

Нужно 4 канала с одинаковой частотой, но каждый канал имеет разную скважность (в зависимости от оборотов потенциометра/энкодера).

ну да, я так и понял. В этом случае на аппаратном ШИМе можно сделать на всех PWM выходах, кроме управляемых нулевым таймером (на нано их 4, как уже написал Дракула).

  А можно вообще "вручную" - все на одном таймере - вообще на всех цифровых. Правда вручную большой частоты не получить, но несколько КГц, думаю, без проблем.

Гриша
Offline
Зарегистрирован: 27.04.2014

MacMillan пишет:

Евгений, ради эксперемента попробуй включить мощный светодиод в качестве личного освещения часов на 5-8, с частотой 490 Гц и скважностью где нибудь 40-50%. Глаза будут уставать.

есть выход вообще без пульсаций - управлять источником напряжения (вернее тока) и диод дольше проживет. О таком варианте не думали? Там ШИМ вообще через фильтр в ЦАП превращается.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:
Можно. На ногах 3,9,10,11 для нано. У камня это PB3 PD3 и PB1 и 2. Только на этих. Если кто не напишет раньше , утром скину черновик... Пояснить и комментировать не буду. Я не Гугль и Вики.

Думаю, не стоит. На 9 и 10 есть готовое решение по ссылке. что я дал ТС. На 3 и 11 сам сделает по образу и подобию. Должно же что-то остаться для самостоятельной работы.

MacMillan
Offline
Зарегистрирован: 25.10.2016

Вроде получилось...)

inline void pwmInit(const int8_t bitRate = 16) {
  noInterrupts();
  TCCR1A = bit(COM1A1) |  bit(COM1B1) | bit(WGM11);
  TCCR1B = bit(WGM13) | bit(WGM12) | bit(CS10);
  TCCR2A = bit(COM2A1) |  bit(COM2B1) | bit(WGM11);
  TCCR2B = bit(WGM22) | bit(WGM22) | bit(CS10);
  TCCR1C = TCNT1 = OCR1A = OCR1B = TIMSK1 = TIFR1 = 0;
  TCNT2 = OCR1B = OCR1A = TIMSK1 = TIFR1 = 0;
  ICR1 = (1u << bitRate) - 1u;
  interrupts();
}
inline void pwmWrite9(const uint16_t v) { DDRB |= bit(PB1); OCR1A = v; }
inline void pwmWrite10(const uint16_t v) { DDRB |= bit(PB2); OCR1B = v; }
inline void pwmWrite3(const uint16_t v) { DDRB |= bit(PD3); OCR2B = v; }
inline void pwmWrite11(const uint16_t v) { DDRB |= bit(PB3); OCR2A = v; }

void setup(void) {
  pwmInit(8);
}

void loop(void) {
  int i, step = 1;
  for (i = step; i < 255; i += step) {
    pwmWrite9(i);
    pwmWrite10(255 - i);
    pwmWrite3(i);
    pwmWrite11(255 - i);
    delay(10);
  }
  for (i -= step; i > 0; i -= step) {
    pwmWrite9(i);
    pwmWrite10(255 - i);
    pwmWrite3(i);
    pwmWrite11(255 - i);
    delay(10);
  }
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

пока не все получилось.. но близко.

штоп было 31КГц нужно  таймеры запустить в фазо-корректный режим, без делителя, а ТАЙМЕР 1 ограничить не 16 битами, а 8, то есть записать в ICR1  255, а не 0xffff, как в примере.

тогда частота будет 16МГц / 512 = 31КГц.

Следующая возможная частота это 8Кгц (я предполагаю, что на обоих таймерах желательно выставить одинаковую, так как на 16битном можно выставить точно почти любую частоту, нас ограничивает 8-ми битный).

Для 8 КГц выбираем fastPWM и делитель на 8. И нужно быть внимательным к константам, в примере ошибка и в них тоже.

Читайте же ДатаШит, мать его! Там примитивным языком все написано,для ниггеров из американского ПТУ!

 

MacMillan
Offline
Зарегистрирован: 25.10.2016

wdrakula пишет:

Читайте же ДатаШит, мать его! Там примитивным языком все написано,для ниггеров из американского ПТУ!

Да был я в этом 660-ти страничном журнале для краснодипломных выпусников физмата со стажем программирования в 20 лет) Тот кто его писал явно не умеет структурировать правильно информацию - WGM13 в даташите встречается 41 раз. И как понять в каком из сорока одном месте это несёт верный смысл для меня - не знаю. Автору даташита стоило просто сделать таблицу с режимами, какие биты включить, а какие выключить, что бы получить тот или иной режим, а в место этого получается 660 страниц каши, из которой только одна треть несёт информацию понятную для нигеров из ПТУ (или таких как я) :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Даташиты обычно ниггерами из буржуазных ПТУ и пишуца. Технический писатель у них называется. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

нужно быть внимательным к константам, в примере ошибка и в них тоже.

Речь о моём примере? Подскажите ошибку, пожалуйста, что мне всё с микроскопом не перепроверять.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Речь о моём примере? Подскажите ошибку, пожалуйста, что мне всё с микроскопом не перепроверять.

Нет, конечно!  У ТС в его примере.