|
|
  |
Контролер для 3-х двигателей. |
|
|
|
Jul 3 2017, 20:04
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(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 - результат контролируем с помощью квадратурного декодера (в реализации обычный компаратор) Вместо двупортовой памяти можно взять двуклоковое фифо Как в плис сделать из одного модуля три думаю догадаетесь  Если хотите внешний MCU то предлагаю сделать соединение с ПЛИС с помощью external memory interfacе, т.е чтобы MCU видело ПЛИС как свою память ОЗУ + пару пинов для организации обмена прерываниями(окончанием работы(выполнения команды и др)) тогда в ПЛИС делаете двойной буфер и будет отличное решение Возможно не понадобится делать протокол обмена (парсер как Вы это назвали) Как то так...
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 3 2017, 22:21
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

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

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(Эдди @ Jul 4 2017, 01:21)  Вот это, кстати, верно замечено. Я и сам предыдущей железяке (5 шаговиков, куча концевиков и Холлов, затвор на TLE5205 с контролем замыкания/обрыва, 8 платиновых термодатчиков, 8 DS18S20…) делал модуль управления на одном МК. Замучился, но работает. Но кабель получился жирным! Правда, там все механизмы внутри криостата — МК и силовые ключи туда не засунуть. Но вот новые железки, которые при Н.У. работают, собираюсь все-таки модульными делать: проще по 1МК (+драйвер[ы]) на 1-2 ШД с концевиками сделать и связать их CAN-шиной, нежели городить жуткий жгут проводов и огромную плату-контроллер! Возможно я чего то не понимаю, зачем брать N микропроцессоров(соответственно плат) и делать сложный протокол обмена между ними и думать про псевдосинхронизацию процессов между ними. Почему не одна ПЛИС и внутренним или внешним одним MCU? ПЛИС производит считывание с датчиков и управляет моторами. MCU производит управление ПЛИС и связь с внешним миром Сейчас SoC относительно не дорогие
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Jul 4 2017, 02:01
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(Maverick @ Jul 3 2017, 23:43)  зачем брать N микропроцессоров(соответственно плат) N микропроцессоров всё ещё гораздо дешевле, чем 1 fpga, проще, потому что абсолютно одинаковые, и могут быть пространственно разнесены, потому что на разных платах, и маленькие одинаковые платы дешевле в мелкой серии, даже при равной площади, чем одна большая
|
|
|
|
|
Jul 4 2017, 05:17
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(Maverick @ Jul 4 2017, 01:43)  Возможно я чего то не понимаю, зачем брать N микропроцессоров(соответственно плат) и делать сложный протокол обмена между ними и думать про псевдосинхронизацию процессов между ними. Почему не одна ПЛИС и внутренним или внешним одним MCU? 1. Цена: 20-ногие STM8S003 стоят рублей 15 за штучку, 32-ногие STM32F103 — не больше сотни. 2. Простота: ПЛИСину запрограммировать намного сложней. Я, например, ни разу не сталкивался с ПЛИС, и даже не представляю, как в линухе с ними работать! 3. Аппаратный CAN позволяет сильно упростить низкоуровневую составляющую протокола. 4. И самое главное — намного меньше проводов! Если двигатели разнесены по закоулкам прибора, а места там — хоть отбавляй, то куда как красивее и проще будет сделать распределенную систему. К тому же, ее будет проще чинить: легче заменить один выгоревший блок и в офлайне перепаять выгоревшую деталь, нежели выдирать целиком плату управления всем. Если же и в случае централизованной системы делать такой ЗИП, чтобы просто поменять плату, то будет намного дороже и сложней в изготовлении, чем в распределенном варианте. И да, для совсем уж разовых штучек можно модуль МК делать съемным — берем на ибее "девборды" на STM32F103 по ~120р за штучку — вуаля! Не нужно паять МК (особенно это ценят люди с плохим зрением/моторикой) с обвязкой. Если ток небольшой, силовые ключи без радиаторов поместятся на плате прямо под МК — получится компактный "пирог" суммарной стоимостью максимум рублей в 500.
Сообщение отредактировал Эдди - Jul 4 2017, 05:21
|
|
|
|
|
Jul 4 2017, 06:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Maverick @ Jul 4 2017, 02:04)  так не проще сделать это на плис да я бы с превеликим удовольствием сделал на FPGA. У меня все модули уже реализованы на FPGA. Но я столкнулся с проблемой которую озвучил в теме - Строковый парсер на VHDL. Это единственная проблема - сопряжение с РС (пользователем). ставить CPU+FPGA это оверкил. ставить несколько камней - не вижу смысла. STM32F3 имеет достаточно таймеров для 3-х энкодеров и 3-х PWM. Хотя я думал сделать модулярно - один аксис мэнэджер и модули отдельно. Есть система с 2 моторами - поставил 2 модуля, с 3 - поставил 3 модуля. Но я отказался от этой затеи. Слишком громоздко.
Сообщение отредактировал Jenya7 - Jul 4 2017, 06:49
|
|
|
|
|
Jul 4 2017, 15:54
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Большое кол-во импульсов - это только для увеличения разрешения по углу. как я понимаю. Правильно. Но если начать их пропускать то о каком отслеживании положения тогда идет речь? Ну т.е. как минимум нужно крутить в программе какой-нибудь счётчик угла.... Именно поэтому я ТСу давно говорил, что исходя из требуемой точности нужно выбрать энкодер.
--------------------
The truth is out there...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|