URC220_Board_Win (Раздаточные материалы), страница 5
Описание файла
Файл "URC220_Board_Win" внутри архива находится в следующих папках: Раздаточные материалы, Документация. PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "поук" в общих файлах.
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
Это означает, что любое изменение состояния платы сначала записывается34в программный буфер на ПК, и лишь при вызове функции board.DeviceWrite ();происходит реальная передача данных в контроллер и изменение его состояния. Вданном примере board.DeviceSetOutput (1, 0); – записывает в буфер, при этомконтроллер не изменяет своего состояния, а реальное изменение состоянияпроисходит только после board.DeviceWrite ();Аналогичная ситуация и со считыванием информации из контроллера. Функцияboard.DeviceRead (); – обновляет буфер на ПК, а считывание из буферапроизводится другими функциями, например, board.DeviceGetInput(ULONG Index,UCHAR *Value);5.2.3 Завершение работы с контроллеромПри завершении программы и, соответственно,необходимо вызывать функцию board.Close ();работысконтроллеромДля работы с контроллером написано 4 примера. В папке «!Самый простой тест»вы найдёте прокомментированный пример работы с контроллером.
Используйтеего как шаблон, при создании новых программ.5.3 Универсальный примерНиже приведён универсальный пример, который демонстрирует все функции дляработы с устройством. Данное консольное приложение выводит на экран вседанные с платы, которые можно считать, в виде таблицы, а также устанавливаетзначения ШИМ на всех каналах и мигает светодиодами.Сначала происходит выбор устройства (функция list_devices), а затемподключение к выбранному устройству. ШИМ меняется линейно от -500 до +500 иобратно, а данные на экран выводятся 4 раза в секунду.
Также происходитподсчёт числа итераций цикла.//-----------------------------------------------------// Подключение необходимых библиотек#include <windows.h>#include <stdio.h>#include <conio.h>#pragma comment(lib, "Winmm.lib")// В т.ч. и библиотеки для работы с устройством#include "urc220.h"//-----------------------------------------------------// Объект для работы с устройствомCURC220 urc;//-----------------------------------------------------// Функция выводит на экран список устройств и// возвращает номер выбранного пользователем устройства// (начиная с "0", "-1" - ошибка)int list_devices(){// Обновляем список устройствurc.UpdateDeviceList();35// Определяем количество устройствULONG device_count = 0;urc.GetDeviceCount(&device_count);// Если не подключено ни одного устройства, тоif(!device_count){// Выводим сообщение и выходимprintf("Devices not found\n");return -1;}// Максимальная длина имени устройстваULONG max_name_size = 0;// Проходимся по всем устройствам и определяем// размер самого длинного имениfor(ULONG i = 0; i < device_count; i++){ULONG current_name_size = 0;urc.GetDeviceNameLen(i, ¤t_name_size);if(max_name_size < current_name_size)max_name_size = current_name_size;}// Создаём строку для хранения имениchar *name = new char[max_name_size + 1];// Выводим список устройств на экранprintf("Device list:\n");printf("-------------------------------------------------------------------------------");// Проходимся по всем устройствамfor(ULONG i = 0; i < device_count; i++){// Определяем имя устройства и записываем его// в созданную строкуurc.GetDeviceName(i, name, max_name_size + 1);// Выводим имя на экранprintf("Device %d name:\n", i);printf("%s\n", name);}printf("-------------------------------------------------------------------------------");// Удаляем ненужную теперь строкуdelete name;// Если подключено более одного устройства, тоif(device_count > 1){// Предлагаем пользователю ввести номер устройстваprintf("Select device number:");// Считываем ответ пользователяchar buf[100];gets_s(buf, sizeof(buf));// Преобразуем введённую строку в числоint device_index = atoi(buf);// Если введён неверный номер, тоif((device_index < 0) || (device_index > ((int)device_count - 1))){// Сообщаем и выходимprintf("Wrong device number\n");return -1;}// Возвращаем номер устройстваreturn device_index;36}// Если подключено всего одно устройство, тоelse{// Сразу возвращаем его номерreturn 0;}}//-----------------------------------------------------int main(){// Определяем номер устройства,// которое нужно открытьint device_index = list_devices();// Если возникла ошибка, то выходимif(device_index < 0){_getch();return 0;}// Открываем выбранное усройствоif(!urc.Open(device_index)){// Сообщаем и выходим, если не получилосьprintf("Can not open device #%d...\n", device_index);_getch();return 0;}// Сообщаем об успешном соединенииprintf("Device #%d opened\n", device_index);printf("Press Esc to quit\n");// Предыдущее время вывода информации - текущееDWORD prev_time = timeGetTime();// Счётчик числа итерацийDWORD it_count = 0;// Значение ШИМSHORT pwm = 0;// Направление изменения ШИМа (+1 или -1)SHORT pwm_sign = +1;// Номер светодиодаDWORD led_id = 0;// Счётчик линийDWORD line_count = 0;// Выводим заголовок таблицыprintf("-------------------------------------------------------------------------------");printf("Inputs\tADC0\tADC1\tADC2\tADC3\tEnc0\tEnc1\tTicks/sec\n");printf("-------------------------------------------------------------------------------");// Начинаем бесконечный циклwhile(1){// 1 - Сначала считываем данные из устройстваif(!urc.DeviceRead()){// Сообщаем и выходим, если не получилось37printf("Error reading device...\n");_getch();return 0;}// 2 - Далее выполняем необходимые действия с устройством// Увеличиваем счётчик итерацийit_count++;// Если прошло 250 мс, тоif(timeGetTime() - prev_time >= 250){// Определяем состояние всех портов вводаUCHAR in0, in1, in2, in3;urc.DeviceGetInput(0, &in0); if(in0) in0 = 1;urc.DeviceGetInput(1, &in1); if(in1) in1 = 1;urc.DeviceGetInput(2, &in2); if(in2) in2 = 1;urc.DeviceGetInput(3, &in3); if(in3) in3 = 1;// Определяем измерения всех АЦПUSHORT adc0, adc1, adc2, adc3;urc.DeviceGetADC(0, &adc0);urc.DeviceGetADC(1, &adc1);urc.DeviceGetADC(2, &adc2);urc.DeviceGetADC(3, &adc3);// Определяем значения на всех энкодерахLONG enc0, enc1;urc.DeviceGetEnc(0, &enc0);urc.DeviceGetEnc(1, &enc1);// Выводим все эти данные в виде строки таблицыprintf("%d%d%d%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\n",in0, in1, in2, in3, adc0, adc1, adc2, adc3,enc0, enc1, it_count * 4);// Увеличиваем счётчик выведенных строкline_count++;// Если вывели уже 15 строк, то ещё раз печатаем// заголовок таблицы и обнуляем счётчик строкif(line_count == 15){printf("-------------------------------------------------------------------------------");printf("Inputs\tADC0\tADC1\tADC2\tADC3\tEnc0\tEnc1\tTicks/sec (Esc toquit)\n");printf("-------------------------------------------------------------------------------");line_count = 0;}// Устанавливаем логический 0 в порт вывода с номером led_idurc.DeviceSetOutput(led_id, 0);// Увеличиваем счётчик номера портаled_id++;// Если дошли до максимума, то начинам сначалаif(led_id == 8) led_id = 0;// Устанавливаем логическую 1 в этот порт выводаurc.DeviceSetOutput(led_id, 1);// Обнуляем счётчик числа итерацийit_count = 0;// Предыдущее время вывода информации - текущееprev_time = timeGetTime();}// Устанавливаем значения на каналах ШИМ38urc.DeviceSetPWM(0, pwm);urc.DeviceSetPWM(1, pwm);urc.DeviceSetPWM(2, pwm);urc.DeviceSetPWM(3, pwm);// Изменяем текущую величину ШИМpwm += pwm_sign;// Если дошли до максимума, то устанавливаем// отрицательное изменение значения ШИМif(pwm == 500) pwm_sign = -1;// Если дошли до минимума, то устанавливаем// положительное изменение значения ШИМif(pwm == -500) pwm_sign = +1;// 3 - Записываем данные в устройствоif(!urc.DeviceWrite()){// Сообщаем и выходим, если не получилосьprintf("Error writing device...\n");_getch();return 0;}// Если нажали на Esc, то прерываем циклif(GetAsyncKeyState(VK_ESCAPE)) break;}// Выходим из программыreturn 0;}//------------------------------------------------------396.
Содержание1. Общее описание платы ....................................................................................... 21.1 Технические характеристики ......................................................................... 21.2 Процессор AT91SAM7S64 ............................................................................... 31.3 Драйверы двигателей A3949.......................................................................... 62. Элементы на плате ............................................................................................. 82.1 Порты вывода и светодиоды..........................................................................
82.2 Порты ввода и кнопки ................................................................................... 92.3 Аналого-цифровой преобразователь (АЦП) ................................................. 102.4 Потенциометры ........................................................................................... 112.5 Широтно-импульсный модулятор (ШИМ).
.................................................... 122.6 Вход для энкодеров ..................................................................................... 142.7 Интерфейсы связи ....................................................................................... 152.8 Разъёмы питания .........................................................................................