Время рулить.

Буквально в двух шагах отсюда есть интересная статья об устройстве и принципе работы рулевых машинок. Есть и пример управляющей программы на ассемблере. I don't speak Assembler и, поэтому запилил свой проект с FPGA и семисегментными индикаторами. Схема позволяет крутить рулевую машинку и одновременно видеть продолжительность(в микросекундах) управляющих импульсов. Кстати, как оказалось, то, что я смиксовал существует в виде самостоятельных устройств. Для эксперимента можно можно подкинуть гуглу фразу "R/C servo tester".
R/C servo tester
Пробежимся по схеме.
Схема проекта

/***************** servo_tester.v ******************/

module servo_tester (input  wire       clock,
                     input  wire       left_button,
                     input  wire       right_button,
                     output wire       servo_pulse,
                     output wire [7:0] segments,
                     output wire [3:0] digits);

wire                uclock;
wire [11:0] pulse_duration;

micro_counter MC1(clock, uclock);

button_control BC1(uclock, left_button, right_button, pulse_duration);

rc_servo RCS1(uclock, pulse_duration, servo_pulse);

ss4d D1(clock, pulse_duration, segments, digits);

endmodule

/***************** servo_tester.v ******************/

Основоной исходник как всегда прост. Только провода и вызовы модулей. С некоторых пор я стараюсь помещать в отдельный черный ящик даже тот код, который, скорее всего больше нигде не применю. Потому, что это помогает сразу построить наглядную схему.
Если присмотреться, видно, что на входе в модуль ss4d пара проводов в шине помечена как not connected в данном случае это нормально, но вообще такие вещи должны вас настораживать, так как это может быть результатом ошибки в соединениях.

/************** micro_counter.v ****************/

module micro_counter (input  wire clock,
                      output wire uclock);
reg [5:0] micro_reg;
reg       micro_bit;

assign uclock = micro_bit;

always @ (posedge clock)
  begin
    micro_bit <= (micro_reg < 25) ?       1         : 0;
    micro_reg <= (micro_reg < 50) ? (micro_reg + 1) : 0;
  end

endmodule

/************** micro_counter.v ****************/

Модуль micro_counter нужен для получения импульсов с периодом 1 мкс. Чтобы удобнее было потом выводить информацию на индикатор.

/******************* button_control.v *********************/

module button_control(input  wire        uclock,
                      input  wire        left_button,
                      input  wire        right_button,
                      output wire [11:0] pulse_duration);

reg [11:0] pd_reg;
reg  [9:0] button_check_reg;

assign pulse_duration = pd_reg;

always @ (posedge uclock)
  begin
    if ((button_check_reg == 0) && 
        (left_button) && 
        (!right_button) && 
        (pd_reg > 250)) pd_reg <= pd_reg - 1;
    
    if ((button_check_reg == 0) && 
        (!left_button) && 
        (right_button) && 
        (pd_reg < 2500)) pd_reg <= pd_reg + 1;
    
    if ((pd_reg > 2500) || (pd_reg < 250)) pd_reg <= 1000;
      
    button_check_reg <= button_check_reg + 1;
  end
endmodule

/******************* button_control.v *********************/

В button_control сложена основная логика, задано исходное положение. На вход модуля подаются сигналы с кнопок управления. На выходе — значение продолжительности управляющих импульсов. Оно отправляется на индикатор и модуль rc_servo, который формирует импульсы для рулевой машинки.

/********************* rc_servo.v ******************/

module rc_servo (input  wire                uclock,
                 input  wire [11:0] pulse_duration,
                 output wire                 pulse);

reg [14:0]    pf_reg;
reg        pulse_bit;

assign pulse = pulse_bit;

always @ (posedge uclock)
  begin
    pulse_bit <= (pf_reg < pulse_duration) ?       1      : 0;
    pf_reg    <= (pf_reg < 20000)          ? (pf_reg + 1) : 0;
  end

endmodule

/********************* rc_servo.v ******************/

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

В моем коде продолжительность управляющих импульсов находится в диапазоне 250 мкс — 2500 мкс. На записи заметно когда рулевая машинка упирается в ограничители и жужит пытаясь добраться до положения которое я ей задал. Можно примерно прикинуть, что для данной машинки диапазон продолжительности импульса примерно 400 — 2200 мкс. Пару раз я специально заливаю прошивку заново, чтобы продемонстрировать, что происходит при инициализации схемы.
  • 0
  • 20 июня 2011, 18:46
  • digides

Комментарии (12)

RSS свернуть / развернуть
Хе-хе, месье знает толк в расстреле воробьев из орбитальной пушки)
А на какой ПЛИС оно сделано и сколько оная стоит?
0
  • avatar
  • Vga
  • 20 июня 2011, 19:50
))) О майн фринд. Дас ист гут пушка. Партизанен пуф-пуф.
Вообще плата довольно крутанская. Моя сделана на Altera Cyclone III и в неё мог бы поместиться 286-й, если не круче. Осталось только выкурить еще пару гигов схемотехники. Стоит она баксов 150.
А данный проект, я думаю должен помещаться в тот Max II, который на «марсоходе» стоит. Компилятор говорит, что получилось 248 LE.
0
А почему ПЛИСины дорогие такие? В плате ж поди большая часть цены на циклон 3 и приходится.
0
Не все так дорого стоит. Начинается все с ценника рублей в 600 — 700. Это будет плата с ПЛИС, кварцем, разъемами для программатора, регулятором напряжения. Комплект с программатором немного дороже.
0
Не все так дорого стоит. Начинается все с ценника рублей в 600 — 700. Это будет плата с ПЛИС, кварцем, разъемами для программатора, регулятором напряжения. Комплект с программатором немного дороже.
У меня в комплекте была сама плата с ПЛИС, плата расширения с разными интерфейсами и программатор.
0
У ПЛИСок цена сильно зависит не только от емкости но и от максимального быстродействия. Стоимость одной и той же микросхемы с минимальным и максимальным градиентом скорости может различаться в разы.
0
а давайте всё же разделять cpld и fpga.
всё-таки изделия разных миров и общего в них только возможность конфигурирования

уж не знаю как у альтеры, но у ксилинса (да, да, знаю что правильно зайлинкс) попытки упаковать даже чуть более сложное чем простейшие забавы на хдл в кплд заканчивались полным фиаско: вылезало за размеры xc95288
0
Попробовал скомпилировать под Max II. В «марсоходовский» действительно не влезло потому, что его емкость 240 LE, а не 250 как мне казалось. А в следующий по размерам(570 LE), формально, поместилось. Не могу утверждать, что успешно, так как не имею такой железки для эксперимента. Но само количество логических элементов практически не изменилось — 246 и 248. Похоже «логический элемент» у Альтеры — понятие универсальное. И его все таки можно использовать для примерной оценки.
В устройстве Максов и Циклонов действительно есть серьезные отличия, только в данном проекте они не используются. Грубо говоря в Альтеровских CPLD есть только логические элементы, а в FPGA еще есть память, блоки умножения наверно(не знаю как их по русски назвать)Embedded Multipliers и PLLs (пока не знаю как их задействовать, судя по описанию, крутые штуки).
0
Может стоит тему в ПЛИС перенести?
0
Я не против. Не пишу сразу в тематический блог потому, что не знаю уровень своих статей. Подходит. Не подходит. Нужно только разобраться как это технически осуществляется.
0
Если статья содержит постановку задачи и законченное ее решение с примерами кода, картинками и оформлена не в стиле «мыслепоток» то переносить можно и нужно.

Эта вполне достойна переноса в коллективный.
0
Ну, а то как это сделать технически написано тут:
we.easyelectronics.ru/page/about/

Ваши статьи я уже перенес.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.