Здравия желаю.
Есть разработанная и собранная плата, но нужен софт.
Устройство собрано в пяти экземплярах и не факт, что будет тиражироваться.
Плата на STM32f415
Вообще-то есть и софт под всё это дело, он даже как-то работал, но есть следующие особенности:
1. с тех пор я изменил схему и камень (тоже STM32, но я взял покруче), добавил по аналоговым входам усилители PGA с управлением по SPI, на выходе поставил опторазвязку, управление скоростью PWM вместо DAC.
2. исходник без комментов, недостаточно структурен, на си, программист устал и отвалился.
3. Математики я почти совсем не знаю, но мой друг математик, видевший этот код, говорил о неоптимальности применённого алгоритма синхронного детектирования (выделения первой
гармоники). Он готов на математическом языке понимальщику свои соображения изложить.
Но в принципе, даже я почти всё понимаю в этом коде, кто там что делает. "Даже" относится к тому, что я не программист, тем более, что почти
совсем не знаю си, но на Паскалевиче программки допиливал-модернизировал-фиксил.
Да, всё железо уже есть, включая программатор, отладочные платки для разминки, компьютер, частотный привод, мотор с энкодером и проч.
Теперь Т.з.:
Нужно разработать ПО следующего устройства ввода-вывода.
Технические параметры:
3 цифровых входа инкрементного углового датчика
- опорный(0), квадратурные "А" и "В". Уровни сигналов - TTL.
Диапазон частот опорного сигнала 0-500Гц.
4 аналоговых входа с предусилителями с переключаемым по SPI коэфф. усиления.
Диапазон частот полезного сигнала 0.5-500Гц.
Диапазон напряжений на 4-х аналоговых входах 0.5 - 4.5V(p-p), ноль смещён на 2.5V, но постоянная
составляющая не интересует, соответственно на входе - развязывающий кондюк.
Интерфейс с ведущим компьютером - MODBUS RS-232
Режимы работы:
0. Режим управления: принимаем из компьютера управляющие посылки:
15 байт данных +
один байт - команда включить один из режимов работы.
1. Режим разгона: получаем с порта значение требуемой скорости вращения, ШИМом преобразуем с каким-то коэффициентом в управляющее напряжение, пропорционально требуемой скорости,
меряем частоту опорного сигнала (Z), как только её нестабильность станет меньше константы, переходим в режим измерения, если так и не стала стабильной
(нестабильность меньше соотв. константы) за заданное константой время разгона - выдать соответствующий код ошибки на порт и продолжать ловить частоту.
2. Режим измерения: непрерывно получаем оцифрованные сигналы с встроенного АЦП (от 1-го до 4-х) и
опорные импульсы, синхронно детектируем, т.е. выделяем из всех аналоговых сигналов первую гармонику (sin/cos преобразование)
с частотой, равной частоте опорных импльсов, векторно усредняем значения амплитуд и фаз сигналов и N раз в сек.
выдаём в порт накопленные за этот период усреднённые значения амплитуд и фаз по каждому из 4-х каналов и опорной частоты. Не всегда нужны все 4 канала АЦП.
Скорее всего, экономить время, выбирая к-во каналов АЦП, меньшее, чем 4, и не нужно - надо смотреть.
В начале измерения по каждому каналу подбираем коэфф. усиления для оптимального попадания во входной диапазон АЦП и записываем их в соответствующий программируемый усилитель по SPI
Надо мерить ОДНОВРЕМЕННО все каналы и загонять данные через DMA.
Вроде, скоростей должно хватить.
АЦП 12 разрядов,
3. Режим измерения угла: получаем импульсы: опорный(0) и 2
квадратурных с двух каналов энкодера, непрерывно считаем их и выдаём в порт угловое значение в единицах, равных учетверённому количеству импульсов на оборот энкодера.
Выдача в порт по запросу.
энкодер 600 имп. на оборот (или меньше)
При этом энкодер в некоторых случаях соединен с ротором, угловое положение которого интересует, при помощи ременной передачи, соответственно от случая к случая количество
импульсов на оборот разное. Но индексный импульс (Z) приходит с метки на измеряемом роторе, соответственно мы за один поворот ротора всегда получаем строго один и только один импульс.
И при повороте ротора вручную или на выбеге можем посчитать число импульсов А и В на оборот.
4. Режим вывода - по сигналу с порта выводим биты на шесть ног (оптопары).
5. режим позиционирования - два выхода (оптопары) - команда "вперёд" и "назад", один выход - через ШИМ и оптопару делает управляющее постоянное напряжение на привод (скорость).
На порт компьютер посылает два байта - значение требуемого угла позиционирования, контроллер, играя означенными тремя оптопарами, заставляет привод спозиционировать ротор на нужный угол.
Пишите на fesadd@gmail.com
В случае успешного опыта сотрудничество обещает быть продлённым...
UPD 2 ALL:
Кактегорически не приветствуется обсуждение избранной мной стратегии решения МОЕЙ задачи и схемное реализации оной.
Кактегорически приветствуются и рукопожимаются конкретные предложения услуг по созданию/допилу ПО.
С пониманием и поддержкой отношусь к вопросам/уточнениям, высказанным с целью лучшего понимания поставленной задачи.
Спасибо за в нимание.