Arduino. Изучаем вместе

Всё о ЧПУ (CNC). Компоненты, станки, программы.
Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #51 KimIV » 09 фев 2018, 11:48

Импульсным я назвал режим мигания. Согласись, нагрузка другая, нежели б он постоянно светился :hi:

Отправлено спустя 1 минуту 31 секунду:
Кстати, ты чё тут пасёшься? Иди форум ломай, как договаривались :jokingly: :D
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
ROW

Arduino. Изучаем вместе

Сообщение #52 ROW » 09 фев 2018, 11:49

KimIV писал(а):Источник цитаты Импульсным я назвал режим мигания. Согласись, нагрузка другая, нежели б он постоянно светился
Да, но ток уж очень большой для импульса у такого СД.должен быть по идее около 10мА :hi: :pardon: Ладно не мешаю тебе ломать твою Ардуину дальше :hi: :good2:

Отправлено спустя 53 секунды:
Сообщение не по теме
KimIV писал(а):Источник цитаты Кстати, ты чё тут пасёшься? Иди форум ломай, как договаривались
ну если ты мне две моих печки заардуинишь," безвоздмездно т.е. даром!" то я тогда пошел ломать форум :D
Свернуть
Указую господам сенаторам, чтобы речь держать не по писаному, а своими словами, чтобы дурь была видна каждого.Петр I

Аватара пользователя
L0ki

Arduino. Изучаем вместе

Сообщение #53 L0ki » 09 фев 2018, 14:44

:wall: я конечно понимаю что у нас не принято читать инструкции :rofl:
Сообщение не по теме
любая инструкция на русском должна начинаться с фразы "ну что дурак, сломал ?" :rofl:
Свернуть

однако датшит на микроконтроллер почитать, чё - совсем не судьба, да ? :jokingly:

Аватара пользователя
Хорус

Arduino. Изучаем вместе

Сообщение #54 Хорус » 10 фев 2018, 22:18

А вот задачку подкинули.. Нужно сделать типа метеостанции - показывать скорость ветра и направление.
Датчик скорости ветра - энкодер, датчик направления - полнооборотный резистор
Вывод на двухстрочный дисплей.
Тут и аналоговая часть и цифровая, и ввод и вывод..
Попытка оптимизации оптимального может привести к неоптимальности результата

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #55 KimIV » 21 фев 2018, 11:30

ШИМ-Выходы

Всякие разные интересные книжки по ардуине утверждают, что некоторые цифровые выходы, а именно те, что с номерами 3, 5, 6, 9, 10 и 11, могут работать как ШИМ-Выходы. Всего таких выходов 6 и на плате они помечены символом переменки (тильда) перед номером.

Arduino. Изучаем вместе - 11_1.jpg


ШИМ (Широтно-Импульсная Модуляция, по англ. pulse-width modulation (PWM)) - это изменение скважности импульсов с целью управления электрической мощностью, подводимой к нагрузке. И этот процесс выглядит следующим образом.

Arduino. Изучаем вместе - 11_2.png


Многие нагрузки, многие потребители электрической энергии достаточно инерционны, чтобы не реагировать на отдельные импульсы, а воспринимать только некое их среднее воздействие. И этот факт во многом определяется частотой импульсов. То есть для нагревательной спирали например достаточно небольшой частоты следования импульсов, несколько Гц и даже реже. Для лампочки накаливания, чтобы глаз не замечал её мерцания, эту частоту уже желательно повысить до 70-80 Гц. А в устройствах, управляющих индуктивными нагрузками, эту частоту стараются вывести за пределы слышимости человеческого уха, чтобы они не "свистели", то есть 20 кГц и выше.

Для исследования ШИМ-Выходов прицепил к ним светодиоды, то есть собрал на макетке вот такую схему. Задействовал на будущее все 6 выходов.

Arduino. Изучаем вместе - 11_3.jpg
Arduino. Изучаем вместе - 11_4.jpg


Написал скетч для подачи сигнала с уровнем 127 на 3-ий выход.

Код: Выделить всё

int val=127;

void setup() {
  pinMode(3, OUTPUT);
}

void loop() {
  analogWrite(3, val);
}


К третьему выходу прицепил Осциллограф DSO068 и меняя значение переменной val и перезагружая код скетча в контроллер, сфотил осциллограммы.

Arduino. Изучаем вместе - 11_5.jpg
Arduino. Изучаем вместе - 11_6.jpg
Arduino. Изучаем вместе - 11_7.jpg
Arduino. Изучаем вместе - 11_8.jpg
Arduino. Изучаем вместе - 11_9.jpg
Arduino. Изучаем вместе - 11_10.jpg
Arduino. Изучаем вместе - 11_11.jpg
Arduino. Изучаем вместе - 11_12.jpg
Arduino. Изучаем вместе - 11_13.jpg


Длительность горизонтальной развёртки, как видно из осциллограмм установлена 0,5 мс/дел. Период следования импульсов 4 деления или 4 * 0,5 мс = 2 мс. Частота 1 / 2 мс = 1 / 0,002 сек = 500 Гц. В книжках пишут, что по умолчанию ШИМ-Выходы работают на частоте 488 Гц. Ну вот оно примерно так и есть :)

Любое ШИМ-управление имеет два параметра, определяемых конструкцией устройства:
1. Частота следования импульсов.
2. Разрядность. Это количество бит (бинарных, двоичных линий), участвующих в формировании ШИМ-сигнала. В ардуино по умолчанию задействовано 8 бит, то есть работает 8-ми разрядный ШИМ. Количество этих разрядов определяет количество значений, которые можно будет "положить" в переменную val (см. код скетча выше) и связь здесь следующая. Количество значений равно 2 в степени количество разрядов. В ардуино по умолчанию это будет 2 в степени 8 равно 256. Ну а так как одно из значений ноль, то максимум, который мы можем "положить" в переменную val - это 255. Таким образом, от 0 до 255 будет как раз 256 значений. При этом 0 будет задавать минимальный уровень мощности на ШИМ-Выходе, а 255 - максимальный.

Вот эти два параметра ШИМ целиком и полностью определяются конструкцией устройства. Это так называемая аппаратная поддержка. Но современные устройства стараются делать универсальными на столько, чтобы можно было программно изменять их аппаратные свойства. Например, в ардуино есть регистры, изменяя значения которых, можно изменять частоту и разрядность ШИМ. Круто правда? Кому интересно, в интернетах есть таблички значений регистров и частоты с разрядностью. Я их тырить не буду, просто дам ссылку на одну из них (листать вниз, в конец урока). А здесь словами упомяну, что разрядность ШИМ ардуино можно менять от 8 до 10, а частоту от 0,2 Гц (период 5 сек) до 62,5 кГц.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #56 KimIV » 21 фев 2018, 13:57

ШИМ-Выходы. Изменяем разрядность и частоту

Сначала на все ШИМ-Выходы подадим меандр, то есть импульсы с заполнением 50%. Для 8-разрядных ШИМ это делается подачей значения 127. Пишем скетч.

Код: Выделить всё

void setup() {
}

void loop() {
  analogWrite(3, 127);
  analogWrite(5, 127);
  analogWrite(6, 127);
  analogWrite(9, 127);
  analogWrite(10, 127);
  analogWrite(11, 127);
}


Загружаем его в контроллер и смотрим осциллографом сигналы на выходах 3, 5, 6, 9, 10 и 11. Все они одинаковы. Частота 500 Гц. И светодиоды светятся одинаково.

Arduino. Изучаем вместе - 12_1.jpg
Arduino. Изучаем вместе - 12_2.jpg


Для повышения универсальности и расширения базовых возможностей разработчики заложили в ардуино 3 таймера, каждый из которых управляет только парой из шести ШИМ-Выходов. Это означает, что одну пару ШИМ-выходов можно настроить на одну частоту, другую пару - на другую частоту и т.д. А кроме частот ещё и можно менять разрядность, а вместе с ней количество управляющих значений от 256 до 1024. Шикарно, просто шикарно! Теперь приведу таблицу соответствия таймеров, ШИМ-Выводов и управляющих регистров.

Arduino. Изучаем вместе - 12_3.png
Arduino. Изучаем вместе - 12_3.png (9.13 КБ) 220 просмотров


Предыдущий код скетча, а именно функцию setup() дополняю кодом для считывания первоначальных, умолчательных значений регистров. Загружаю скетч в контроллер и записываю значения в табличку MS Excel.

Arduino. Изучаем вместе - 12_4.png


Теперь добавляю команды изменения частоты нулевого таймера. Следует отметить, что в общем случае, то есть назависимо от номера таймера, регистр A управляет разрядностью, а регистр B - частотой. В данном случае я в регистр B нулевого таймера положил единичку вместо умолчательной тройки.

Arduino. Изучаем вместе - 12_5.png


И таким образом, изменил частоту следования импульсов на выходах 5 и 6, которая примерно составила 31 кГц. Вот фотография осциллограммы. Время развёртки там 5 мкс, остальное можете посчитать сами.

Arduino. Изучаем вместе - 12_6.jpg


А если в регистр B нулевого таймера отправить значение 2, то частота на выходах 5 и 6 станет равной примерно 4 кГц. Время развёртки на фото 50 мкс.

Arduino. Изучаем вместе - 12_7.jpg


И вот так балуясь со значениями регистров, постепенно заполняю свою табличку частот и разрядностей ШИМ. И в процессе экспериментов выявилось, что таймеры не равнозначны по функционалу. А это означает, что таймер нужно будет выбирать не только исходя из удобства использования тех или иных выходов, но и учитывая возможности конкретного таймера. В настоящий момент мне уже достоверно стало известно, что таймер 0 может работать только как 8-ми разрядный. Позже я приведу всю свою таблицу. А сейчас пока ещё одна фотка осциллограммы, снятой с выхода 9, то есть это таймер 1. Значение переменной val осталось неизменной и равно 127, а значения регистров следующие: TCCR1A=2, TCCR1B=2. Обратите внимание на скважность импульсов. Она равна примерно 25%. Это 9-ти разрядная ШИМ. То есть количество значений, которыми можно устанавливать значения мощности будет уже не 256, а 2 в степени 9 равно 512.

Arduino. Изучаем вместе - 12_8.jpg


Итак, дошёл до значения 3 в регистре TCCR1A таймера 1. Разрядность ШИМ установилась 10, а это 1024 (2 в степени 10) управляющих значений в переменной val. Также можно видеть, что светодиоды, присоединённые к выходам 9 и 10, светятся немного тусклее, чем остальные, управляемые 8-ми разрядными ШИМ.

Arduino. Изучаем вместе - 12_9.jpg
Arduino. Изучаем вместе - 12_10.jpg


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

Arduino. Изучаем вместе - 12_11.png


Важные выводы.
1. Таймеры 0 и 2, то есть выходы 3, 5, 6 и 11 могут работать только как 8-ми разрядные.
2. Разрядность 8, 9 или 10 можно устанавливать только у таймера 1 (выходы 9 и 10).
3. Таймер 1 может ещё работать как устройство задержки, то есть на выходах 9 и 10 можно поднимать высокий уровень через заданный интервал времени. И таким образом задерживать исполнение чего-либо относительно других выходов. И здесь выполняется именно задержка, то есть сначала на выходе низкий уровень, а потом он поднимается и держится бесконечно долго.

Arduino. Изучаем вместе - 12_12.png
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Pavel83

Arduino. Изучаем вместе

Сообщение #57 Pavel83 » 21 фев 2018, 15:28

Сообщение не по теме
KimIV, Я конечно до этого ни чего не понимал.(Скечи всякие) Ну а теперь подавно. :wall: Будим дальше посмотреть за развитием событий. Будет ли создан искусственный разум или нет :rofl:
Свернуть

Аватара пользователя
ROW

Arduino. Изучаем вместе

Сообщение #58 ROW » 21 фев 2018, 16:43

KimIV писал(а):Источник цитаты можно поднимать высокий уровень через заданный интервал времени. И таким образом задерживать исполнение чего-либо относительно других выходов.
максимально 5 сек? я правильно понимаю?
Указую господам сенаторам, чтобы речь держать не по писаному, а своими словами, чтобы дурь была видна каждого.Петр I

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #59 KimIV » 21 фев 2018, 17:08

ШИМ-Выходы. Практическое применение

Так... теперь давайте "помигаем светодиодами" :jokingly: :D Пишем скетч, в котором в функции setup() все ШИМ-выходы настраиваем на частоту 1 кГц, а также таймер 1 (выходы 9 и 10) делаем 10-ти разрядным.

Код: Выделить всё

void setup() {
  TCCR0A=3;
  TCCR0B=3;
  TCCR1A=3;
  TCCR1B=2;
  TCCR2A=1;
  TCCR2B=3;
}

void loop() {
  for (int i=0; i<=255; i++) {
    analogWrite(3, i);
    analogWrite(5, i);
    analogWrite(6, i);
    analogWrite(9, i);
    analogWrite(10, i);
    analogWrite(11, i);
    delay(3);
  }

  for (int i=255; i>=0; i--) {
    analogWrite(3, i);
    analogWrite(5, i);
    analogWrite(6, i);
    analogWrite(9, i);
    analogWrite(10, i);
    analogWrite(11, i);
    delay(3);
  }
}


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

https://youtu.be/IB0TAClWI2Y

Теперь комментарии, что собственно происходило. В функции loop() реализовано два цикла: один повышает значение переменной от 0 до 255, а второй снижает значение этой же переменной от 255 до 0. Таким образом у нас реализовано циклическое плавное повышение мощности от минимальной до максимальной и также плавное понижение мощности для 8-ми разрядных ШИМ-выходов. Значение этой циклически изменяющейся переменной мы подаём на все ШИМ-выходы, помня при этом, что выходы 9 и 10 у нас 10-ти разрядные, а все остальные выходы 8-ми разрядные. Именно поэтому на выходе 3 мы наблюдаем заполнение межимпульсного пространства от пустого до полного, а на выходе 9 всего лишь частичное.

Теперь увеличиваем счётчик циклов с 255 до 1023, то есть затачиваем их под 10-ти разрядную ШИМ. Кроме этого вводим дополнительную переменную k, в которую кладём значения счётчика i. И ограничиваем значение переменной k, чтобы оно не превышало 255. Затем значение переменной k отправляем на выходы 3, 5, 6 и 11, а переменную i на выходы 9 и 10. Вот код.

Код: Выделить всё

void setup() {
  TCCR0A=3;
  TCCR0B=3;
  TCCR1A=3;
  TCCR1B=2;
  TCCR2A=1;
  TCCR2B=3;
}

void loop() {
  for (int i=0; i<=1023; i++) {
    int k=i;
    if (k>255) k=255;
    analogWrite(3, k);
    analogWrite(5, k);
    analogWrite(6, k);
    analogWrite(9, i);
    analogWrite(10, i);
    analogWrite(11, k);
    delay(3);
  }

  for (int i=1023; i>=0; i--) {
    int k=i;
    if (k>255) k=255;
    analogWrite(3, k);
    analogWrite(5, k);
    analogWrite(6, k);
    analogWrite(9, i);
    analogWrite(10, i);
    analogWrite(11, k);
    delay(3);
  }
}


И видео осциллограмм на выходах 3 (8 бит) и 9 (10 бит).

https://youtu.be/WYqbEq-m9Ug
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #60 KimIV » 21 фев 2018, 17:12

ROW писал(а):Источник цитаты максимально 5 сек? я правильно понимаю?

Да, всё верно! Но учитывай, что даташиты я не читаю :jokingly: а исследую тыкая иголочкой и стукая молотком :D Другими словами, это то, что мне удалось найти. Вполне возможно, что там где-то есть и другие значения.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.


Вернуться в «Системы ЧПУ»