Arduino изменить частоту шим
Содержание:
- Введение
- Внешний AREF
- Принцип действия «классического» двухтранзисторного мультивибратора
- Материалы
- Как сделать диммер на Ардуино своими руками
- Описание пинов платы
- Arduino Due
- Где применяется генератор частоты на Ардуино
- Загрузка библиотек и запуск SD card на Arduino
- Характеристики
- Создание платы
- Как преодолеть аппаратные ограничения
- Почему analogRead() возвращает значение от 0 до 1023?
- 8 или 32 бита
- Исходный код программы
Введение
Arduino — это аппаратная платформа с открытым исходным кодом. Есть два элемента в названии: платы и программное обеспечение. Только платы от официального производителя arduino.cc можно назвать «Arduino». Название является товарным знаком. Всё начиналось с открытого исходного кода, но по мере того, как популярность программного обеспечения Arduino (IDE — Integrated Development Environment) стала расти, оно было расширено для поддержки многих других плат. Эти устройства более правильно называть «совместимые Arduino».
Arduino IDE — это кросс-платформенное приложение, которое обеспечивает отправную точку для всех проектов, связанных с Arduino.
Эта серия плат нацелена на широкую аудиторию — как профессиональных инженеров, так и юзеров, которые вообще ничего не понимают в контроллерах, но готовы с удовольствием сделать что-нибудь этакое электронное. И если вы относитесь к числу последних, не бойтесь купить одну из плат, чтобы сделать свой первый проект.
На стороне программного обеспечения есть «ядро» и «IDE». Ядром является библиотека C ++, называемая «ядром Arduino», которая уникальна для каждого типа процессора. Эта (обширная) библиотека позволяет использовать общие функции, такие как digitalRead() или digitalWrite(), для работы со множеством разных архитектур.
На аппаратной стороне трудно охватить все возможные варианты в сжатом виде
Таким образом, здесь основное внимание уделяется таким популярным вариантам, как: Uno, Mega, ESP8266, Zero и MKR. Некоторые из них мы упоминаем ниже
Внешний AREF
Внешний AREF тот, куда направляется внешний источник опорного напряжения на плате Arduino. Это может происходить от регулируемого источника питания, или, если вам нужно 3,3 В, вы можете получить его от 3,3 В вывода Arduino. Если вы используете внешний источник питания, обязательно подключите GND к выводу GND Arduino. Или, если вы используете источник 3,3 В Arduno — просто установите перемычку с контакта 3,3 В на контакт AREF.
Чтобы активировать внешний AREF, используйте следующее в void setup ():
analogReference(EXTERNAL); // использование AREF для опорного напряжения
Это устанавливает опорное напряжение на то, что вы подключили к пину AREF, что, конечно, будет иметь напряжение между 1,1В и напряжением работы платы.
Очень важное примечание — при использовании внешнего опорного напряжения вы должны установить analogReference() на EXTERNAL (внешнее), прежде чем использовать analogRead(). Это предотвратит вас от короткого замыкания активного внутреннего опорного напряжения и вывода AREF, которое может повредить микроконтроллер на плате
При необходимости вы можете вернуться к рабочему напряжению платы для AREF (то есть — вернуться в нормальное состояние) с помощью следующей команды:
analogReference(DEFAULT);
Как нам продемонстрировать внешний AREF в работе? Используя AREF 3,3 В, следующий скетч измеряет напряжение от A0 и отображает процентная доля всего AREF и рассчитанного напряжения:
#include "LiquidCrystal.h" LiquidCrystal lcd(8,9,4,5,6,7); int analoginput = 0; // our analog pin int analogamount = 0; // stores incoming value float percentage = 0; // used to store our percentage value float voltage =0; // used to store voltage value void setup() { lcd.begin(16, 2); analogReference(EXTERNAL); // use AREF for reference voltage } void loop() { lcd.clear(); analogamount=analogRead(analoginput); percentage=(analogamount/1024.00)*100; voltage=analogamount*3.222; // in millivolts lcd.setCursor(0,0); lcd.print("% of AREF: "); lcd.print(percentage,2); lcd.setCursor(0,1); lcd.print("A0 (mV): "); lcd.println(voltage,2); delay(250); }
Результаты скетча показаны на видео выше.
Принцип действия «классического» двухтранзисторного мультивибратора
Схема может находиться в одном из двух нестабильных состояний и периодически переходит из одного в другое и обратно. Фаза перехода очень короткая относительно длительности нахождения в состояниях благодаря глубокой положительной обратной связи, охватывающей два каскада усиления.
Пусть в состоянии 1 Q1 закрыт, Q2 открыт и насыщен, при этом C1 быстро заряжается током открытого базового перехода Q2 через R1 и Q2 почти до напряжения питания, после чего при полностью заряженном C1 через R1 ток прекращается, напряжение на C1 равно (ток базы Q2)·R2, а на коллекторе Q1 — напряжению питания.
При этом напряжение на коллекторе Q2 невелико (равно падению напряжения на насыщенном транзисторе).
C2, заряженный ранее в предыдущем состоянии 2 (полярность по схеме), медленно разряжается через открытый Q2 и R3. При этом напряжение на базе Q1 отрицательно и этим напряжением он удерживается в закрытом состоянии. Запертое состояние Q1 сохраняется до того, пока C2 не перезарядится через R3 и напряжение на базе Q1 не достигнет порога его отпирания (около +0,6 В). При этом Q1 начинает приоткрываться, напряжение его коллектора снижается, что вызывает начало запирания Q2, напряжение коллектора Q2 начинает увеличиваться, что через конденсатор C2 ещё больше открывает Q1. В результате в схеме развивается лавинообразный регенеративный процесс, приводящий к тому, что Q1 переходит в открытое насыщенное состояние, а Q2 наоборот полностью запирается.
Далее колебательные процессы в схеме периодически повторяются.
Длительности нахождения транзисторов в закрытом состоянии определяются постоянными времени для Q2 — T2 = С1·R2, для Q1 — T1 = C2·R3.
Номиналы R1 и R4 выбираются намного меньшие, чем R3 и R2, чтобы зарядка конденсаторов через R1 и R4 была быстрее, чем разрядка через R3 и R2. Чем больше будет время зарядки конденсаторов, тем положительней окажутся фронты импульсов. Но отношения R3/R1 и R2/R4 не должны быть больше, чем коэффициенты усиления соответствующих транзисторов, иначе транзисторы не будут открываться полностью.
Частота мультивибратора
Длительность одной из двух частей периода равна
t=ln2⋅RC{\displaystyle t=\ln 2\cdot RC}
Длительность периода из двух частей равна:
T=t1+t2=ln2⋅R2C1+ln2⋅R3C2{\displaystyle T=t_{1}+t_{2}=\ln 2\cdot R_{2}C_{1}+\ln 2\cdot R_{3}C_{2}}
f=1T=1ln2⋅(R2C1+R3C2)≈10.693⋅(R2C1+R3C2){\displaystyle f={\frac {1}{T}}={\frac {1}{\ln 2\cdot (R_{2}C_{1}+R_{3}C_{2})}}\approx {\frac {1}{0.693\cdot (R_{2}C_{1}+R_{3}C_{2})}}},
где
- f — частота в Гц,
- R2 и R3 — величины резисторов в омах,
- C1 и C2 — величины конденсаторов в фарадах,
- T — длительность периода (в данном случае, сумма двух частей периода).
В особом случае, когда
- t1 = t2 (50 % цикл),
- R2 = R3,
- C1 = C2,
f=1T=1ln2⋅2RC≈0.721RC{\displaystyle f={\frac {1}{T}}={\frac {1}{\ln 2\cdot 2RC}}\approx {\frac {0.721}{RC}}}
Материалы
Вариант 1
Для удобства следует разбить список покупок на несколько основных пунктов, в зависимости от того, для чего мы будем использовать те или иные инструменты. Так, вам будет необходимо собрать:
- Детектор для отслеживания пересечений с нулем. Для этой части проекта потребуется H11AA11 с парой резисторов на 10кОм, а также мостовой выпрямитель на 400 Вольт и ещё пара резисторов на 30 кОм. Для удобства стоит прикупить и 1 разъем, а также стабилизатор на 5.1 Вольт.
- Драйвер для лампы. Здесь достаточно будет простого светодиода, а также MOC3021 с резистором 220 Ом (можно и больше), а еще резистором на 470 Ом и 1 кОм, и один симистор, подойдет версия TIC Также можете докупить ещё один разъем.
- Вспомогательные элементы. Конечно, при спайке не обойтись без проводов и куска текстолита 6 на 3 см.
Когда вы соберёте все необходимые элементы, придёт время спайки, поэтому, помимо выше перечисленного, потребуются также паяльник и канифоль с припайкой. Плату вы можете расчертить и сделать самостоятельно или воспользоваться специальным принтером, если есть в наличии. Варианты расположения дорожек можно найти на нашем сайте или спроектировать всё самостоятельно, по вашему желанию.
Вариант 2
Для нашего второго альтернативного варианта нам понадобятся:
1x — 330 Ом резистор
2x — 33К резистора
1x — 22К резистор
1x- 220 Ом резистор
4x — 1N4508 диоды
1x — 1N4007 диоды
1x — Диод Zener 10V.4W
1x — Конденсатор 2.2uF / 63V
1x — Конденсатор 220nF / 275V
1x — Arduino / Ардуино
1x — Оптрон: 4N35
1x — МОП-транзистор: IRF830A
1x — Лампа: 100 Вт
1x — Питание 230 В
1x — Розетка
1x — Паяльная плата и паяльный комплект
Как сделать диммер на Ардуино своими руками
Вариант 1
Ардуино диммер 220 В проектируется таким образом, чтобы в него входили простые синусоиды из розеток, а выходили уже обрезанные. Таким образом, он не будет пропускать часть синусоид, в зависимости от размера которой будет изменяться и усреднённое напряжение на устройстве. Поэтому, с помощью изменения промежутков с нулевым напряжением возможно регулировать ток на выходе, с помощью того самого симистра.
Важно подобрать подходящий, ведь они различаются по размеру корпуса и принимаемому току, например, более крупные пропускают напряжение в 800 вольт, эквивалентное 30 квт
У нас будет два варианта исполнения. Теоретический и конкретный альтернативный, уж, простите, за аналогии.
В первом варианте, чтобы проект поддавался контролю, потребуется пакет рассыпух, а также пара резисторов и несколько оптопар. Большая часть компонентов, полный список которых мы опишем ниже, продается за копейки в любом магазине радиотехники, поэтому вам не составит труда собрать всё, что необходимо.
Чтобы было удобнее подключать Аrduino симистор, потребуется несколько клемм, но можно обойтись и без них. А для сборки всей схемы необходимо спроектировать и сделать макетную плату. Удобнее всего использовать 3-Д принтер, но можно создать её и старым химическим способом.
В итоге у нас получится Аrduino диммер 220 В, который будет разрывать соответствующую сеть, а контролировать мы всё будем с помощью оптопары, для чего нам потребуется стандартная мигалка. Таким образом, выйдет, что сама плата останется развязанной с помощью сетевого напряжения, что поспособствует безопасности инженера и дальнейших пользователей.
Но для своевременного открытия симистра устройству потребуется узнавать, когда напряжение будет проходить через ноль, для чего и пригодится вторая оптопара, которую мы подключим к противоположной стороне.
С помощью такой незамысловатой схемы мы получим девайс, который будет отправлять нам сигнал каждый раз, когда напряжение проходит через 0 в сети, а управление симистром будет осуществляться с помощью верхней оптопары.
О том, какой алгоритм работы потребуется прописать программой, – мы расскажем чуть ниже, но давайте сначала разберёмся, какие инструменты и составляющие вам потребуются, чтобы собрать аппаратную часть проекта. Как уже упоминалось, все их вы сможете купить на рынке или в магазине радиотехники без затруднений.
Вариант 2
Во втором варианте мы настроим яркость лампы, подключенной к цепи последовательным портом. Яркость можно изменить в соответствии с командами, которые мы предоставляем для последовательного порта. Мы будем использовать эти конкретные команды в этом проекте Ардуино диммера:
- 0 для ВЫКЛЮЧЕНИЯ
- 1 для яркости 25%
- 2 для яркости 50%
- 3 для яркости 75%
- 4 для 100% яркости
Мы разработаем схему диммера с импульсной волной (PWM), которая будет использовать IRF830A в диодном мосте, который используется для управления напряжением на лампе с импульсной модуляцией (PWM). Напряжение источника питания для управления затвором подается с напряжением на полевом транзисторе с полевым эффектом из оксида металла (MOSFET).
Описание пинов платы
Микроконтроллер имеет 14 цифровых пинов, они могут быть использованы, как вход или выход. Из них 6 могут выдавать ШИМ-сигнал. Они нужны для регулировки мощности в нагрузке и других функций.
Пин ардуино | Адресация в скетче | Специальное назначение | ШИМ |
---|---|---|---|
Цифровой пин 0 | RX | ||
Цифровой пин 1 | 1 | TX | |
Цифровой пин 2 | 2 | Вход для прерываний | |
Цифровой пин 3 | 3 | Вход для прерываний | ШИМ |
Цифровой пин 4 | 4 | ||
Цифровой пин 5 | 5 | ШИМ | |
Цифровой пин 6 | 6 | ШИМ | |
Цифровой пин 7 | 7 | ||
Цифровой пин 8 | 8 | ||
Цифровой пин 9 | 9 | ШИМ | |
Цифровой пин 10 | 10 | SPI (SS) | ШИМ |
Цифровой пин 11 | 11 | SPI (MOSI) | ШИМ |
Цифровой пин 12 | 12 | SPI (MISO) | |
Цифровой пин 13 | 13 | SPI (SCK) К выходу дополнительно подсоединен встроенный светодиод |
Вызов ШИМ-сигнала осуществляется через команду AnalogWrite (номер ножки, значение от 0 до 255). Для работы с аналоговыми датчиками присутствует 6 аналоговых входов/выходов.
Пин | Адресация в скетче | Специальное назначение |
---|---|---|
Аналоговый пин A0 | A0 или 14 | |
Аналоговый пин A1 | A1 или 15 | |
Аналоговый пин A2 | A2 или 16 | |
Аналоговый пин A3 | A3 или 17 | |
Аналоговый пин A4 | A4 или 18 | I2C (SCA) |
Аналоговый пин A5 | A5 или 19 | I2C (SCL) |
Их тоже можно использовать, как цифровые.
Аналоговый сигнал обрабатывается 10 битным аналогово-цифровым преобразователем (АЦП), а при чтении микроконтроллер выдаёт численное значение от 0 до 1024. Это равно максимальному значению, которое можно записать в 10 битах. Каждый из выводов способен выдать постоянный ток до 40 мА.
Принципиальная схема платы выглядит так (нажмите для увеличения):
Arduino Due
Arduino Due – одна из самых популярных плат.
Работает на 32-битном процессоре с частотой 84мГц.
На борту установлен AT91SAM3X8E контроллер, во многом превосходящий все вышеперечисленные платы. 512 кб постоянной памяти, 96 кб оперативной. Имеются 54 цифровых пина, 12 из которых могут использовать ШИМ. Также есть пара 12-битных цифро-аналоговых преобразователей: они позволяют микропроцессору выдавать звук без дополнительных расширений.
Кстати, распиновку всех плат Ардуино вы можете найти на нашем сайте в этом разделе.
Arduino Due и Arduino Mega 2560 очень похожи друг на друга, поэтому может показаться, что и шилды для этих плат взаимозаменяемые, но на самом деле это не так. Логические уровни на Mega 5-вольтовые, тогда как на Due – 3,3 вольта. Будьте осторожны с расширениями плат, в противном случае Due безвозвратно сгорит.
Платы разные, но с большей частью задач они справляются все. Лишь экзотические проекты требуют наличие определенной фичи. Тогда придется окунуться поподробнее в спецификацию контроллера и Datasheet. Разумеется, и о программировании придется немножко почитать.
Где применяется генератор частоты на Ардуино
Роль частотного генератора в мире электроники – настройка и определение технической характеристики тактов сигнальных волн. Другое применение – для регулировки узлов и элементов приемников, передающих радио-колебания.
Кроме того, генератор импульсов, построенный на Ардуино, используют как модулятор или источник питания для устройств, которые обладают измерительными свойствами.
Частотные измерители могут изменять выходные сигналы с определенным скачком.
Поэтому устройства с такими свойствами играют немаловажную роль в конструировании электронных приборов. Перечислим другие значительные функции Ардуино-генератора:
- Поиск расположения мест, где можно проложить кабели и трубопроводы. Причем поисковая работа проводится на дальних расстояниях.
- Поисковые работы для находки мультичастотной технологии с помощью процесса излучения сразу нескольких частотных волн.
- Создание аналоговых синтезаторов. Синтезирующие устройства применяются для сборки электронных устройств без использования множества блоков. Все сигнальные волны мелькают между разными блоками строго по стандартам.
Загрузка библиотек и запуск SD card на Arduino
Чтобы подсоединиться к SD карте и свободно передавать на неё данные, потребуется написать немало кода, однако здесь нам поможет встроенная библиотека SD.
Библиотеку по работе с картами памяти можно найти на официальном сайте производителя микроконтроллера: https://www.arduino.cc/en/Reference/SD
Открыв подменю «образцов», найдите заготовку «cardinfo», именно её мы не будем использовать в качестве прописной функции при загрузке информации. Скетч пригодится лишь для проверки, опознаётся ли дополнительная память на устройстве. Проверяйте chipSelect, учитывая, что подключение идёт через 10 пин.
#include <SD.h> const int chipSelect = 4; void setup() { Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. } Serial.print(“Initializing SD card…”); pinMode(10, OUTPUT); //iniot SD card if (!SD.begin(chipSelect)) { Serial.println(“Card failed, or not present”); return; } Serial.println(“card initialized.”); } void loop() { String dataString = “”; // read three sensors and append to the string for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += “,”; } } // open the file. File dataFile = SD.open(“data.txt”, FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); } // if the file isn’t open else { Serial.println(“error opening data.txt”); } }
Если всё прошло удачно, то на экран выведется информация о типе файловой системы и объёме вашей SD-карты. Если же производитель подсунул вам не лучший продукт, могут возникнуть ошибки. Здесь проще купить новую флешку, чем бороться с ошибками файловой системы, изначально заложенными в девайс.
Когда вы получите отклик от системы, можете начинать подгружать библиотеки и нужные вам файлы. SD-карта полностью работает и подключена, однако не забудьте протестировать несколько типов файловых систем, дабы подобрать оптимальный вариант по скорости и потреблению ресурсов. В каждом конкретном случае эти параметры будут разными, поэтому не бойтесь экспериментировать.
Характеристики
В основе платы лежит процессор ATmega 328. Кроме него на плате находится модуль USB для связи с компьютером и прошивки. Этот модуль называется «USB-TTL преобразователь». На фирменных платах Arduino Uno для этой целей используется дополнительный микроконтроллер ATmega16U2.
Характеристики | Arduino Uno R3 |
---|---|
Микроконтроллер | ATmega328 |
Рабочее напряжение | 5В |
Напряжение питания (рекомендуемое) | 7-12В |
Напряжение питания (предельное) | 6-20В |
Цифровые входы/выходы | 14 (из них 6 могут использоваться в качестве ШИМ-выходов) |
Аналоговые входы | 6 |
Максимальный ток одного вывода | 40 мА |
Максимальный выходной ток вывода 3.3V | 50 мА |
Flash-память | 32 КБ (ATmega328) из которых 0.5 КБ используются загрузчиком |
SRAM | 2 КБ (ATmega328) |
EEPROM | 1 КБ (ATmega328) |
Тактовая частота | 16 МГц |
Особенность этого чипа заключается в аппаратной поддержке USB, что позволяет организовывать связь без дополнительных преобразователей. В то время как ATmega328 не поддерживает такой функции, поэтому 16u2 выступает в роли преобразователя данных из USB в последовательный порт для МК AVR. В него залита программа для выполнения этой задачи.
Однако так происходит не всегда: в более мелких платах, таких как Arduino Nano, используют преобразователи уровней на базе различных микросхем, например FT232, CP21XX, Ch340g и подобных. Это решение является более дешевым и не требует прошивки дополнительного связывающего контроллера, как описано выше.
Внимание! Не всё так однозначно с DCcduino UNO r3 на ch340g. В ней как раз и использован более дешевый, чем в оригинале, вариант преобразователя USB-TTL.. На плате есть выход 3.3 В, он нужен для подключения периферии и некоторых датчиков, его пропускная способность по току равна 50 мА
На плате есть выход 3.3 В, он нужен для подключения периферии и некоторых датчиков, его пропускная способность по току равна 50 мА.
ATmega328 работает на частоте 16 МГц. Она фиксирована кварцевым резонатором, который вы можете, по желанию, заменить, тем самым ускорив работу Uno r3.
Важно! После замены кварцевого резонатора функции, связанные со временем, такие как Delay, не будут соответствовать введенным значениям. Это функция задержки времени, по умолчанию её аргументом является требуемое время задержки в мс
Функция прописана в библиотеках Ардуино, с учетом стандартной тактовой частоты в 16 МГц. Поэтому после замены кварца заданное время не будет соответствовать написанному. Для этого нужно либо подбирать опытным путем и устанавливать зависимости, либо править файлы библиотек.
Создание платы
Мы рассмотрим самый бюджетный вариант – вытравку платы в соляном растворе, но прежде на неё необходимо будет наклеить проект, который вы можете создать в программе по желанию. Дальнейшая сборка не несёт никаких трудностей и секретов, необходимо будет воспользоваться панельками под оптроны и мостовые выпрямители. Также, при написании текста, для разметки элемента, его стоит делать зеркальным, так как при ЛУТе, отпечатавшийся рисунок примет правильный вид на меде, и перенесется так, что вы без проблем прочитаете все необходимые данные.
Хорошим выбором станет TIC206, который выдаст добротных 6 ампер. Но здесь стоит учесть, что те проводники, которые установлены на плате, просто не выдержат такую силу тока, поэтому дополнительно стоит припаять провод на проводник симистора у разъемов, а вторую часть – к другим разъемам.
Также, при наличии оптрона H11AA11, мостовой выпрямитель можно не использовать, ведь в нем уже имеются два не параллельных диода, а также возможность работы с переменными токами. Совместимость с выводами 4N25 позволяет просто вставить его к припою с двумя перемычками, находящимися между 5 и 7 резистором, на нашей схеме.
Во втором варианте схема будет выглядеть так:
Как преодолеть аппаратные ограничения
Большинство распространённых плат имеют аналогичные характеристики, среди них:
- Uno;
- Nano;
- Pro mini;
- и подобные.
Но с развитием ваших навыков разработки в этой среде появляется проблема нехватки мощности и быстродействия этой платформы. Первым шагом для преодоления ограничений является использование языка C AVR.
С его помощью вы ускорите на порядок скорость обращения к портам, частоту ШИМ и размер кода. Если вам и этого недостаточно, то вы можете воспользоваться мощными моделями с аналогичным подходом к разработке. Для этого подойдёт плата Arduino Mega2560. Еще более мощная – модель Due. В противном случае вам стоит ознакомиться с разновидностями одноплатных компьютеров и STM микроконтроллеров.
Ардуино Uno R3 – отличная плата для большинства проектов, которая служит для изучения устройств цифровой электроники.
Почему analogRead() возвращает значение от 0 до 1023?
Это связано с разрешением АЦП. Разрешение (в рамках этой статьи) — это степень, в которой что-то может быть представлено численно. Чем выше разрешение, тем выше точность, с которой что-то можно представить. Мы измеряем разрешение в терминах количества бит разрешения.
Например, 1-битное разрешение позволит использовать только два (два в степени одного) значения — ноль и единицу. 2-битное разрешение позволило бы получить четыре (два в степени двух) значения — ноль, один, два и три. Если мы попытаемся измерить диапазон в пять вольт с двухбитным разрешением, а измеренное напряжение будет равно четырем вольтам, наш АЦП вернет числовое значение 3 — при падении четырех вольт между 3,75 и 5В. Проще представить это с изображением выше.
Таким образом, в нашем примере АЦП с 2-битным разрешением может представлять напряжение только с четырьмя возможными результирующими значениями. Если входное напряжение падает между 0 и 1,25, АЦП возвращает цифру 0; если напряжение падает между 1,25 и 2,5, АЦП возвращает числовое значение 1. И так далее. С диапазоном АЦП нашего Arduino от 0 до 1023 — у нас есть 1024 возможных значения — или от 2 до 10, поэтому у наших Arduino есть АЦП с 10-битным разрешением.
8 или 32 бита
Основные сражения происходят между 8 и 32 битными платами.
8-бит: Uno, Nano, and Mega
32-бит: Zero, MKR, ESP8266 и ESP32
В отличие от ранних видеоигровых консолей, выбор процессора не так прост, и не ограничивается только выбором количества бит. В целом, 8-битные процессоры предлагают базовые возможности при потреблении более низкой энергии.
Более простые архитектуры означают, что регистры прямого программирования, как правило, относительно легки. 32-разрядные процессоры предлагают более высокие тактовые частоты вместе с большим количеством ОЗУ, ПЗУ и последовательной периферии. Их архитектура может усложнить программирование. К счастью, такие структуры, как библиотека Arduino и CircuitPython, зарывают большую часть этой сложности.
Выбор микропроцессора только потому, что он является 8-битным или 32-битным, может быть, скажем так, довольно «близоруким»
Поэтому важно подумать о том, как вы планируете использовать его
Допустим, вы уже в курсе, как обращаться с проводами, контактами и микросхемами. Поэтому разберемся с самыми популярными платами на сегодняшний день.
Исходный код программы
Сначала мы произведем подключение библиотек для работы с ЖК дисплеем и датчиком температуры (dht), а затем инициализируем контакты для подключения ЖК дисплея, датчика температуры и вентилятора.
Затем инициализируем все остальные нужные нам вещи в секции setup. А затем в секции loop мы будем использовать dht-функции для считывания значений с датчика температуры, извлекать из этих значений температуру, переводить ее в температуру по шкале Цельсия и отображать ее значение на ЖК дисплее.
После этого мы будем сравнивать значение температуры с заранее установленными нами температурными порогами (выше приведенная в тексте статьи таблица) и исходя из результатов сравнения будем генерировать соответствующее значение ШИМ на выходном контакте, к которому подключен транзистор, управляющий скоростью вращения вентилятора.
Для генерации ШИМ мы будем использовать функцию analogWrite(pin, PWM value). Мы будем использовать все 8 бит. Значение ШИМ будет эквивалентно аналоговому значения напряжения. То есть, к примеру, если мы хотим сгенерировать ШИМ с коэффициентом заполнения 20%, то мы в эту функцию (analogWrite) должны передать значение 255/5.
Далее приведен полный текст программы.
Arduino
#include<dht.h> // подключаем библиотеку для работы с датчиком
#include<LiquidCrystal.h> // подключаем библиотеку для работы с ЖК дисплеем
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define dht_dpin 12
dht DHT;
#define pwm 9
byte degree = // символ градуса для отображения на ЖК дисплее
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
lcd.begin(16, 2);
lcd.createChar(1, degree);
lcd.clear();
lcd.print(» Fan Speed «);
lcd.setCursor(0,1);
lcd.print(» Controlling «);
delay(2000);
analogWrite(pwm, 255);
lcd.clear();
lcd.print(«Circuit Digest «);
delay(2000);
}
void loop()
{
DHT.read11(dht_dpin); // считываем значение с выхода датчика температуры
int temp=DHT.temperature; // извлекаем из него температуру
lcd.setCursor(0,0);
lcd.print(«Temperature:»);
lcd.print(temp); // показываем значение температуры на ЖК дисплее
lcd.write(1);
lcd.print(«C»);
lcd.setCursor(0,1);
if(temp <26 )
{
analogWrite(9,0);
lcd.print(«Fan OFF «);
delay(100);
}
else if(temp==26)
{
analogWrite(pwm, 51);
lcd.print(«Fan Speed: 20% «); // скорость вращения 20%
delay(100);
}
else if(temp==27)
{
analogWrite(pwm, 102);
lcd.print(«Fan Speed: 40% «); // скорость вращения 40%
delay(100);
}
else if(temp==28)
{
analogWrite(pwm, 153);
lcd.print(«Fan Speed: 60% «); // скорость вращения 60%
delay(100);
}
else if(temp==29)
{
analogWrite(pwm, 204);
lcd.print(«Fan Speed: 80% «); // скорость вращения 80%
delay(100);
}
else if(temp>29)
{
analogWrite(pwm, 255);
lcd.print(«Fan Speed: 100% «); // скорость вращения 100%
delay(100);
}
delay(3000);
}
1 |
#include<dht.h> // подключаем библиотеку для работы с датчиком LiquidCrystallcd(7,6,5,4,3,2); #define dht_dpin 12 dhtDHT; #define pwm 9 bytedegree8=// символ градуса для отображения на ЖК дисплее { 0b00011, 0b00011, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000 }; voidsetup() { lcd.begin(16,2); lcd.createChar(1,degree); lcd.clear(); lcd.print(» Fan Speed «); lcd.setCursor(,1); lcd.print(» Controlling «); delay(2000); analogWrite(pwm,255); lcd.clear(); lcd.print(«Circuit Digest «); delay(2000); } voidloop() { DHT.read11(dht_dpin);// считываем значение с выхода датчика температуры inttemp=DHT.temperature;// извлекаем из него температуру lcd.setCursor(,); lcd.print(«Temperature:»); lcd.print(temp);// показываем значение температуры на ЖК дисплее lcd.write(1); lcd.print(«C»); lcd.setCursor(,1); if(temp<26) { analogWrite(9,); lcd.print(«Fan OFF «); delay(100); } elseif(temp==26) { analogWrite(pwm,51); lcd.print(«Fan Speed: 20% «);// скорость вращения 20% delay(100); } elseif(temp==27) { analogWrite(pwm,102); lcd.print(«Fan Speed: 40% «);// скорость вращения 40% delay(100); } elseif(temp==28) { analogWrite(pwm,153); lcd.print(«Fan Speed: 60% «);// скорость вращения 60% delay(100); } elseif(temp==29) { analogWrite(pwm,204); lcd.print(«Fan Speed: 80% «);// скорость вращения 80% delay(100); } elseif(temp>29) { analogWrite(pwm,255); lcd.print(«Fan Speed: 100% «);// скорость вращения 100% delay(100); } delay(3000); } |