Получить определенную ШИМ волну на 2-х пинах

ffa
Offline
Зарегистрирован: 05.06.2017

Добрый день. Возможно ли получить такой ШИМ (см. фото) на двух пинах Arduino Uno?

Фото взято отсюда.

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

Думаю, тебя спасет простой инвертор. 

ffa
Offline
Зарегистрирован: 05.06.2017

И так можно будет?

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

с инвертором нижний сигнал будет точной зеркальной копией верхнего, со сдвигом в нескольно микро/нано секунд (от серии инвертора зависит)

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак это... Можно сразу подавать на инвертирующий элемент и прямопропускающий. Тогда задержка нивелируется.

ffa
Offline
Зарегистрирован: 05.06.2017

sadman41 пишет:

Дак это... Можно сразу подавать на инвертирующий элемент и прямопропускающий. Тогда задержка нивелируется.

Можно подробнее?

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

ffa пишет:

Добрый день. Возможно ли получить такой ШИМ (см. фото) на двух пинах Arduino Uno?

Фото взято отсюда.

Ребята, какие инвероторы, нафига? У нас же есть МК. Берем любой таймер с двумя каналами, например Timer1, один канал настраиваем на HIGH до совпадения, другой на LOW - получаем ровно то, что хочет ТС. Картинка из даташита на Амегу328 -

Каналы можно настроить и на разные счетчики ... получим картинку из сообщения #2

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

DetSimen, sadman41, никак не пойму, -вы что-то увидели на картинке особенное? Почему просто COM-битами не сделать инверсию PWM? Судя по второй картинке это должен быть обычный FAST-PWM

PS. вот и b707 Тем же вопросом озадачился

sadman41
Offline
Зарегистрирован: 19.10.2016

Я только по первому варианту мнение имею: первый луч получить с "И"/"ИЛИ", второй с "НЕ".  В принципе переключаться они за равное время должны, так что если запустить на них один и тот же ШИМ - должно быть зеркальное отражение. А дальше уж там куда надо запускать оба канала.

P.S. я не против таймеров, за Семёном тему продолжил ))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

тут и мне, начитавшемуся про таймера понятно что можно )))

 

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

dimax пишет:

DetSimen, sadman41, никак не пойму, -вы что-то увидели на картинке особенное? Почему просто COM-битами не сделать инверсию PWM? Судя по второй картинке это должен быть обычный FAST-PWM

Я - по причине благоприобретенного скудоумия даже не подумал про СОМ-биты.  Я даже не знаю чо это. 

ffa
Offline
Зарегистрирован: 05.06.2017

В ArduinoIDE такое можно реализовать? Обычным  analogWrite(), я так понимаю, дело не обойдется.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ffa, можно , неоднократно обсуждали. Вот например.

ffa
Offline
Зарегистрирован: 05.06.2017

dimax, спасибо за ссылку на обсуждение. ШИМ в примере работает на стандартной частоте Arduino?

UPD. Отвечу сам за себя: 488,28 Гц

#define analogWriteInvert(x) OCR0A = x;

void setup() 
{   
  DDRD |= 1<<PD6;
  TCCR0A |= (1<<COM0A0)|(1<<COM0A1);  
  OCR0A = 255;
}

void loop() 
{
  analogWriteInvert(0);
  delay(1000);
  analogWriteInvert(200);
  delay(1000);
  analogWriteInvert(250);
  delay(1000);
  analogWriteInvert(255);
  delay(1000);
}

 

ffa
Offline
Зарегистрирован: 05.06.2017

Погуглил еще немного... Чтобы получить ШИМ 15 ГЦ на 5 и 6 пине (таймер 0) надо выполнить:

TCCR0A = TCCR0A & 0xe0 | 3;
TCCR0B = TCCR0B & 0xe0 | 0x0d;

Далее инвертируем сигнал на одном из пинов и получаем код:

#define analogWriteInvert(x) OCR0A = x;

void setup() 
{
  TCCR0A = TCCR0A & 0xe0 | 3;
  TCCR0B = TCCR0B & 0xe0 | 0x0d; 
  DDRD |= 1<<PD6;
  TCCR0A |= (1<<COM0A0)|(1<<COM0A1);  
  OCR0A = 255;
}

void loop() 
{
  analogWriteInvert(0);
  delay(1000);
  analogWriteInvert(200);
  delay(1000);
  analogWriteInvert(250);
  delay(1000);
  analogWriteInvert(255);
  delay(1000);
}

Я все правильно сделал? Таймер 0 можно изменять?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Если не пользуетесь "временем Ардуино", то можно. Иначе всякие millis(), delay() поедут "в лес" да "по ягодицы".

ffa
Offline
Зарегистрирован: 05.06.2017

Arhat109-2, не успел написать :( Только что прочитал:

Цитата:

Tаймер 0 (Системное время, ШИМ 5 and 6)
Используется для хранения счетчика времени работы программы. Функция millis() возвращает число миллисекунд с момента запуска программы, используя ISR глобального приращения таймера 0. Таймер 0 также используется для реализации ШИМ на выводах 5 и 6.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Для организации низкочастотных ШИМов значительно удобней 16-и битные таймеры.