Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом Тр в docx.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
641.84 Кб
Скачать

Универсальная плата разработки устройств на микроконтроллёрах stk500

Рисунок 4 Компоненты STK500

Описание светодиодов общего назначения

В набор STK500 входят 8 желтых светодиодов и 8 кнопок без фиксации. Светодиоды и кнопки электрически отделены от остальной части платы за счет подключения к собственным разъемам. Таким образом, они могут быть подключены к AVR-микроконтроллерам через 10-проводной шнур и разъемы портов ввода-вывода. На рисунке 3.4 показано как светодиоды и кнопки могут быть подключены к разъемам портов ввода-вывода. Шнуры должны быть подключены непосредственно между разъемами портов и разъемами светодиодов или кнопок. Шнур не должен скручиваться. Красный проводник шнура указывает на 1 вывод 1. Убедитесь, что шнур подключен к первому выводу каждого разъема. На рисунке 3.2 показано как реализовано управление светодиодом. Данное решение позволяет получить одинаковую интенсивность свечения светодиода при нахождении напряжения питания микроконтроллера в диапазоне 1.8В…6.0В.

Рисунок 5 Схема включения светодиода и подключения светодиодов к разъему

Прим.: Порты AVR-микроконтроллеров могут управлять непосредственно светодиодной нагрузкой, как втекающим током, так и вытекающим. Однако, в STK500 используются транзистор и два резистора для поддержания постоянной яркости свечения светодиодов при любом значении напряжения питания микроконтроллера (VTG), а также для выключении светодиодов, когда VTG отсутствует.

Описание кнопок общего назначения

Кнопки подключены к разъему по схеме изображенной на рисунке 3.3. При нажатии на кнопку на выводе SWn будет низкий уровень напряжения, а при отпускании – высокий (VTG). Рабочий диапазон напряжения VTG =1.8…6.0В.

Рисунок 6 Схема включения кнопок и подключения к разъему

Прим.: На линиях портов ввода-вывода AVR-микроконтроллеров имеется возможность активизации встроенных подтягивающих резисторов к плюсу питания. Это свойство можно использовать в целях исключения внешнего подтягивающего резистора. В STK500 добавлены внешние подтягивающие резисторы 10 кОм для формирования лог. «1» на выводах SWn при отжатом состоянии кнопок. Резистор 150 Ом выполняет функцию защитного токоограничения, например, в случае ошибочной настройки линий ввода-вывода, связанных с кнопками, на вывод.

Подключение светодиодов и кнопок

Любой порт ввода-вывода AVR-микроконтроллера может быть подключен к светодиодам и кнопкам, используя 10-проводной шнур, входящий в состав набора. На разъемы в дополнение к линиям портов выводятся напряжение питания целевого микроконтроллера VTG (VCC) и общий провод GND.

Рисунок 7 Подключение светодиодов и кнопок к портам ввода-вывода

3 Экспериментальная часть

В данной части будет показан процесс экспериментального использования устройства, подключение к нему внешних датчиков и устройств а также пробные запуски и реакция на те или иные действия пользователя

3.1 Управление устройством через интерфейс usb Описание

Модуль Ke-USB24A предназначен для сопряжения внешних цифровых и аналоговых устройств, датчиков и исполнительных механизмов с компьютером через шину USB. Определяется как дополнительный (виртуальный) COM порт. Модуль имеет 24 дискретные линии ввода/вывода (либо лог. 0 либо лог. 1) с возможностью настройки направления передачи данных (вход/выход) и встроенный 10-ти разрядный АЦП. Для управления модулем предусмотрен набор текстовых команд управления (KE – команды).

Отличительные особенности:

  • интерфейсный модуль для сопряжения по шине USB

  • определяется ОС Windows/Linux как виртуальный COM порт

  • не требует дополнительных схемных элементов, сразу готов к работе

  • 24 дискретные линии ввода/вывода с возможностью независимой настройки направления передачи данных (вход/выход) и сохранения настроек в энергонезависимой памяти модуля

  • встроенный 10-ти разрядный АЦП с гарантированной частотой дискретизации до 400 Гц.

  • динамический диапазон напряжения входного аналогового сигнала для АЦП от 0 до 5 В

  • набор готовых текстовых команд управления высокого уровня (KE – команды)

  • удобный форм-фактор в виде модуля с DIP-колодкой и разъемом USB-B

  • возможность питания как от шины USB так и от внешнего источника питания (режим выбирается джампером на плате)

  • возможность сохранения данных пользователя в энергонезависимой памяти модуля (до 32 байт)

  • возможность изменения строкового дескриптора USB устройства

  • каждый модуль имеет уникальный серийный номер доступный программно

  • поддержка ОС Windows XP 32/64 bit, Vista 32/64 bit и Windows 7 32/64 bit

  • поддержка OS Linux

Вроде бы это то, что нам нужно, НО… цена этого чуда начинается от $40. Наверно у вас уже пропало желание его покупать))).

Давайте лучше сами соберем подобный модуль, только чтобы он был доступный даже голодному студенту!

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

В качестве микроконтроллера возьмем широко распространенный Atmega8 (без индекса L в конце). Характеристики нашего модуля будут такие:

  • Подключение к ПК через USB.

  • определяется ОС Windows как USB HID устройство, не требующее драйверов.

  • Сразу готов к работе.

  • 7 линий вывода с логическим состоянием (активен/неактивен).

  • 2 линии вывода с плавным управлением напряжения от минимума до максимума. Только это не ЦАП(цифрово-аналоговый преобразоватль) а ШИМ (широтно-импульсная модуляция). Но с помощью фильтра можно легко превратить в ЦАП.

  • 7 линий ввода с логическим состоянием (активен/неактивен).

  • 1 АЦП(аналогово-цифровой преобразователь) с возможностью подключения внешнего источника опорного напряжения (ИОН).

  • Возможность заливать новую прошивку прямо через USB.

Почему я выбрал именно HID а не виртуальный COM порт (CDC)? Во первых, не нужны драйвера, во вторых – HID в несколько раз меньше грузит микроконтроллер чем CDC, так как данные запрашиваются не постоянно, а только тогда, когда этого требует хост (компьютер), и вообще, COM порт уже отмирает, сейчас аппаратных COM портов уже практически нет, остались только виртуальные. Логические линии вывода предназначены для управления только двумя состояниями – включенный или выключенный, при выключенном на выходе (ножке микроконтроллера) будет 0В при включенном – 5В, сюда вы можете подключить просто светодиод и управлять ним с ПК, а можете подключить реле (через транзистор) и управлять более мощной нагрузкой (освещение и т.д.). Линии вывода с регулировкой напряжения(ШИМ выход) позволяют плавно менять напряжение на ножке микроконтроллера от 0В до +5В с шагом 5/1024В. Линии ввода с логическим состоянием предназначены для мониторинга состояния кнопок, ключей и т.д. Когда линия замкнута на землю (корпус, GND), ее состояние = 0, если не замкнута – 1. АЦП позволяет измерять напряжение, сюда можно подключить потенциометр, аналоговый термодатчик, или еще что то, только напряжение, на этой ножке не должно превышать напряжение питания. В качестве источника опорного напряжения для АЦП можно использовать как внешний ИОН, так и напряжение питания модуля. Чтобы при перепрошивке не приходилось подключать микроконтроллер к программатору, сделаем возможность заливки прошивки прямо через USB, без использования внешнего программатора.

Схема устройства:

Рисунок 8 схема устройства компьютерного управления прибором Atmega8

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

Печатная плата:

Рисунок 9 печатная плата микроконтроллера Atmega8

Ну и в результате получилось вот что:

Рисунок 10 Плата микроконтроллера Atmega8 вид снизу и сверху

Теперь разберемся что куда будем подключать.

Рисунок 11 Описание уплавляющих микросхем

  1. USB – Порт. Думаю его все знают.

  2. Индикатор питания.

  3. Кнопка сброса (перезагрузка).

  4. Логический вход 1.

  5. Логический вход 2.

  6. Логический вход 3.

  7. Логический вход 4.

  8. Логический вход 5.

  9. Логический вход 6.

  10. Логический вход 7.

  11. Вход АЦП.

  12. Вход для подключения ИОН.

  13. Этот контакт подключен к питанию устройства. Замкните перемычкой 12 и 13 контакты чтобы напряжение ИОНа было равно напряжения питания.

  14. Логический выход 1.

  15. Логический выход 2.

  16. ШИМ выход 1.

  17. ШИМ выход 2.

  18. Логический выход 3.

  19. Логический выход 4.

  20. Логический выход 5.

  21. Логический выход 6.

  22. Логический выход 7.

Что такое GND?

Даже начинающий радиолюбитель знает что такое GND, но некоторым людям это кажется страшным буквами. GND – это, так сказать, общий контакт. Его еще называют землей и массой. Провод обычно черного света (иногда белого или еще какого нить). GND также подключается к металлическому корпусу устройства. На плате в большинстве случаев все свободное место заполняет GND в виде больших полигонов. На нашем модуле есть полигоны в виде сеточки, они так же соединяются с корпусом USB – разъема.

Программа для микроконтроллера.

Так как в статье я хочу рассказать как управлять цепями через USB с помощью готового модуля, то я не буду объяснять как работает программа микроконтроллера, снизу можете скачать исходники и посмотреть, там много комментов. Здесь я напишу просто об идентификаторах устройства.

Итак, в исходниках находится файл usbconfig.h, в нем есть строки

1

2

3

4

5

6

7

8

#define  USB_CFG_VENDOR_ID       0x10, 0x00

#define  USB_CFG_DEVICE_ID       0x01, 0x00

  

#define USB_CFG_VENDOR_NAME     ‘k’,’i’,’b’,’e’,’r’,’m’,’a’,’s’,’t’,’e’,’r’,’.’,’p’,’l’,’.’,’u’,’a’

#define USB_CFG_VENDOR_NAME_LEN 17

  

#define USB_CFG_DEVICE_NAME     ‘U’,’S’,’B’,’-‘,’C’,’o’,’n’,’t’,’r’,’o’,’l’

#define USB_CFG_DEVICE_NAME_LEN 11

Первые две строчки – это ID устройства и ID продукта, такие есть у каждого USB устройства, только в этом файл указывается сначала младший байт, потом старший, в проге под комп – наоборот. Дальше идет имя производителя (вендора) и название устройства, также указывается длина строки в байтах. Программа ПК сначала будет искать устройств по ID и потом, среди найденных, будет искать по имени.

Прошивка устройства.

В скачанных файлах в папке MCUusb_bootloader найдите файл main.hex – это usb-bootloader, его нужно залить в МК с помощью внешнего программатора. После заливки также нужно правильно установить фьюзы, в окне программатора STK500 должно выглядеть так:

Рисунок 12 прошивка устройства через универсальную плату STK500

Если вы пользуетесь другой программой, то можете просто ввести значения фьюз-битов HIGH и LOW (смотрите на скрин).

После удачной прошивки, можно попробовать прошить устройство через бутлоадер. Как он работает? При включении МК (просто при подаче питания, или после ресета) сразу запускается бутлоадер, он проверяет условие, если оно истинно, то запускается инициализация бутлоадера (комп при этом находит устройство). В качестве условия у нас будет «Логический вход 1 = 0″, то есть, чтобы запустить бутлоадер, нужно замкнуть Логический вход 1 на GND и нажать на устройстве кнопку RESET, в диспетчере устройство должно появиться новое HID устройство, так же не требующее драйверов:

Рисунок 13 отображение устройства в диспетчере устройств

Такс, теперь в папке MCUUSB_Controldefault запускаем файл boot.bat, должно выскочить окошко, в котором будут бегать циферки:

Рисунок 14 рабочее окно boot.bat

Если окно сразу же закрылось, тогда вы сделали что то не правильно. Если же все ок, тогда внешний программатор для этого устройства Вам уже не понадобится. Теперь можете отключить Логический вход 1 от GND. И на всякий случай, нажмите RESET. В диспетчере устройств так же должно появиться HID устройство (комп напишет что найдено новое). Убедитесь, что в диспетчере появилось именно это устройство.

Рисунок 15 Окно свойств HID-совместимого устройства

Хост – это то, что будет управлять устройством, в нашем случае – компьютер. Управление устройством с ПК я опишу более подробно.

Для программистов Delphi написать прогу управления HIDом не составит проблем так как в инете куча инфы. А вот программистам C++ Builder не все так сладко, но, как оказалось, не так все и плохо))). В инете я нарыл библиотеку hidlibrary.h, вот с ее помощью мы будет работать с HID устройством.

Скачайте исходники и запустите USB Control.cbproj (C++ Builder 2010).

В файле hidlibrary.h в самом верху есть строка

1

const char idstring[] = “vid_0010&pid_0001”;

Да-да, это те же самые ID, которые мы указывали в usbconfig.h. Если будете менять VID and PID, то не забывайте отредактировать эту строку. Кроме данной строки в файле hidlibrary.h нам больше ничего редактировать не нужно, можете его закрыть.

Открываем main.cpp, вверху указан относительный адрес к файлу usbconfig.h», это нужно чтобы библиотека HID знала имя вендора и продукта.

1

#include “../MCU/USB_Control/usbdrv/usbconfig.h”

Создадим форму, на форме будет один CheckListBox для управления логическими выходами, 2 ScrollBar для управления ШИМ каналами, один ListBox для отображения логических входов, один Label для отображения состояния АЦП и один таймер. Должно получиться вот такое:

Рисунок 16 рабочее окно программы для создания формы CheckListBox

Переименуйте СкрулБары в ScrollBar_PWM1 и ScrollBar_PWM2, в их свойствах установите Max=1023.

Создадим структуру

01

02

03

04

05

06

07

08

09

10

#pragma pack (push, 1)

struct status_t{

    unsigned char    logical_outputs;

    unsigned char    logical_inputs;

    unsigned char    ADC_DATA;

    unsigned short int    PWM1;

    unsigned short int    PWM2;

} ;

struct status_t    DeviceStatus;

#pragma pack ( pop)

#pragma pack нужна чтобы компилятор не выравнивал структуру. В logical_outputs хранятся состояние всех логических выходов, в побитном режиме, то есть, первый бит хранит состояние первого выхода, второй – второго и так до седьмого. Аналогично logical_inputs хранит состояние логических входов. В ADC_DATA хранится состояние АЦП, минимальное значение 0, максимальное – 255. В PWM1 хранится состояние первого ШИМ выхода (плавная регулировка напряжения), в PWM2 – состояние второго, минимальное значение 0, максимальное – 1023.

В программе ПК нужно считать с микроконтроллера эту структуру, ну и далее обработать принятые данные. Чтобы установить новые значения выходов, нужно сначала записать в структуру новые значения, а потом отправить измененную структуру на микроконтроллер. При установке новых значений нужно редактировать только первый, 4 и 5 элементы, редактирование остальных двух не даст никакого эффекта.

Далее создаем экземпляр класса

1

HIDLibrary <status_t> hid;

И добавляем функцию connect().

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

int connect(void)

{

   int i, n, res=0;

   string exampleDeviceName = “”;

  

   exampleDeviceName += vendorName;

   exampleDeviceName += “ “;

   exampleDeviceName += productName;

  

   n = hid.EnumerateHIDDevices();

  

   for (i=0; i<n; i++)            // ищем наше устройство

   {

      hid.Connect(i);

  

      // GetConnectedDeviceName() возвращает string,

      // где через пробел указаны vendor и product Name.

      // Сравниваем, если совпало – значить устройство наше

      if ( hid.GetConnectedDeviceName() == exampleDeviceName )

      {

         res = 1;

         break;

      }

   }

   return res;

}

Теперь данные с HID-устройства можно запросить с помощью функции hid.ReceiveData, указав в качестве параметра указатель на структуру, только перед запросом нужно проверить, подключено ли устройство:

1

if  ( connect() ) hid.ReceiveData(&DeviceStatus);

Аналогично можно передать данные в устройство:

1

if ( connect() ) hid.SendData(&DeviceStatus);

А теперь давайте допишем нашу программу (или просто скачайте исходники, там все готовое))).

Добавьте где нить в коде (лучше сразу после структуры) эти строки:

1

2

char  vendorName[]  = {USB_CFG_VENDOR_NAME, 0};

char  productName[] = {USB_CFG_DEVICE_NAME, 0};

Так как нужно будет работать с отдельными битами, объявим несколько дефайнов:

1

2

3

4

#define sbi(reg,bit) reg |= (1<<bit) // установить бит

#define cbi(reg,bit) reg &= ~(1<<bit) // сбросить бит

#define ibi(reg,bit) reg ^= (1<<bit) // инвентировать бит

#define CheckBit(reg,bit) (reg&(1<<bit)) // проверить бит

В свойствах таймера укажите Enabled = True, Interval = 500. Щелкните по нем дважды и в обработчике напишите

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

if (!connect()) return;        // Выходим, если устройство не подключено

 

hid.ReceiveData(&DeviceStatus);    // Читаем данные с устройства

 

for (char i = 0; i < 7; i++)

    CheckListBox_LogOuts->Checked[i] = CheckBit(DeviceStatus.logical_outputs, i);

 

ScrollBar_PWM1->Position = DeviceStatus.PWM1;

ScrollBar_PWM2->Position = DeviceStatus.PWM2;

 

ListBox_LogInputs->Clear();

for (char i = 0; i < 7; i++)

ListBox_LogInputs->Items->Add(“ Лог. Вход “+IntToStr(i+1)+” = “

+BoolToStr(CheckBit(DeviceStatus.logical_inputs, i)));

Label_ADC->Caption = DeviceStatus.ADC_DATA;

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

Кликните дважды по CheckListBox, в обработчике напишите

1

2

3

4

5

6

for (char i = 0; i < 7; i++)

{

    if (CheckListBox_LogOuts->Checked[i]) sbi(DeviceStatus.logical_outputs, i);

    else cbi(DeviceStatus.logical_outputs, i);

}

if ( connect() ) hid.SendData(&DeviceStatus);

Тут копируется состояние чекбоксов в элемент структуры, после чего структура отправляется в МК.

Осталось сделать управление ШИМ выходами. Кликните один раз по ScrollBar_PWM1, зажмите Shift и выбирите ScrollBar_PWM2, короче нужна выделить 2 скрулбара, слева откройте события (Events) и в OnChange укажите тот же обработчик, что и в CheckListBox, а в обработчике пред последней строкой добавьте:

1

2

DeviceStatus.PWM1 = ScrollBar_PWM1->Position;

DeviceStatus.PWM2 = ScrollBar_PWM2->Position;

Все, можно компилировать!

Тест-драйв.

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

Подключите устройство к ПК, запустите программу. Слева в листбоксе отображается состояние всех логических входов, если, к примеру, Логический вход 1 не замкнут на GND, тогда будет написано «Лог. Вход 1 = -1″, если подключен, то «Лог. Вход 1 = 0″. Вот скрин:

Рисунок 17 отображение логических входов при подключении устрйства к ПК

Под этим листбоксом отображается результат преобразования АЦП. Замкните вход АЦП на минус, тогда результат будет равен 0, замкните на + питания, результат будет 255. Можно подключить сюда потенциономер, или еще что. Напряжение на ножке АЦП можно вычислить по формуле:Напряжение_ИОН/255*результат_АЦП.

Теперь подключите какую то маленькую нагрузку к Логическом выходу 1 (светодиод или просто вольтметр). Поставьте галочку возле «Лог. Выход 1″ – светодиод загорится.

Подключите вольтметр к первому ШИМ каналу, покрутите ползунок – напряжение будет меняться.

Завершение.

Теперь можете сделать на основе этого модуля управление освещением или ещё какими то электроприборами. К логическим входам можно подключить кнопку дверного звонка или какой то другой ключ. К входу АЦП можете подключить аналоговый датчик влажности, термодатчик или фоторезистор (будете занать, ночь на улице или день).