Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контролер для 3-х двигателей.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
Jenya7
Мне нужно сделать драйвер для 3-х двигателей. Двигатели обычные DC Motors 24V. Двигатели имеют энкодеры для отслеживания позиции.
Хотелось чтоб энкодеры были апаратные. Обычно это делается на таймерах.
Вот задумался какой контроллер выбрать. PWM+Encoders требуют таймера. К тому же на мои нужды нужно еще 3 таймера.
У ST вроде нет контролеров заточенных под motion. У TI есть но что то не хочется связываться с TI. К тому же 3 двигателя. Есть контроллеры под такую задачу?
Основная проблема - аппаратно обработать 3 энкодера. На атмеловских AVRках я пользовался внешними интераптами но это, как мне кажется, не очень хороший способ.
sigmaN
У ST есть всё для моторов и даже библиотека имеется(правда я не уверен что она бесплатна)
http://www.st.com/content/ccc/resource/tec....CD00298474.pdf
AlexandrY
Цитата(sigmaN @ Jul 2 2017, 18:19) *
У ST есть всё для моторов...

Я б так уверенно не отвечал.
Чтобы сделать одновременно 3-и даже простейших аппаратных 2-х входовых квадратурных декодера и 3-и трехканальных PWM (по 6 выходов каждый)
не подойдет ни один STM включая STM32H7 и даже Kinetis.
oleg_d
У семейства XMC4000 есть все что надо но только для двух моторчиков одновременно.
sigmaN
Кстати по ходу у ТСа коллекторные движки и там всё куда проще получится
AlexandrY
Цитата(sigmaN @ Jul 2 2017, 18:56) *
Кстати по ходу у ТСа коллекторные движки и там всё куда проще получится

Хм, действительно похоже на коллекторные. Тогда не интересно. laughing.gif
sigmaN
Я щас тоже только что так подумал )
Jenya7
Цитата(sigmaN @ Jul 2 2017, 20:19) *
У ST есть всё для моторов и даже библиотека имеется(правда я не уверен что она бесплатна)
http://www.st.com/content/ccc/resource/tec....CD00298474.pdf

мда. с FOC SDK как то все мутно. а камень мне посоветовали STM32F303 - там куча таймеров и все с функциями PWM + encoder.

Advanced-control timers (TIM1/TIM8/TIM20)
General-purpose timers (TIM2/TIM3/TIM4)
Basic timers (TIM6/TIM7)
General-purpose timers (TIM15/TIM16/TIM17)

насколько я понял только TIM2/TIM3/TIM4 support quadrature encoders или я ошибаюсь?

Цитата(AlexandrY @ Jul 2 2017, 20:54) *
Я б так уверенно не отвечал.
Чтобы сделать одновременно 3-и даже простейших аппаратных 2-х входовых квадратурных декодера и 3-и трехканальных PWM (по 6 выходов каждый)
не подойдет ни один STM включая STM32H7 и даже Kinetis.

На PWM мне нужно 4 вывода. Можно обойтись и двумя. У меня внешний Full Bridge Driver принимает два сигнала - PWM FORWARD, PWM REVERSE. Четыре на всякий случай, если буду использовать другой драйвер.

Двигатели диси - подключены по мостовой схеме.
EmbedElektrik
параметры энкодера и частота вращения какие? при 10.000 имп\оборот и 1000 об\мин даже с одним движком будет та еще забава
Jenya7
Цитата(EmbedElektrik @ Jul 3 2017, 01:47) *
параметры энкодера и частота вращения какие? при 10.000 имп\оборот и 1000 об\мин даже с одним движком будет та еще забава

я не помню точно, но не думаю что больше 1000 об/мин. На внешних прерываниях считывалось на ура, не думаю что на таймере будет хуже.
sigmaN
Ну так надо сначала ж выбрать энкодеры исходя из требуемой точности позициирования.
Вам же подказали, что если вы выберете энкодеры, выдающие 10000 импульсов на один оборот и ваш двигатель разгонится до 1000об/мин то не сложно посчитать сколько импульсов вам будет прилетать в секунду. А ведь по ним придется принемать решения(т.е. обрабатывать их) вне зависимости от того будет ли там у вас таймер или не таймер....
Поэтому начать следует с постановки тех.задания и определения требуемых характеристик системы, а потом и процессор можно подобрать.
А то как-то всё как обычно получается ))))
Jenya7
Цитата(sigmaN @ Jul 3 2017, 14:04) *
Ну так надо сначала ж выбрать энкодеры исходя из требуемой точности позициирования.
Вам же подказали, что если вы выберете энкодеры, выдающие 10000 импульсов на один оборот и ваш двигатель разгонится до 1000об/мин то не сложно посчитать сколько импульсов вам будет прилетать в секунду. А ведь по ним придется принемать решения(т.е. обрабатывать их) вне зависимости от того будет ли там у вас таймер или не таймер....
Поэтому начать следует с постановки тех.задания и определения требуемых характеристик системы, а потом и процессор можно подобрать.
А то как-то всё как обычно получается ))))

А проблема в чем? В том что 16-битный таймер вылетит в оверфлоу не закончив хода двигателя? Так там прескейлер можно задать.
sigmaN
Проблема в том, что ваша система не должна допустить срыва регулирования во всем диапазоне скоростей и ускорений привода, которые могут случиться во время его работы.
Вам просто подсказывают на что обратить внимание. А что там куда заоверфловится или кол-во прерываний не успеет обработаться - это вы уже просчитывайте, я не знаю.
Эдди
Цитата(EmbedElektrik @ Jul 2 2017, 23:47) *
при 10.000 имп\оборот и 1000 об\мин даже с одним движком будет та еще забава

Это получается всего-то 167кГц. При системной частоте в 72МГц таймер запросто справится. При помощи DMA данные можно сбрасывать в отдельную переменную, и вопрос "определить текущую скорость вращения вала" вообще будет решаться элементарно!
Это ж не авр какой-нибудь допотопный, где ни таймеров нормальных не было, ни DMA!
sigmaN
Цитата
и вопрос "определить текущую скорость вращения вала" вообще будет решаться элементарно!

Цитата(Jenya7 @ Jul 2 2017, 11:31) *
Двигатели обычные DC Motors 24V. Двигатели имеют энкодеры для отслеживания позиции.

Что может оказаться несколько сложнее отслеживания скорости вращения вала. Хотя это всё телепатия ибо задача полностью не озвучена
HardEgor
Цитата(Jenya7 @ Jul 3 2017, 16:43) *
А проблема в чем? В том что 16-битный таймер вылетит в оверфлоу не закончив хода двигателя? Так там прескейлер можно задать.

Вы попробуйте решить задачу для одного двигателя одним контроллером. Тогда и ясность появится.
А то сейчас не имея внятной постановки задачи, можно много чего нафантазировать.

Возможно проще будет поставить три простых контроллера, чем искать один супернавороченный.
Maverick
Цитата(Jenya7 @ Jul 2 2017, 11:31) *
Мне нужно сделать драйвер для 3-х двигателей. Двигатели обычные DC Motors 24V. Двигатели имеют энкодеры для отслеживания позиции.
Хотелось чтоб энкодеры были апаратные. Обычно это делается на таймерах.
Вот задумался какой контроллер выбрать. PWM+Encoders требуют таймера. К тому же на мои нужды нужно еще 3 таймера.
У ST вроде нет контролеров заточенных под motion. У TI есть но что то не хочется связываться с TI. К тому же 3 двигателя. Есть контроллеры под такую задачу?
Основная проблема - аппаратно обработать 3 энкодера. На атмеловских AVRках я пользовался внешними интераптами но это, как мне кажется, не очень хороший способ.

так не проще сделать это на плис
программируемый PWM
Код
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity pwm_prog is
generic(
  N                     : integer := 8);      -- number of bit of PWM counter
port (
  i_clk                       : in  std_logic;
  i_rstb                      : in  std_logic;
  i_sync_reset                : in  std_logic;
  i_pwm_module                : in  std_logic_vector(N-1 downto 0);  -- PWM Freq  = clock freq/ (i_pwm_module+1); max value = 2^N-1
  i_pwm_width                 : in  std_logic_vector(N-1 downto 0);  -- PWM width = (others=>0)=> OFF; i_pwm_module => MAX ON
  o_pwm                       : out std_logic);
end pwm_prog;

architecture rtl of pwm_prog is

signal r_max_count                           : unsigned(N-1 downto 0);
signal r_pwm_counter                         : unsigned(N-1 downto 0);
signal r_pwm_width                           : unsigned(N-1 downto 0);
signal w_tc_pwm_counter                      : std_logic;


begin

w_tc_pwm_counter  <= '0' when(r_pwm_counter<r_max_count) else '1';  -- use to strobe new word
--------------------------------------------------------------------

p_state_out : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    r_max_count     <= (others=>'0');
    r_pwm_width     <= (others=>'0');
    r_pwm_counter   <= (others=>'0');
    o_pwm           <= '0';
  elsif(rising_edge(i_clk)) then
    r_max_count     <= unsigned(i_pwm_module);
    if(i_sync_reset='1') then
      r_pwm_width     <= unsigned(i_pwm_width);
      r_pwm_counter   <= to_unsigned(0,N);
      o_pwm           <= '0';
    else
      if(r_pwm_counter=0) and (r_pwm_width/=r_max_count) then
        o_pwm           <= '0';
      elsif(r_pwm_counter<=r_pwm_width) then
        o_pwm           <= '1';
      else
        o_pwm           <= '0';
      end if;
      
      if(w_tc_pwm_counter='1') then
        r_pwm_width      <= unsigned(i_pwm_width);
      end if;
      
      if(r_pwm_counter=r_max_count) then
        r_pwm_counter   <= to_unsigned(0,N);
      else
        r_pwm_counter   <= r_pwm_counter + 1;
      end if;
    end if;
  end if;
end process p_state_out;

end rtl;


квадратурный декодер например (по ссылке можно купить для "тренировки") (реализация учитывает направление вращения):

Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity QuadratureDecoder is
    Port ( QuadA : in  STD_LOGIC;
           QuadB : in  STD_LOGIC;
           Clk : in  STD_LOGIC;
           Position : out  STD_LOGIC_VECTOR (7 downto 0));
end QuadratureDecoder;

architecture Behavioral of QuadratureDecoder is

signal QuadA_Delayed: unsigned(2 downto 0) := "000";
signal QuadB_Delayed: unsigned(2 downto 0) := "000";

signal Count_Enable: STD_LOGIC;
signal Count_Direction: STD_LOGIC;

signal Count: unsigned(7 downto 0) := "00000000";

begin

process (Clk)
begin
    if Clk='1' and Clk'event then
        QuadA_Delayed <= (QuadA_Delayed(1), QuadA_Delayed(0), QuadA);
        QuadB_Delayed <= (QuadB_Delayed(1), QuadB_Delayed(0), QuadB);
        if Count_Enable='1' then
            if Count_Direction='1' then
                Count <= Count + 1;
                Position <= conv_std_logic_vector(Count, 8);
            else
                Count <= Count - 1;
                Position <= conv_std_logic_vector(Count, 8);
            end if;
        end if;
    end if;
end process;

Count_Enable <= QuadA_Delayed(1) xor QuadA_Delayed(2) xor QuadB_Delayed(1)
                xor QuadB_Delayed(2);
Count_Direction <= QuadA_Delayed(1) xor QuadB_Delayed(2);

end Behavioral;

или энкодер в плис это обычный счетчик импульсов...

Далее добавляем двупортовую память в которую будем писать данные для выполнения и конфигурирования PWM
В первый порт пишем принятые данные по UART (вы писали), я предлагаю SPI (не требуется синхронизации приемника и передатчика)
С второго порта читаем данные и выдаем на PWM - результат контролируем с помощью квадратурного декодера (в реализации обычный компаратор)
Вместо двупортовой памяти можно взять двуклоковое фифо

Как в плис сделать из одного модуля три думаю догадаетесь sm.gif
Если хотите внешний MCU то предлагаю сделать соединение с ПЛИС с помощью external memory interfacе, т.е чтобы MCU видело ПЛИС как свою память ОЗУ + пару пинов для организации обмена прерываниями(окончанием работы(выполнения команды и др)) тогда в ПЛИС делаете двойной буфер и будет отличное решение Возможно не понадобится делать протокол обмена (парсер как Вы это назвали)
Как то так...
Эдди
Цитата(HardEgor @ Jul 3 2017, 20:11) *
Возможно проще будет поставить три простых контроллера, чем искать один супернавороченный.

Вот это, кстати, верно замечено. Я и сам предыдущей железяке (5 шаговиков, куча концевиков и Холлов, затвор на TLE5205 с контролем замыкания/обрыва, 8 платиновых термодатчиков, 8 DS18S20…) делал модуль управления на одном МК. Замучился, но работает. Но кабель получился жирным! Правда, там все механизмы внутри криостата — МК и силовые ключи туда не засунуть.
Но вот новые железки, которые при Н.У. работают, собираюсь все-таки модульными делать: проще по 1МК (+драйвер[ы]) на 1-2 ШД с концевиками сделать и связать их CAN-шиной, нежели городить жуткий жгут проводов и огромную плату-контроллер!
Maverick
Цитата(Эдди @ Jul 4 2017, 01:21) *
Вот это, кстати, верно замечено. Я и сам предыдущей железяке (5 шаговиков, куча концевиков и Холлов, затвор на TLE5205 с контролем замыкания/обрыва, 8 платиновых термодатчиков, 8 DS18S20…) делал модуль управления на одном МК. Замучился, но работает. Но кабель получился жирным! Правда, там все механизмы внутри криостата — МК и силовые ключи туда не засунуть.
Но вот новые железки, которые при Н.У. работают, собираюсь все-таки модульными делать: проще по 1МК (+драйвер[ы]) на 1-2 ШД с концевиками сделать и связать их CAN-шиной, нежели городить жуткий жгут проводов и огромную плату-контроллер!

Возможно я чего то не понимаю, зачем брать N микропроцессоров(соответственно плат) и делать сложный протокол обмена между ними и думать про псевдосинхронизацию процессов между ними. Почему не одна ПЛИС и внутренним или внешним одним MCU?
ПЛИС производит считывание с датчиков и управляет моторами. MCU производит управление ПЛИС и связь с внешним миром
Сейчас SoC относительно не дорогие
Огурцов
Цитата(Maverick @ Jul 3 2017, 23:43) *
зачем брать N микропроцессоров(соответственно плат)

N микропроцессоров всё ещё гораздо дешевле, чем 1 fpga, проще, потому что абсолютно одинаковые, и могут быть пространственно разнесены, потому что на разных платах, и маленькие одинаковые платы дешевле в мелкой серии, даже при равной площади, чем одна большая
HardEgor
Цитата(Maverick @ Jul 4 2017, 05:43) *
Возможно я чего то не понимаю, зачем брать N микропроцессоров(соответственно плат) и делать сложный протокол обмена между ними и думать про псевдосинхронизацию процессов между ними. Почему не одна ПЛИС и внутренним или внешним одним MCU?

Вы почитайте другие темы ТС - у него не хватает желания или знаний или еще чего разобраться с простейшими вещами, а вы ему ПЛИС предлагаете....

С другой стороны, откуда взялось несколько плат? Надо просто сделать одну плату на 3 микроконтроллера. Все контроллеры будут иметь одинаковую программу, а управляющие сигналы запараллелить(хотя если там будет протокол с ответами, то сложнее)
Эдди
Цитата(Maverick @ Jul 4 2017, 01:43) *
Возможно я чего то не понимаю, зачем брать N микропроцессоров(соответственно плат) и делать сложный протокол обмена между ними и думать про псевдосинхронизацию процессов между ними. Почему не одна ПЛИС и внутренним или внешним одним MCU?

1. Цена: 20-ногие STM8S003 стоят рублей 15 за штучку, 32-ногие STM32F103 — не больше сотни.
2. Простота: ПЛИСину запрограммировать намного сложней. Я, например, ни разу не сталкивался с ПЛИС, и даже не представляю, как в линухе с ними работать!
3. Аппаратный CAN позволяет сильно упростить низкоуровневую составляющую протокола.
4. И самое главное — намного меньше проводов! Если двигатели разнесены по закоулкам прибора, а места там — хоть отбавляй, то куда как красивее и проще будет сделать распределенную систему. К тому же, ее будет проще чинить: легче заменить один выгоревший блок и в офлайне перепаять выгоревшую деталь, нежели выдирать целиком плату управления всем. Если же и в случае централизованной системы делать такой ЗИП, чтобы просто поменять плату, то будет намного дороже и сложней в изготовлении, чем в распределенном варианте.

И да, для совсем уж разовых штучек можно модуль МК делать съемным — берем на ибее "девборды" на STM32F103 по ~120р за штучку — вуаля! Не нужно паять МК (особенно это ценят люди с плохим зрением/моторикой) с обвязкой. Если ток небольшой, силовые ключи без радиаторов поместятся на плате прямо под МК — получится компактный "пирог" суммарной стоимостью максимум рублей в 500.
Jenya7
Цитата(Maverick @ Jul 4 2017, 02:04) *
так не проще сделать это на плис

да я бы с превеликим удовольствием сделал на FPGA. У меня все модули уже реализованы на FPGA. Но я столкнулся с проблемой которую озвучил в теме - Строковый парсер на VHDL.
Это единственная проблема - сопряжение с РС (пользователем).

ставить CPU+FPGA это оверкил.

ставить несколько камней - не вижу смысла. STM32F3 имеет достаточно таймеров для 3-х энкодеров и 3-х PWM.
Хотя я думал сделать модулярно - один аксис мэнэджер и модули отдельно. Есть система с 2 моторами - поставил 2 модуля, с 3 - поставил 3 модуля. Но я отказался от этой затеи. Слишком громоздко.
khach
Для надежности как раз и применяют два STM32 - один занимается математикой и управлением, второй- управляет ШИМ и меряет токи по фазе. На начальной уровне так проще и надежнее. Запихнуть три канала по двигателям в один камень сложновато. Сами STM-ы максимум два двигателя на один контроллер сажали, но там было трехфазное векторное управление. Хотя по слухам были проблемы при большой разности скоростей или режимов двигателей.
Для движков постоянного тока вообще самых мелких STM достаточно, главное чтобы ног на управление ШИМом и энкодером хватило. Ну и система защиты ( датчики тока, температуры, напряжения питания итд).
Был еще вариант с обслуживанием аналоговых синус-косинусных линейных датчиков положения (оптических линеек) за счет АЦП STM32.
jcxz
Цитата(sigmaN @ Jul 3 2017, 12:04) *
А ведь по ним придется принемать решения(т.е. обрабатывать их) вне зависимости от того будет ли там у вас таймер или не таймер....

Около 170кГц? Ну и что? А нужно-ли принимать решение на каждом импульсе от энкодера? laughing.gif
sigmaN
Цитата
А нужно-ли принимать решение на каждом импульсе от энкодера?
Ну учитывая, что по условию задачи энкодеры используются для отслеживания именно положения, то я думаю в том или ином виде обработать каждый импульс придется обязательно!
jcxz
Цитата(sigmaN @ Jul 4 2017, 18:05) *
Ну учитывая, что по условию задачи энкодеры используются для отслеживания именно положения, то я думаю в том или ином виде обработать каждый импульс придется обязательно!

Что-то я не понимаю - зачем для определения положения ротора нужно на каждый импульс что-то делать?? wacko.gif
Большое кол-во импульсов - это только для увеличения разрешения по углу. как я понимаю.
sigmaN
Цитата
Большое кол-во импульсов - это только для увеличения разрешения по углу. как я понимаю.
Правильно. Но если начать их пропускать то о каком отслеживании положения тогда идет речь? Ну т.е. как минимум нужно крутить в программе какой-нибудь счётчик угла....

Именно поэтому я ТСу давно говорил, что исходя из требуемой точности нужно выбрать энкодер.
jcxz
Цитата(sigmaN @ Jul 4 2017, 18:54) *
Правильно. Но если начать их пропускать то о каком отслеживании положения тогда идет речь? Ну т.е. как минимум нужно крутить в программе какой-нибудь счётчик угла....

А почему пропускать-то? Эти импульсы учитываются аппаратным счётчиком, процессор для этого не нужен.
Процессор только в какой-то момент времени считывает накопленное значение из счётчика. Вот такие чтения, как я понимаю, совсем не нужно делать каждый импульс. Таких чтений наверное всего нужно одно или несколько на один оборот вала.
khach
Энкодер с аппаратным таймером считает все импульсы. Таймер генерит прерывание при переполнении и тогда программно учитываются старшие разряды счетчика положений. Другой таймер генерит прерывания с частотой петли ПИД по положения. Вот этот обработчик прерывания и берет текущее положение из энкодера и его старших битов и рассчитывает ошибку по положению. Вообще то в нормальном сервоприводе еще как минимум две петли ПИД будут- по току и по скорости. И петля по положению- самая медленная.
Так что никакие шаги не теряются, вернее могут теряться, если сервопривод пытается делать удержание исполнительного механизма в неподвижности и попадает в дребезг. Тогда могут теряться позиции из за неправильного определения направления. Обычно это корректируется по прерыванию от индексной метки энкодера.
sigmaN
Ну если счётчик аппаратный тогда ОК
Jenya7
Решил вернутся к теме. То есть как решил - жизнь заставила.
Для 3-х моторов взял STM32F303VCT6. Там хватает таймеров для 3-х PWM и 3-х encoders . Но сейчас поставлена задача - управлять пятью моторами. Есть камень с достаточными ресурсами? Не обязательно STM32.
Я бы с большим удовольствием поставил FPGA но цены на них сумашедшие.
HardEgor
Цитата(Jenya7 @ Oct 27 2017, 15:41) *
Я бы с большим удовольствием поставил FPGA но цены на них сумашедшие.

Странно. Вы наверное смотрите что-то из последних моделей, недавно присмотрел себе серию SmartFusion Microsemi - это AFE+Cortex-M3+FPGA в одном чипе, например A2F060 550р. в корпусе TQFP-144.
Jenya7
Цитата(HardEgor @ Oct 27 2017, 17:09) *
Странно. Вы наверное смотрите что-то из последних моделей, недавно присмотрел себе серию SmartFusion Microsemi - это AFE+Cortex-M3+FPGA в одном чипе, например A2F060 550р. в корпусе TQFP-144.

я смотрю чипы от Altera так как я работал только с ними, они мне знакомы, с ними как то легче.
khach
Цитата(Jenya7 @ Oct 27 2017, 10:41) *
Я бы с большим удовольствием поставил FPGA но цены на них сумашедшие.

Цены на них очень приемлемы, особенно с появлением дешевых китайских плат с Циклонами4. Много конструкций на них появилось в последнее время. Но вот вопрос- какую архитектуру Вы планируете впихнуть в эту FPGA?
Будет синтезированное ядро типа ARM или MIPS c сопроцессором плавающей точки для рассчета траектории движения или только ШИМ таймера и таймера-счетчики энкодеров а процессор внешний? Потому что эти два подхода очень разные по требованию к обьему и быстродействию FPGA.
Последняя философия реализована в картах mesa drive http://www.mesanet.com/, для которых и исходники прошивок есть и их достаточно легко адаптировать под любую ПЛИС, хотя изначально там Xilinx применен.
Данные для движения им готовит хост- компьютер, и подает или по PCI, или по Ethernet готовые микрокадры движения. Петли обратной связи по позиции замкнуты через софт.
Хотя после долгого перерыва у них появилась и карта с микропроцессором. 4C81 - WIRELESS ORIENTED PC/104-PCI CPU http://www.mesanet.com/cpucardinfo.html но там полноценный линух используется в виде NetBSD. Соответственно можно пакет править под свои задачи, но это не так уж просто.
Jenya7
спасибо. посмотрю.
mantech
Цитата(Jenya7 @ Jul 2 2017, 11:31) *
Мне нужно сделать драйвер для 3-х двигателей. Двигатели обычные DC Motors 24V. Двигатели имеют энкодеры для отслеживания позиции.


Не знаю, говорилось тут или нет, но зачем тут энкодеры?? Точность в ед. градусов не получить, направление и так известно, достаточно простого датчика оборотов, скажем на магнитоуправляемой МС и простого счетчика в МК. Зачем усложнять себе жизнь?

Цитата(HardEgor @ Oct 27 2017, 15:09) *
Странно. Вы наверное смотрите что-то из последних моделей, недавно присмотрел себе серию SmartFusion Microsemi - это AFE+Cortex-M3+FPGA в одном чипе, например A2F060 550р. в корпусе TQFP-144.


Вот уж ПЛИСы здесь точно из пушки по комарам rolleyes.gif
Огурцов
Цитата(Jenya7 @ Oct 27 2017, 09:41) *
Но сейчас поставлена задача - управлять пятью моторами. Есть камень с достаточными ресурсами?

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


Цитата(mantech @ Oct 29 2017, 09:07) *
Вот уж ПЛИСы здесь точно из пушки по комарам

эта, ничего вы не понимаете, плисы - это это же нереальна крута, обязательно нужно ставить везде в куда попало
khach
Цитата(Огурцов @ Oct 29 2017, 10:31) *
эта, ничего вы не понимаете, плисы - это это же нереальна крута, обязательно нужно ставить везде в куда попало

Ну это от задачи зависит. Например CNC фрезерный станок с задачей фрезеровки внутренней резьбы в отверстиях. Т.е подача по трем осям с хеликальной интерполяцией, при этом скорость подачи задает энкодер шпинделя. При этом шпиндель может притормозить от нагрузки на фрезу, и соответственно надо замедлить подачу. На микроконтроллерах с такой задачей справится оказалось сложно. Пришлось уходить на ПЛИС.

Jenya7
Прихожу к мысли, что нужно делать модуль контроль+сила, который может работать автономно. Причем такой чтоб умел драйвить и 3-х фазные и ДС моторы, так как есть системы с 3-х фазными моторами, еще одно нововведение на мою ж... голову.
А понадобиться драйвить Х осей - связывать модули по CAN/SPI/UART c мастером который будет axis manager.
mantech
Цитата(Jenya7 @ Oct 29 2017, 13:04) *
Прихожу к мысли, что нужно делать модуль контроль+сила, который может работать автономно. Причем такой чтоб умел драйвить и 3-х фазные и ДС моторы, так как есть системы с 3-х фазными моторами, еще одно нововведение на мою ж... голову.
А понадобиться драйвить Х осей - связывать модули по CAN/SPI/UART c мастером который будет axis manager.


У вас похоже кто-то не особо дружит с головой, кто ТЗ делает, ибо целиком задачу не видит и каждый раз придумывает что-то новое. Тут выход один - делать что-то сверхмасштабируемое и дорогое или сменить конструктора по ТЗ biggrin.gif
Огурцов
Цитата(khach @ Oct 29 2017, 10:35) *
На микроконтроллерах с такой задачей справится оказалось сложно

а тригонометрию вы покупали ? а реализация сколько ячеек заняла ? для мк же оно ничего не стоит ни по софту, ни по ресурсам, т.е. реальный ноль - хоть $3 за 6 осей
Jenya7
Вот решение близко к идеальному. https://geektimes.ru/post/286324/
khach
Цитата(Огурцов @ Oct 29 2017, 14:24) *
а тригонометрию вы покупали ?

Нет, CORDIC использовали условно-бесплатный для аппроксимации траектории между базовых точек. На самом деле это был жуткий колхоз, т.к сначала предполагалось использовать станок в режиме нарезания резьбы метчиками ( синхронная с вращением шпинделя подача по Z оси) но конструкторы промахнулись по моменту привода шпинделя). Тогда появилась идея с фрезерованием резьбы, но используемые контроллеры при интерполяции делали граненные отверстия, куда винты не вкручивались. И тогда была слеплена приспособа на ПЛИС которая в режиме step-dir рулила приводами в "ручном режиме" в цикле фрезерования резьбы, при этом грубая траектория прогружалась в виде таблицы снаружи, а ПЛИС занималась интерполяцией траектории и синхронизацией всех осей.
Я к тому, что это весьма специфический случай был и межконтроллерное взаимодействие ( каждая ось привода имела свой сервоконтроллер промышленный и отдельный контроллер оптической линейки) не справилось с задачей т пришлось лепить костыли. Если бы там был EtherCAT, то возможно бы и успели, но был обычный profibus.
Тут вся проблема, как делить петлю обратной связи относительно интерфейса и успеет ли она в риалтайме. Как пример картинка.
Нажмите для просмотра прикрепленного файла
PS. http://www.iftomm2015.tw/IFToMM2015CD/PDF/OS13-011.pdf
Вот такое потяните в одиночку?
Огурцов
Цитата(khach @ Oct 29 2017, 12:55) *
условно-бесплатный

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

Цитата(khach @ Oct 29 2017, 12:55) *
ПЛИС занималась интерполяцией траектории

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

Цитата(khach @ Oct 29 2017, 12:55) *
Если бы там был EtherCAT, то возможно бы и успели, но был обычный profibus.

обычный profibus, это который медный на уарте ? ну ой, взяли бы хотя бы голый уарт, сильно урезавшись в хотелках, можно было организовать обмен, иначе никак
сразу ethercat - другая крайность, эзернета было бы достаточно, хотя да, это должен был быть точно не обычный эзернет, обычный легко может случиться медленнее чем profibus

Цитата(khach @ Oct 29 2017, 12:55) *
Вот такое потяните в одиночку?

да всё что угодно, буде время и деньги
khach
Цитата(Огурцов @ Oct 29 2017, 16:14) *
обычный profibus, это который медный на уарте ? ну ой, взяли бы хотя бы голый уарт, сильно урезавшись в хотелках, можно было организовать обмен, иначе никак
сразу ethercat - другая крайность, эзернета было бы достаточно, хотя да, это должен был быть точно не обычный эзернет, обычный легко может случиться медленнее чем profibus

Ну да, обычный медный RS485 с телеграммами profidrive разогнанный то ли до 6 то ли до 12 мегабит ( длина кабеля определяла максимальную скорость). Менять это как? Фирмварь сервоприводов недоступна. Конечно можно менять сервоприводы на более продвинутые, с тем же ethercat ( profinet варианта в каталоге просто не было).
gosha-z
Цитата(Jenya7 @ Oct 29 2017, 15:25) *
Вот решение близко к идеальному. https://geektimes.ru/post/286324/

Автор в этой теме уже выступал.
AlexandrY
Цитата(Jenya7 @ Oct 29 2017, 14:25) *
Вот решение близко к идеальному. https://geektimes.ru/post/286324/

Хороший выбор. wink.gif
У меня уже вышла 3-я версия этого контроллера.
Но никак руки не дойдут зафиксить и выложить релиз.
Все время идут изменения.
Обязательное условие для применения моего фреймворка это использование RTOS MQX и IAR не выше 7.80.1 поскольку только до этой версии поддерживается плагин для MQX 4.2
Уровень OS abstraction layer я не применяю.

Тут недавно приложение для этой платы сделал - прграммируемый генератор пачек импульсов произвольной скважности.
В пределе на единичном выходе получаю 50% ШИМ частотой 500 кГц с токами до 100А.
В последней моей версии стоит гальваноизолированный CAN.
Можно без опасений соединять CAN-ом разбросанную сеть таких плат управляющих моторами в несколько сот ватт.
khach
Цитата(AlexandrY @ Oct 29 2017, 16:58) *
В последней моей версии стоит гальваноизолированный CAN.
Можно без опасений соединять CAN-ом разбросанную сеть таких плат управляющих моторами в несколько сот ватт.

Это хорошее дело, особенно при таких токах. А вот можете посоветовать стек протокола в исходниках, на основе которого можно много осей синхронизировать? Желательно совместимый с чем- либо стандартным типа canopen.


Огурцов
Цитата(khach @ Oct 29 2017, 16:35) *
canopen

вам может сильно не хватить мегабита, коль уж двенадцати не хватило

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.