Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА:

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5201

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Перед НГ практически закончил писать код. Все модули "собираются" и компилируются в единый проект. Дал несколько дней "вылежаться" работе, внес незначительные поправки, и теперь, думаю, могу показать, что сделано, и буду ждать критики. Все файлы проекта подробно комментированы, так что ни у кого не будет сложностей в понимании того, что я там наковырял.
На данный момент проект выполнен в несколько упрощенном, относительно первоначального описания, варианте - исключен режим торможения мотора. Так же, еще не завершен модуль индикации скорости. За основу индикатора хочу взять проект "Частотомер" с этого сайта, но пока есть некоторые непонятки со структурой "первоисточника", и его схемотехникой. Так что пока разбираюсь.

В прикрепленном архиве папка DDM с файлами всех модулей. Там же графический файл DDM.gif с блок-схемой устройства.
Буду благодарен за любую конструктивную критику моей работы, но прошу учитывать, что о Quartus и Verilog я впервые услышал меньше месяца назад, и вполне мог допустить (и наверняка допустил) не одну "детскую" ошибку.

Упс... Не могу приклеить в сообщение rar-архив с проектом. Какой формат файлов можно вставлять в сообщения?
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от KIV.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5202

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
zip

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5203

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Да, zip приклеился к моему предыдущему сообщению.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5204

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

...Буду благодарен за любую конструктивную критику моей работы, но прошу учитывать, что о Quartus и Verilog я впервые услышал меньше месяца назад, и вполне мог допустить (и наверняка допустил) не одну "детскую" ошибку


Потом посмотрю внимательнее, но беглый взгяд сразу выявляет типичную ошибку - дизайн не синхронный.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5205

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Я предполагал подобное замечание. Если рассматривать проект в целом, то действительно, дизайн проекта не синхронный - почти у каждого модуля своя частота синхронизации. И это сделано намерено. Попробую объяснить, чем я руководствовался.
Внешний клок 50 МГц заводится только на один модуль - делителей частоты. Все остальные модули синхронизированы выходными сигналами модуля делителей частоты. Ведь можно считать, что эти сигналы делителей частоты синхронизированы между собой? Если да, то дизайн - синхронный.
Если же нет, то нужно оценить, скажется ли асинхронность клоковых сигналов для разных модулей на работоспособности системы в целом.

Основной внутрисистемный клок - FTakt, эта частота не постоянная, она зависит от выбранной скорости мотора, и текущей "подстройки" этой скорости. Этот клок заводится во все модули, участвующие в формировании фазных сигналов, и именно относительно фронта этой частоты нужно оценивать синхронность всех процессов в системе. Максимальная частота FTakt - не более 95 кГц, т.е., по меркам ПЛИСки, довольно низкая. Значит, все переходные процессы в отдельных логических элементах и триггерах, наверняка будут заканчиваться до очередного фронта FTakt. И, по большому счету, синхронность дизайна проекта следует оценивать с позиций именно этой частоты.

Все входные сигналы асинхронны по отношению к внешнему клоку (и его производных), и по отношению друг с другом. Но нажатия кнопок (имхо) не требуют жесткой синхронизации - они опрашиваются с очень низкой частотой (FSlow ~10 Гц, синхронна FTakt и исключает влияние дребезга контактов), и, как правило, не участвуют в дальнейших процессах, а лишь разрешают их выполнение. Могу ошибаться, но стоит ли привязывать сюда внешний клок, и добиваться синхронизации на этом этапе?
Сигналы с датчиков Холла вообще штука не предсказуемая, частота их фронтов и спадов зависит от многих факторов - от угловой скорости ротора, до неточности изготовления и механических настроек железа. Но ДХ опрашиваются с заведомо высокой частотой FTakt, и с этой же частотой "отправляются" дальше - в блок коммутатора фаз, который работает на частоте FFase, которая существенно ниже FTakt.

Внутри каждого модуля синхронизация выполняется по фронту той частоты, которая принципиальна для выполнения той, или иной операции. И в каждом последующем модуле частота выполнения этих операций уменьшается, а периодичность всех процессов становится все больше. Следовательно, и здесь нет весомых предпосылок к синхронизации от более высоких тактовых частот. В целом система довольно тихоходна, если не сказать - вялотекуща. По этому я и не стал ломать копья и добиваться сквозной синхронизации.
Некоторое сомнение у меня вызывает решение модуля DelControl - вот там, возможно, и не хватает синхронизации. Остальные же модули как бы живут каждый своей жизнью, и не сильно влияют на смежные процессы.

Понимаю, что такой подход вряд ли можно назвать профессиональным, но это только первая моя попытка что-то "наваять" для Альтеры, и в данный момент мне нужно решить конкретную задачу с минимальными временными затратами.

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от KIV.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5206

Вот теперь и моя очередь пришла задавать вопросы :)

Надеюсь не поколотите за оффтопик.
Возможен доступ вот к такому примитивному устройству:
www.robotiksistem.com/tower_pro_mg995_servo_motor_datasheet.pdf

Насколько я понял из описания, посредством ШИМ задаётся угол поворота. Задача - быстро и точно повернуть сервомотор в определённую позицию. Возможна инерция, то есть мотор может поворачивать довольно тяжелый груз. Опыта работы с таким оборудованием не было, поэтому вопросы могут быть глупыми. Зависит ли скорость перемещения от скважности сигнала? Т.е. возможно ли с помощью скважности регулировать ускорение? Иными словами, если необходимо из положения 0 градусов переместить сервомотор в положение 90 градусов, имеет ли смысл задать новое положение в 180 градусов, а где-то на 45 градусах с помощью изменения скважности начать останавливать мотор?

Не уверен что сумел достаточно понятно выразить проблему.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5207

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
alman, устройство по Вашей ссылке называется "сервомашинка". Такие широко применяются в моделировании (радиоуправляемые модели самолетов, машин, роботов). Конкретно эта модель - середнячок, если не хуже. Но для простых поделок применять вполне можно.

Основные параметры сервомашинок:
1) Напряжение питания - стандарт 4,8 вольт, но в последнее время большинство машинок может работать при напряжении до 6-7 вольт.
2) Время поворота на определенный угол (максимальный угол порядка 200-220 градусов).
У этой модели не лучше 0,2 сек / 60 градусов, при питании 4,8 вольта, при 6 вольтах - 0,15 сек / 60 град.
3) Крутящий момент на валу. У этой машинки заявлено 8,5 кг/см или 10 кг/см (в зависимости от напряжения питания). Реально - всегда меньше.
У этой машинки выходной вал и пара шестерен металлические, это плюс. Кроме того, выходной вал не на втулке а на двух миниатюрных шарикоподшипниках. Это тоже плюс, и не маленький.
4) "Мертвая зона" (dead band width) - 5 us. Что это такое, поясню чуть позже.

Управляются все подобные сервомашинки периодическим сигналом частотой 50 Гц (период 20 ms), с длительностью самого импульса от 1 до 2 ms. При длительности импульса 1,5 ms вал машинки устанавливается в среднее положение. Никакие другие сигналы машинка не понимает.
Следовательно, если вы подадите на ее вход периодический сигнал (50 Гц), и будете регулировать длительность импульсов в диапазоне от 1 до 2 ms (реально бывает возможно от 0,8 до 2,2 ms), то вал машинки будет поворачиваться с заявленной скоростью (от нагрузки зависит не очень сильно, но зависит), пропорционально ширине (длительности) импульсов.
Этот тип машинок - аналоговый, хотя сигнал на входе вроде бы и цифровой ("0" или "1"). Длительность входных импульсов сравнивается с длительностью импульсов внутреннего генератора машинки, которая регулируется потенциометром, жестко связанным с выходным валом машинки. Разностный сигнал ошибки двух импульсов преобразуется в аналоговый сигнал той, или иной полярности. Уровень разностного аналогового сигнала подается на коллекторный микромотор (часто с полым ротором для уменьшения инерционности. Как именно у этого типа машинки не знаю, я такие стараюсь не использовать - не надежные.), который через многоступенчатый редуктор вращает выходной вал.
Коэффициент редукции может быть порядка 100:1, и даже больше.
Теперь о "мертвом времени". Это время характеризует минимальную разницу в длительности входного импульса, и импульса, генерируемого внутренним одновибратором машинки, на которую сможет отреагировать машинка. Если эта разница менее 5 us (как заявлено, реально гораздо хуже!), то машинка не отработает.
Если принять диапазон изменения входного импульса 1 ms, то 5 us - это 0,5% от максимального угла поворота. Этот параметр характеризует точность позиционирования вала БЕЗ нагрузки. Если на валу будет нагрузка, машинка постоянно будет "подрабатывать", стараясь компенсировать противодействие на вал со стороны нагрузки. Этот фактор нужно обязательно учитывать при выборе сервомеханизма. И не забывайте, что при выключении питания постоянная нагрузка может даже через такой многоступенчатый редуктор провернуть мотор машинки в обратную сторону, т.е. обесточенная машинка не гарантирует неизменности положения выходного вала.

Надеюсь, рассказал подробно, и доходчиво. Если остались вопросы - задавайте, с удовольствием отвечу. Это - "моя тема"! :P
Спасибо сказали: alman

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от KIV.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5208

Посмотрел Ваш проект,
В Тоp модуле DDM у Вас не полностью соединенны шины между модулями, например DSpeed (RTL Viewer это показывает(пишет NC))
Добавьте в модуль DDM назначения всех межблочных шин с их разрядностью (без этого соединяется по одному проводу в шине) и всех межблочных сигналов
wire [9:0] DSpeed;
wire [7:0] DSeq;
	...
wire SWork;
	...
Конструкция ключевого соответствия пишется так:
PowControl PowControl(.FTakt(FTakt), .ButPusk(ButPusk), .ButStop(ButStop), .SWork(SWork), .SStop(SStop), .PowHi(PowHi), .PowLo(PowLo), .SAcsel(SAcsel));
          ...
Варнингов, в том числе критических, поубавится.

В модуле SpeedControl выходы регистров r33 и r45 никуда не идут
После снятия сигнала кнопок (отпускания кнопки) они не защелкиваются, так задумано?,
Гляньте как определить фронт нажатия кнопок в этой ветке.
marsohod.org/forum/yazyki-programmirovaniya/721-shim-na-verilog

Если нужна кнопка, которая по нажатию выдает 1, по следующему нажатию выдает 0 и т.д.(например для сигнала Пуск/Стоп)
то ее можно описать так:
module Buttom(input wire clock,
input inButtom,
output reg outButtom);
reg buttom_reg, buttom1_reg;
initial
begin
buttom_reg <= 0;
buttom1_reg <=0;				//Регистр хранения состояния кнопки
end
always @(posedge clock)
begin
	buttom_reg <= inButtom;	               
	if(inButtom == 0 && buttom_reg == 1) 	//обнаружитель фронта кнопки (по нажатию кнопка замыкает вход ПЛИС на землю)
	buttom1_reg <= buttom1_reg + 1;		//перещелкивание кнопки
	outButtom <= buttom1_reg;		//выход кнопки
end
endmodule

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5209

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

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

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

Вместо нескольких разных клоков clock1...clockN:
always@(posedge clock1) ...
надо сформировать и использовать разрешающие сигналы-стробы enable1..enableN длительностью в 1 такт основного клока clock:
always@(posedge clock) if(enable1) ...

Я не собирюсь сам спорить на тему, всегда ли (при возможности) нужно следовать идеологии синхронного дизайна - синтез делает Квартус, вот с ним и спорьте.

По поводу обязательного объявления многоразрядных внутренних шин уже сказали выше.
Запись вида:
PowControl PowControl(.FTakt(FTakt), .ButPusk(ButPusk), ...
лично мне не нравится, предпочитаю учитывать порядок аргументов:
PowControl(FTakt, ButPusk, ...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5210

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Пример, задачка - просуммировать число событий по одноразрядным каналам A и B.
В синхронном дизайне можно так закодировать события - 1 импульс длительностью 1 такт - 1 событие, 1 импульс длительностью 2 такта, или 2 импульса длительностью по 1 такту - 2 события, и тд.
И задачка решается просто: always@(posedge clock) count <= count + channelA + channelB.
В асинхронном дизайне события можно закодировать только фронтами, 1 фронт - 1 событие, 2 фронта - 2 события, и тд.
А безглючно просуммировать число фронтов асинхронных каналов - уже нетривиальная задачка.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.
Время создания страницы: 0.212 секунд
Работает на Kunena форум