О PWM немало песен сложено...

Сомневался стоит ли писать про управление моторчиками постоянного тока. На МК задача решена уже неизвестно сколько раз. Но уж больно предыдущий "франкенштейн" просится на переделку. Проверил на всякий случай сайт "Марсохода". Не написали. Есть интересная постапокалиптическая статья о на тему: "Что из какой, отжившей свое, техники можно добыть". Есть готовые проекты движущейся техники, только они сделаны на основе LPM-ов и также легко, как код на языке высокого уровня, в другой чип не переносятся. Синтез завершается ошибкой. Получаем сообщение, что данный LPM не предназначен для данного чипа. Возможно есть средства безпроблемного переноса, но мне они не известны. Ждем комментариев экспертов.

Чем же схема управления рулевой машинкой может быть полезна в управлении коллекторным двигателем? Так как мы собираемся крутить маленький двигатель, то у нас есть два способа влиять на его вращение — изменять напряжение и прикладывать постоянное напряжение, но в виде импульсов определенной частоты и продолжительности. Второй способ называется широтно-импульсная модуляцией. Частота импульсов остается постоянной, а продолжительность импульсов может изменяться от нуля до величины периода колебаний, когда на двигатель фактически подается постоянное напряжение. Отношение периода импульсов к их продолжительности называется коэффициентом заполнения.

Принцип ясен. Теперь мы можем сравнить схему управления рулевой машинкой и виртуальную схему управления коллекторным моторчиком. Первая схема получает тактовый сигнал и управляющее воздействие, а выдает импульсы с частотой 50 — 100 Гц и продолжительностью 0.8 — 2.2 мс (4-12% периода). Вторая получает тоже самое, а выдает импульсы с частотой f и продолжительностью 0-100% периода. То есть основное, практически единственное, отличие двух схем — параметры импульсов. Здорово! А в чем подвох? В объекте управления. В том что он с этим импульсом делает. Рулевая машинка изменяет в зависимости от параметров импульса угол поворота своего вала и содержит в себе силовую часть. Коллекторный мотор не имеет силовой части (то есть нам еще нужно что-то добавить между управляющей схемой и двигателем). Мотор, в зависимости от параметров импульса (и момента сопротивления валу), изменяет частоту своего вращения.

Вариантов силовой части может быть много. Создатели "Марсохода", например, обошлись параллельным подключением выводов CPLD. Есть весьма популярная микросхема L293D . А у меня завалялась схема на TC1427CPA и силовых МОП-транзисторах IRLI3705N.

Задача ясна. Осталось взять проект servo_tester и немного обработать напильником.
В основном файле изменения почти косметические — изменилась разрядность одной из шин. Поменялись некоторые названия.


/******************* dc_motor_driver.v *******************/

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

wire               uclock;
wire [9:0] pulse_duration;

micro_counter MC1(clock, uclock);

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

dc_motor DCM1(uclock, pulse_duration, pwm_pulse);

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

endmodule

/******************* dc_motor_driver.v *******************/

Из button_control убрана проверка выхода продолжительности импульса за границы допуска.

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

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

reg [9: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 > 0)) pd_reg <= pd_reg - 1;
    
    if ((button_check_reg == 0) && 
        (!left_button) && 
        (right_button) && 
        (pd_reg < 1023)) pd_reg <= pd_reg + 1;
    
    button_check_reg <= button_check_reg + 1;
  end
endmodule

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

Модуль dc_motor чуть проще, чем rc_servo — период колебаний задается только разрядностью регистра.

/******************* dc_motor.v *******************/

module dc_motor (input  wire               uclock,
                 input  wire [9:0] pulse_duration,
                 output wire                pulse);

reg [9: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 + 1;
  end

endmodule

/******************* dc_motor.v *******************/

micro_counter и ss4d остались на своих местах.

Теперь можно посмотреть, как схема работает.
В первом видео изменяю параметры ШИМ-сигнала, чтобы показать как это влияет на работу моторчика. Как мы можем видеть, при коэффициенте заполнения менее 0.18 двигатель не крутится, при 0.19-0.23 двигатель не может преодолеть силу трения покоя (первое, что приходит в голову из Физики) и если его подтолкнуть, начинает вращаться, ну и при коэффициенте заполнения 0.23-1.00 уверенно вращается. Конечно следует добавить, что двигатель не нагружен и, если он будет куда-нибудь установлен, значения поменяются.

Второй ролик снят для демонстрации того, как изменяется напряжение на выводах моторчика в зависимости от коэффициента заполнения.
  • 0
  • 23 июня 2011, 02:24
  • digides

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

RSS свернуть / развернуть
безотносительно к проделаной работе, но, ИМХО, видео в которых нет ни комментариев, ни наложеной поверх фоновой музыки, смотрятся очень уныло. Что происходит во втором ролике — так и не догнал.
0
Фоновый звук я специально не менял, чтобы было слышно работу движка. А комментарии конечно добавлю.
0
Для этого на вал мотора ставится кружок с секторами — тогда обороты будут виднЫ.
0
Хех… тоже как-то думал не тему, написать статью про ШИМ с несколькими примерами реализации на Verilog, но решил, что никому интересно не будет =)
0
Больше было бы интересней какую нибудь цветомузыку сделать. Как никак это ПЛИС, как раз бы пришлось использовать ее мощные возможности в области ЦОС.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.