Перейти к содержанию
    

cpl

Свой
  • Постов

    385
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о cpl

  • Звание
    Местный
    Местный

Контакты

  • ICQ
    Array

Посетители профиля

4 387 просмотров профиля
  1. Здравствуйте коллеги ! Прощу помощи разобраться, что к чему... Поручили мне разработку софта контроллера управления автоматическими дверями. Это мой первый проект с ТАУ. Устройство механизма следующее: Две створки, через ролики подвешиваются на рельсу, по которой осуществляется перемещение. Сами створки крепятся в ремню. На одном конце устанавливается двигатель постоянного тока с редуктором, на другом натяжной ролик. В крайних положения есть упоры. На валу двигателя установлен квадратурный энкодер. По электроники: Микроконтроллер по средствам ШИМ управляет Н-Мостом к которому подключен ДПТ (100Вт). Микроконтроллер получает данные от: квадратурного энкодера(текущая скорость, и подсчет пройденного пути), АЦП датчика тока в цепи мотора и АЦП входного питающего напряжения. Алгоритм калибровки(первый запуск): 1. Измерение длинны пути от края до края. 2. Реакция системы на ступенчатое воздействие. Из крайнего положения производится ускоренное движение до 1/3 пути. По отклику системы по методу Циглера–Никольса программно определяются параметры ПИД регулятора скорости. По тз длинна может быть разной, масса створок тоже заранее не известна. Параметры двигателя известны, количество шагов энкодера тоже (500 ед. на оборот). Штатная работа: Весь участок делиться на 5 частей: плавный старт, разгон, равномерное движение, торможение, медленное доведение до крайней точки(чтобы створка не ударялась об упор или друг об друга). Реализация: Что получается есть ПИД регулятор по скорости, на вход которого подаются значения уставки скорости из таблицы. Т.е. зная текущее положение двери -> выдается значение уставки скорости. И все бы хорошо, но есть большая задержка между тем что выдал ПИД и тем как это отрабатывает мотор. При разгоне это не критично, а вот при подходе к крайней точке скорость оказывается слишком велика что приводит к удару. Т.е. в текущем варианте реализации получаемая(реальная) скорость как бы соответствует теоретической скорости уставки но сдвинутой на величину задержки. Вопрос как побороть или учесть задержку ? На графиках: Желтый - уставка скорости, Синий - реальная скорость с энкодера, Зеленый - участок пути. Резкий сброс скорости ПИД, до половины. Плавное снижение скорости: VПИД=10, Vэнкодера=55 ! Если на участке торможения замкнуть двигатель на землю то дверь производит резкую остановку в несколько раз быстрее чем по ПИД. Получается торможение двигателем по ПИД не эффективно, мотор ведет себя как "ватный". Не совсем разобрался с эффектом, но получается двигатель превращается в генератор и это не дает ему погасить скорость ? (т.к. двери толкают мотор по инерции). Такая схема построения регулятора корректна, а то берут сомнения ? Вопрос что нужно сделать чтобы точно приходить в конечную точку с заданной скоростью ? Правильно ли я понимаю что необходимо переходить к подчиненному управлению, для улучшения точности регулирования ? и добавить еще один ПИД регулятор по положению, а то что у меня сейчас реализовано (управление по положению), это получилось разомкнутое управление ? На сколько поможет если использовать три контура (третий по току) ?
  2. вариант реализации передачи UDP пакета: https://lab85.ru/index.php/laboratoriya-stati/30-ethernet-peredacha-paketa
  3. Для информации: M25P80 не прошивается через jtag (ft2232h).... Плата своя: GW2A18QFN88 + M25P80. Программатор SPI FLASH не видит.... (SRAM загружает без проблем). Поставил winbond (то что было под рукой W25Q32BV) работает...
  4. Для GW2A-LV18PG256S. А как определить достаточный объем SPI FLASH, если в документации не указано ? К примеру у меня есть M25P80 (1M x 8), её хватит или нет ? Разобрался, нашел, таблицу с указанием объема необходимой конфигурационной флеши.
  5. Какие SPI FLASH подходят для GW2A в качестве загрузочных ? Минимальный размер, фирмы производители, ограничения может есть какие ? Искал в разделе документации на сайте и не нашел...
  6. Разъем fx2-100s-1.27dsl

    Разъем fx2-100s-1.27dsl стоимость 1шт = 500 руб Есть в наличии 35 шт.
  7. Точно так и есть, отрабатывал глобальный ресет. Спасибо.
  8. Моделирую вывод DDR данных.(Spartan 6, QuestaSim) Наткнулся на странное поведение компонента ODDR2. При старте моделирования ПЕРВЫЕ данные на выходе ODDR2 появляются только через 12 тактов, до этого 00. Не пойму в чем причина, что не так делаю ? тестбенч прилагаю. `timescale 1ns / 1ps module top( input wire i_clk_tx_0, input wire i_clk_tx_180, input wire i_rst, output wire [5:0] o_tx_data_ddr , output wire [5:0] o_debug1 , output wire [5:0] o_debug2 ); reg tx_ce = 1; // CE для ODDR2 reg [23:0] fifo_rd_data = 24'b1111_11__00_0001__1010_10__00_0010; wire [5:0] d0; wire [5:0] d1; reg rst = 0; assign d0 = fifo_rd_data[23:18]; assign d1 = fifo_rd_data[11:6]; reg [4:0] st = 0; reg [1:0] empty_cnt = 0; reg [7:0] delay = 0; always @(posedge i_clk_tx_0) begin case(st) 0: begin delay <= delay + 1'b1; if (delay == 2) begin delay <= 0; // rst <= 0; st <= st + 1'b1; end else begin // rst <= 1; end end 1: begin delay <= delay + 1'b1; st <= st + 1'b1; end 2: begin $display("fifo_rd_dataR = 0x%x 0x%x 0x%x 0x%x", fifo_rd_data[23:18], fifo_rd_data[17:12], fifo_rd_data[11:6], fifo_rd_data[5:0]); fifo_rd_data[23:12] <= fifo_rd_data[23:12] + 1'b1; fifo_rd_data[11:0] <= fifo_rd_data[11:0] + 1'b1; if (delay == 100) st <= 3; else st <= 1; end 3: begin end default: st <= 0; endcase end ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst0 ( .Q ( o_tx_data_ddr[0] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[0]), // 1-bit data input (associated with C0) .D1 ( d1[0]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst1 ( .Q ( o_tx_data_ddr[1] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[1]), // 1-bit data input (associated with C0) .D1 ( d1[1]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst2 ( .Q ( o_tx_data_ddr[2] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[2]), // 1-bit data input (associated with C0) .D1 ( d1[2]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst3 ( .Q ( o_tx_data_ddr[3] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[3]), // 1-bit data input (associated with C0) .D1 ( d1[3]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst4 ( .Q ( o_tx_data_ddr[4] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[4]), // 1-bit data input (associated with C0) .D1 ( d1[4]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); ODDR2 #( .DDR_ALIGNMENT("C1"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1 .SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset ) ODDR2_inst5 ( .Q ( o_tx_data_ddr[5] ), // 1-bit DDR output data .C0 ( i_clk_tx_180 ), // 1-bit clock input .C1 ( i_clk_tx_0 ), // 1-bit clock input .CE ( 1'b1), // 1-bit clock enable input // .CE ( tx_ce), // 1-bit clock enable input .D0 ( d0[5]), // 1-bit data input (associated with C0) .D1 ( d1[5]), // 1-bit data input (associated with C1) .R ( rst), // 1-bit reset input .S ( 1'b0) // 1-bit set input ); assign o_debug1 = d0; assign o_debug2 = d1; endmodule ODDR2_test.zip
  9. ADSP-BF518BSWZ-4F4

    Здравствуйте, год выпуска? какая ревизия ?
  10. Отладочная плата StarterKit SK-iMX53. Комплект: Плата + СД диск. Состояние: Отличное. Стоимость: 4000 руб. +79162127280
  11. Продана, просьба закрыть тему.
  12. Продам отладочную плату плата SBC8018+LCD cpu AM1808. 5000 руб. email: sgot () inbox.ru
  13. Нашел проблему, (потратив несколько дней.... новый проц новые приключения, да еще в бареметале.....) Debug configurations -> вкладка Target -> галка Enable Semihosting (requires setting a breakpoint at SVC_Handler) галку нужно УБРАТЬ. :smile3046:
×
×
  • Создать...