Zliva 0 6 июля, 2009 Опубликовано 6 июля, 2009 · Жалоба Здравствуйте. У меня есть следующая задача, нужно с помощью двух энкодеров (напряжение питания 5в, выходное напряжение 5в), которые подключены к асинхронным двигателям с частотой вращения 1500 об/мин =25 об/сек, измерить положение и скорость вращения. Количество импульсов, которых выдает энкодер за один оборот равняться 1024 импульсов, следовательно 25*1024=25600 Гц. Также есть датчик ускорения ADXL-210. Он тоже подключен к плате в/в и определяет ускорение конструкции (с ним еще не разбирался - дело ближайшего будущего). Также я приобрел плату В/В mDAQ http://www.holit.ua/ru/products/comp/ind/e...2842.html?mft=1 Получаться, что максимальная частота, с которой работает устройство в/в - 100кГц и я неуверен, что устройство справится с этой частотой. Мне нужно получать этот сигнал в реальном режиме времени, знать положение и скорость в каждый момент времени. Хочу сделать собственное устройство в/в которое работало бы через USB. Также важно не потерять всю последовательность получаемых данных. Посоветуйте пожалуйста как это можно реализовать. Я немного программировал AVR, но чувствую что нужно микроконтроллер пошустрее – ARM(может AT90USB162). Думаю делать так: сначала инициализирую таймер с частотой срабатывания 500кГц. По прерыванию от таймера опрашиваю порт В (пусть этот порт будет рабочим) и передаю на комп через USB. Возникает вопрос: Справится ли USB с такой частотой? Может кто-то уже занимался подобным или у кого-то будут другие идеи. В файле некоторые наброски в LabVIEW(Впервые его использую. Не судите строго) и документация на устройство. Жду вашей критики. DAQ.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 6 июля, 2009 Опубликовано 6 июля, 2009 · Жалоба Подумал на счет обычной AVR-ки. Может стоит использовать два микроконтроллера и FLASH память. Первый микроконтроллер непосредственно считывает данные и записывает их в FLASH память, а второй - передает их на комп(может даже и через RS232). Тогда не гарантируется реальное время (я вот подумал, без этого режима можно обойтись), но зато я не потеряю всех пакетов. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Критики? Да сколько угодно :) Предлагаю воспользоваться кнопочкой "поиск". Например, заслуживает тщательного изучения следующая тема: http://electronix.ru/forum/index.php?showtopic=55392 Мне кажется, что - контроллер должен быть один. С отладкой взаимодействия нескольких контроллеров пока лучше не сталкиваться :) - АВРки тут вполне достаточно. Особенно если не заморачиваться с USB (опять таки, для начинающих могут быть проблемы), а воспользоваться RS232. - основная проблема - правильно передать данные из контроллера в этот Ваш LabView. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Вы наверное плохо поняли задачу. Нужно с частотой 500 кГц (неуверен конечно) опрашивать порт и передавать через RS232 в программу, которую я напишу на Delphi (LabVIEW – это не для меня). Люди работают с одним энкодером, а мне нужно с двумя плюс датчик ускорения ADXL-210. Частоты большие. Передавать данные не буферизируя их чревато потерей всей цепочки данных. Но все равно спасибо за внимание! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Какая-то неправильная задача :) Зачем вашей программе знать, что 499 тысяч раз в секунду НИЧЕГО НЕ МЕНЯЛОСЬ? Кроме того, такой объем данных уже достаточно сложно передавать - UART уже не успеет, а эмулятор COM-порта на USB при работе с отдельными байтами работает даже медленнее (во всяком случае, в моей реализации :) Предлагаю два варианта: - с компьютера приходит запрос, контроллер отвечает "двигатель 1 повернулся на 125 импульсов вправо, двигатель 2 повернулся на 13 импульсов влево, акселерометр показывает 43 попугая" - контроллер самостоятельно отправляет посылки "двигатель 1 повернулся влево", "двигатель 2 повернулся вправо" и т.д. на каждое изменение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexkok 0 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Вы наверное плохо поняли задачу. Нужно с частотой 500 кГц (неуверен конечно) опрашивать порт и передавать через RS232 в программу, которую я напишу на Delphi (LabVIEW – это не для меня). Люди работают с одним энкодером, а мне нужно с двумя плюс датчик ускорения ADXL-210. Частоты большие. Передавать данные не буферизируя их чревато потерей всей цепочки данных. Но все равно спасибо за внимание! Вы сами сначала свою задачу поймите и опишите здесь в целом, что Вы хотите получить, а не каким напряжением Вы запитываете енкодер. На компьютере Ваша программа, в лучшем случае, будет получать данные с интервалом 5мс, это операционкой определяется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Прошу прощение за скупость выложенной информации. Есть виброплощадка с двумя дебалансными валами, с одной стороны которой через эластические муфты приделаны двигатели, а с другой – энкодеры. Площадка крепится через пружины к станине. Двигатели прикручены к станине жестко. Валы площадки не синхронизированы. К площадке крепится датчик ускорения. Нужно измерять положения дебалансных валов и их скорость, ускорение, а также ускорение, скорость, положение площадки. Ловить сдвиг фаз между положениями валов. Что уже есть: изготовлена площадка, на ней стоят энкодеры. Уже запускал, работает. Для чего это - не спрашивайте. Просто заставляют получить те параметры которые нужно и все. Для себя я сформировал такую задачу, которую изложил выше. Контролер и комп НЕ УПРАВЛЯЮ ДВИГАТЕЛЯМИ, а они запускаются отдельно через рубильник. Вот собственно все. На компьютере Ваша программа, в лучшем случае, будет получать данные с интервалом 5мс, это операционкой определяется. Да я это понимаю. Уже прошел через это, потому и спрашиваю, подойдет ли: … использовать два микроконтроллера AVR и FLASH память энергозависима. Первый микроконтроллер непосредственно считывает данные и записывает их в FLASH память, а второй - передает их на комп(может даже и через RS232). Тогда не гарантируется реальное время (я вот подумал, без этого режима можно обойтись), но зато я не потеряю всех пакетов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexkok 0 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Да я это понимаю. Уже прошел через это, потому и спрашиваю, подойдет ли: … использовать два микроконтроллера AVR и FLASH память энергозависима. Первый микроконтроллер непосредственно считывает данные и записывает их в FLASH память, а второй - передает их на комп(может даже и через RS232). Тогда не гарантируется реальное время (я вот подумал, без этого режима можно обойтись), но зато я не потеряю всех пакетов. Собственно ваша задача состоит из двух частей: измерить и накопить и передать. Насчет AVR не знаю, не работал с ними. Где-то на форуме было обсуждение измерения частоты сразу по трем каналам на одном ПИКе, поищите. По второй части учтите, что медленному компьютеру нужно выдавать пакеты не чаще чем через сотни мс, для быстрого достаточно около ста и даже меньше. Отсюда считайте размер пакетов и соответственно буферов. FLASH память, имхо, ни к чему, выбирайте самый дешевый SRAM. RS232 намного проще, особенно для Дельфи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 7 июля, 2009 Опубликовано 7 июля, 2009 · Жалоба Посоветуйте дешевый SRAM, желательно с SPI приличного размера, не хочется заморачиваться с параллелью. Кстати вопрос. Через SPI можно организовать одновременное считывание и запись? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexkok 0 8 июля, 2009 Опубликовано 8 июля, 2009 (изменено) · Жалоба У меня есть следующая задача, нужно с помощью двух энкодеров (напряжение питания 5в, выходное напряжение 5в), которые подключены к асинхронным двигателям с частотой вращения 1500 об/мин =25 об/сек, измерить положение и скорость вращения. Количество импульсов, которых выдает энкодер за один оборот равняться 1024 импульсов, следовательно 25*1024=25600 Гц. Также есть датчик ускорения ADXL-210. Он тоже подключен к плате в/в и определяет ускорение конструкции (с ним еще не разбирался - дело ближайшего будущего). Вы не указали точность с какой хотите измерять положение. Если предположить: - что с дробными долями Вы заморачиваться не собираетесь; - неравномерность ускорения за один оборот тоже не учитывается; то получаем по теореме Котельникова минимальную частоту отсчетов 50 отсч/сек. С хорошим запасом это 200 отсч/сек на энкодер. Таймер Вам не нужен, Вам нужен 16-ти битный счётчик. Будете его считывать каждые 5мс и класть в буфер. Т.е. суммарный поток данный вместе с акселерометрами будет 2 * 4 * 200 = 1600 байт/сек или ~ 20кбит/сек. Даже буфер не нужен, только 8 байт памяти. Для такой задачи по минимуму достаточно одного контроллера с двумя 16 битными счётчиками, двумя каналами АЦП и UARTом. А как Вы собираетесь синхронизировать положение энкодеров? Они имеют какой-либо синхро выход? Изменено 8 июля, 2009 пользователем alexkok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 8 июля, 2009 Опубликовано 8 июля, 2009 · Жалоба Небольшое уточнение. Вчера одним глазом посмотрел даташит на ATXL210. Для них нужны не два канала АЦП, а ещё пара таймеров с input capture - на выходе у него ШИМ. Требования к этому датчику Вы не озвучивали. Наверное, также надо опрашивать с частотой 100..200 Гц Примечание номер раз. Память, с которой могут работать одновременно два контроллера, штука редкая. О существовании такой флеш-памяти я вообще ни разу не слышал (правда, и не интересовался специально). О том, что запись во флеш мгновенно не осуществляется, молчу :) Примечание номер два. Программа на дельфи в реальном времени? Ой, не верю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 8 июля, 2009 Опубликовано 8 июля, 2009 · Жалоба Вы не указали точность с какой хотите измерять положение. Думаю 2-5% вполне приемлемо. Еще раз повторюсь. Пусть будет счетчик, а не таймер. Какая разница. Пусть переполнение счетчика вызывает прерывание. Можно легко определить с какой частотой они происходят Fmk. Одновременно считываем значение с всего порта, и передаем через UART последовательно все данные (припустим нет памяти и второго микроконтроллера). Мы получаем на компе значение такого типа (255;10;256;12 и т.д.). Выделяем из этих данных те биты, которые нам нужны( :rolleyes: все), и инкрементируем счетчик приема(назвем его Count). Когда я определяю время в каждый момент времени t=Tmk* Count = Count /Fmk. Следуя из этого мне НЕ НУЖНО реальное время, достаточно не потерять всю цепочку данных. С хорошим запасом это 200 отсч/сек на энкодер. Двигатель вращается с частотой 1500 об/мин, следовательно это равно 25об/сек. Энкодер имеет разрешение 1024им/об, это равно 1024*25=25600Гц. Это небольшая частота для контроллера, но для компа критична. Поэтому предлагаю такую запудренную схему.Откуда взялось 50 и200 отсч/сек не могу понять. Объясните пожалуйста. Вчера одним глазом посмотрел даташит на ATXL210. Для них нужны не два канала АЦП, а ещё пара таймеров с input capture - на выходе у него ШИМ. Насчет ATXL210, выходной сигнал у них ШИМ для Х и У соответственно. Этот сигнал пропорциональный ускорению и напряжению на аналоговых выходах. Честно говоря я не люблю АЦП, потому буду использовать ШИМ. Прикрепляю схему. Набросал немного. Пока без памяти и второго микроконтроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexkok 0 8 июля, 2009 Опубликовано 8 июля, 2009 (изменено) · Жалоба Думаю 2-5% вполне приемлемо. Еще раз повторюсь. Пусть будет счетчик, а не таймер. Какая разница. Пусть переполнение счетчика вызывает прерывание. Можно легко определить с какой частотой они происходят Fmk. Разница большая. Прерывание от счетчиков импульсов энкодеров вам не нужно. Структура программы контроллера должна быть примерно такой: 1. Нужен таймер для частоты отсчетов, который выдает прерывание в момент отсчета. 2. По прерыванию от этого таймера сначала читаются счётчики энкодеров и результаты кладутся в память, затем считывается ШИМ с акселерометров. Я смотрел даташит вполглаза и не заметил что они с ШИМ. Возможная проблема с ШИМ - это ошибка по фазе, соответственно и привязке по времени. Посчитайте, проходит для требуемой точности или нет. 3. После того как все данные одного отсчета получены, они через UART отправляются на компьютер, где пишутся в файл. Скорость RS232 нужно выбрать с запасом. 4. Программа на компьютере, после получения всех данных, находит и корректирует моменты переполнения счетчиков, затем преобразует отсчеты в угол. Одновременно считываем значение с всего порта, и передаем через UART последовательно все данные (припустим нет памяти и второго микроконтроллера). Мы получаем на компе значение такого типа (255;10;256;12 и т.д.). Выделяем из этих данных те биты, которые нам нужны( :rolleyes: все), и инкрементируем счетчик приема(назвем его Count). Когда я определяю время в каждый момент времени t=Tmk* Count = Count /Fmk. Следуя из этого мне НЕ НУЖНО реальное время, достаточно не потерять всю цепочку данных. Потеря данных зависит только от качества RS232 линии и правильности конфигурирования компорта. На всякий случай можно вставлять метки для проверки целостности данных и номера отсчётов. Двигатель вращается с частотой 1500 об/мин, следовательно это равно 25об/сек. Энкодер имеет разрешение 1024им/об, это равно 1024*25=25600Гц. Это небольшая частота для контроллера, но для компа критична. Поэтому предлагаю такую запудренную схему.Откуда взялось 50 и200 отсч/сек не могу понять. Объясните пожалуйста. Изучайте теорему Котельникова. Изменено 8 июля, 2009 пользователем alexkok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zliva 0 9 июля, 2009 Опубликовано 9 июля, 2009 · Жалоба Разница большая. Прерывание от счетчиков импульсов энкодеров…… Я так и думаю делать, может плохо объяснил. Значение частоты дискретизации будет задаваться через UART. Изучайте теорему Котельникова. Из теоремы Котельникова следует, что частота дискретизации должна перевешать максимальное значение частоты 25600Гц минимум в 2 раза, что равно 51200 Гц. Если с запасом в 4 раза, 102400 Гц. Правильно ли я понял? Вопрос: Как определить погрешность измерения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexkok 0 9 июля, 2009 Опубликовано 9 июля, 2009 (изменено) · Жалоба Из теоремы Котельникова следует, что частота дискретизации должна перевешать максимальное значение частоты 25600Гц минимум в 2 раза, что равно 51200 Гц. Если с запасом в 4 раза, 102400 Гц. Правильно ли я понял? Не совсем. :rolleyes: У Вас максимальная частота полезного сигнала 25об/сек или 25Гц. Если интересуют гармоники этой частоты, то надо брать более высокую, конечно, но не 25,6кГц. 25,6кГц это внутренняя частота датчика угла, Вам она не нужна. Вопрос: Как определить погрешность измерения? Если Вы о ШИМ акселерометра, то надо для выбранной частоты ШИМ взять максимальное случайное отклонение момента получения результата / 2. Систематическую погрешность (постоянную задержку) можно устранить при обработке. Т.к. ШИМ не синхронизирован с отсчетами, то это будет примерно пол периода ШИМ. Пересчитайте в угол для 25Гц - это и будет ошибка. Кроме того, для меняющегося входного сигнала, надо учесть к какому момент времени относится значение ШИМ. Изменено 9 июля, 2009 пользователем alexkok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться