5-Microstep Drive. Xilinx CPLD

mura

Вот это компилится Максом.
//`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: Oleg
//
// Create Date: 09:45:02 11/04/2009
// Design Name:
// Module Name: uStep
// Project Name:
// Target Devices: XC2C64A-7VQ44C
// Tool versions:
// Description: 80V 8A Stepper Motor Driver
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uStep(CLK, AIN, BIN, DIR, STP, OSCA, RES,
STBY,
ASIN, BSIN, DUMP, A0, A1, B0, B1, OSCB-);

input CLK, AIN, BIN, DIR, STP, OSCA, RES;
inout STBY;
output ASIN, BSIN, DUMP, A0, A1, B0, B1, OSCB;
wire [2:0] QA;
wire [7:0] QB;
wire [1:0] QC;
wire [2:0] QD;
wire G01,G02,G03,G04,G05,G06,G07,G08,G09;
wire G11,G12;
wire G17;
//T_BASE--------------------------------------------------------------------------
CB8R C03 (.C(CLK), .R(G14), .Q(QB-));
DF F12 (.C(CLK), .D(G24), .R(0), .CE(1), .S(~STBY), .Q(Q12));
assign DUMP = ~Q12 ? 1’bz : 1’b0;
assign G24 = QB[7] & QB[6] & QB[5] & QB[4];
assign OSCB = ~OSCA;
//PH_GEN--------------------------------------------------------------------------
DF F02 (.C(CLK), .D(DIR), .R(0), .S(0), .CE(G16), .Q(Q02));
DF F03 (.C(CLK), .D(STP), .R(0), .S(0), .CE(1), .Q(Q03));
DF F04 (.C(CLK), .D(Q03), .R(0), .S(0), .CE(1), .Q(Q04));
DF F05 (.C(CLK), .D(G16), .R(0), .S(0), .CE(1), .Q(Q05));
CB2BRE C00 (.C(CLK), .UD(Q02), .R(~RES), .CE(G14), .Q(QC));
CB3BRE C01 (.C(CLK), .UD(G13), .R(~RES), .CE(G15), .Q(QA));
CB3RE C02 (.C(CLK), .R(Q05), .CE(G18), .Q(QD));
assign G12 = QC[1] ^ QC[0];
assign G13 = QC[0] ^ Q02;
assign G11 = ( G13 & QA[2]) | (~G13 & ~QA[2] & ~QA[1] & ~QA[0]);
assign G14 = G11 & Q05;
assign G15 = ~G11 & Q05;
assign G16 = Q03 & ~Q04;
assign G17 = QD[2] & QD[1] & QD[0];
assign STBY = ~G17 ? 1’bz : 1’b0;
assign G18 = ~G17 & QB[7] & QB[6] & QB[5] & QB[4] & QB[3] &QB[2] & QB[1] & QB[0];
//SIN_COS-------------------------------------------------------------------------
DF F00 (.C(CLK), .D(G00), .R(G05), .S(0), .CE(1), .Q(Q00));
DF F01 (.C(CLK), .D(G10), .R(G05), .S(0), .CE(1), .Q(Q01));
assign G01 = QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G02 = ~QA[2] & QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G03 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G04 = ~QA[2] & ~QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G06 = ~QA[2] & ~QA[1] & ~QA[0] & QB[2] & QB[0];
assign G07 = ~QA[2] & ~QA[1] & QA[0] & QB[3] & QB[2] & QB[1] & QB[0];
assign G08 = ~QA[2] & QA[1] & ~QA[0] & QB[4] & QB[2] & QB[1] & QB[0];
assign G09 = ~QA[2] & QA[1] & QA[0] & QB[4] & QB[3] & QB[2] & QB[0];
assign G00 = Q00 | G01 | G02 | G03 | G04;
assign G10 = Q01 | G06 | G07 | G08 | G09;
assign G05 = ~QB[4] & ~QB[3] & ~QB[2] & ~QB[1] & ~QB[0];
assign BSIN = ~Q01 ? 1’bz : 1’b0;
assign ASIN = ~Q00 ? 1’bz : 1’b0;
//PH_DRV----------------------------------------
DF F06 (.C(CLK), .D(G20), .R(G19), .S(0), .CE(1), .Q(A0));
DF F07 (.C(CLK), .D(~G20), .R(G19), .S(0), .CE(1), .Q(A1));
DF F08 (.C(CLK), .D(G22), .R(G19), .S(0), .CE(1), .Q(B0));
DF F09 (.C(CLK), .D(~G22), .R(G19), .S(0), .CE(1), .Q(B1));
DF F10 (.C(CLK), .D(G21), .R(G24), .S(0), .CE(1), .Q(Q10));
DF F11 (.C(CLK), .D(G23), .R(G24), .S(0), .CE(1), .Q(Q11));
assign G19 = ~RES | (STBY & (QB[7] | QB[6]));
assign G22 = Q11 ^ QC[1]; //assign G22 = Q11 ^ QD[1];
assign G23 = Q11 | ~BIN;
assign G20 = Q10 ^ G12;
assign G21 = Q10 | ~AIN;
//the rest of the main module code here:
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module DF (D, C, CE, R, S, Q);
input D, C, CE, R, S;
output Q;
reg df;
always @(posedge C)
if ®
df <= 1’h0;
else if (S)
df <= 1’b1;
else if (CE)
df <= D;
assign Q = df;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB8R (C, R, Q);
input C, R;
output [7:0] Q;
reg [7:0] count;
always @(posedge C)
if ®
count <= 0;
else
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-
module CB2BRE (UD, R, CE, C, Q);
input UD, R, CE, C;
output [1:0] Q;
reg [1:0] u_d;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
//////////////////////////////////////////////my add///////////////////////////////////-
module CB3BRE (UD, R, CE, C, Q);
input UD, R, CE, C;
output [2:0] Q;

reg [2:0] u_d;
always @(posedge C)
if ®
u_d <= 0;
else if (CE)
if (UD) begin
u_d <= u_d + 1;
end
else begin
u_d <= u_d - 1;
end
assign Q = u_d;
endmodule
////////////////////////////////////////corrected output [7:0]/////////////////////////////////////////-
module CB3RE (C, R, CE, Q);
input C, R, CE;
output [2:0] Q;
reg [2:0] count;
always @(posedge C)
if ®
count <= 0;
else if (CE)
count <= count + 1;
assign Q = count;
endmodule
/////////////////////////////////////////////////////////////////////////////////-

Golum
mura:

Вот это компилится Максом.

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

mura

Анатолий, даже в самые отдаленные хутора пришла программируемая логика.
Пора начинать 😉

Golum
mura:

Пора начинать 😉

ну, то быстрее паяльник разогреет ? В)

ATLab
mura:

Анатолий, даже в самые отдаленные хутора пришла программируемая логика.
Пора начинать 😉

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

26 days later
boldive

Юрий, есть прогресс в моделировании?

Вот тут еще немножко теории как это сделано у Марисса.

Можете поделится кодом testbench для этого дела?

tumbzik
boldive:

Что-то не могу разобраться как в ISE Project Navigator запускать симулятор (кажись wave называется).

Ткните пожалуйста пальцем куда смотреть надо и в какой последовательности.

луше сразу привыкайте к хорошему: Active HDL рулит.

boldive
tumbzik:

луше сразу привыкайте к хорошему: Active HDL рулит.

Так вроде как и ModelsimXE с ISE работает без вопросов.

mura
tumbzik:

луше сразу привыкайте к хорошему: Active HDL рулит.

Cразу видно, человек КИТа начитался.

boldive

to mura
Юрий, так как насчет содержания моего поста

Юрий, есть прогресс в моделировании?

Вот тут еще немножко теории как это сделано у Марисса.

Можете поделится кодом testbench для этого дела?

mura

Cкоро начну “боевые” испытания. А тесткод не писал, в МАКсе удобный симулятор, и там все задается графически.

20 days later
Oleg2

Интерестно,как обстоят дела с драйвером…и подскажите boldive ,по Вашему мнению какой драйвер будет лучше: 1)на LS8290 или 2)на Xilinx CPLD

boldive

Разумеется на CPLD, только там код надо слегка до ума довести.

Аэробус

Ээээ… Народ, подскажите, нашел тут Xilinx ISE Design Suite v11.1 весит 5,6Гб и пакет обновлений до 11.4 2,5Гб Это чо неполная? В первых постах речь шла о 47Гб?

boldive

Все правильно. Так и есть. Только ко всему этому надо еще впридачу с сайта Xilinx скачать Modelsim 6.4 с библиотеками под CPLD (хотя по умолчанию там эти библиотеки уже сидят). Регистрационный код получите там-же бесплатно.

Oleg2

Так тогда два вопроса :1)А что с кодом именно не так? 2)топологию платы брали с сайта или сами разводили?

boldive
  1. 1/5 шага заявленная в проекте работает. Но это хорошо для изучения процесса. Желательно сделать его меняющим шаг в зависимости от частоты оборотов двигателя и начинать вращение где-то с 1/16 шага.

  2. Топология платы своя. Долго пыхтел, но сделал.

1 month later
andrey_als76

Схему как файл прикреплять уже нельзя. Кому надо текущий вариант схемы берем тут.[/QUOTE]

Тоже хочу собрать контролер с ПЛМ разобрался, счас копаю аналоговую часть.

1.не могу монять почему на схеме резистор R40 0.05ом -это при токе 65А даст на компараторах 3.3в , на 3,5 ноге LM393 напряжение должно менятся от 0 до 3.3В. у вас что двигатель потребляет 65А? + перед компаратором лучше поставить усилитель напряжения с регулируемой обратной связью чтоб можно было ток менять.

2 что за хитрый у вас источник тока для asin

с помехами разобрались при высоком напряжении? , у меня будет в районе 90в.

boldive
  1. Откуда 65А ? Вроде такие цифры никогда не озвучивались. Я так думаю 7-8А это то что схема выдаст. R1 и есть то что меняет максимальный ток обмоток мотора. Примерно 1к на 1А. Т.е. при токе 4А надо ставить 4К. Если ничего не поставить в качестве R1 (оборвать) то схема сама ограничит ток до ~7А (R2).
  2. Кто то невнимательно прочитал tutorial. Или совсем его не читал. ASIN and BSIN это выходы CPLD с открытым коллектором (Z-level). Грубо говоря закорачиваются ASIN and BSIN на минус питания. В зависимости от “длительности” закорачивания и получается синусоида на компараторе.

С помехами еще воюю. У меня токи 7-8А 48VDC. Если будет 90В питания то IRF540N не подойдут. У них максимум 100В. А поскольку силовая часть работает в импульсном режиме на индуктивную нагрузку то выбросы напряжения будут вольт так под 160 если не больше.

Помехозащищенность очень сильно зависит от топологии печатной платы. С двухсторонней платой очень трудно защититься от токов 7-8А. Уже подумываю прилепить медный экран сверху CPLD и компаратора (закрыть всю несиловую часть).

andrey_als76

меня поначалу запутало то что в первоисточнике было указано curent set- думал стабилизатор тока пока не увидел конденсатор 1мф.

Разобрался с вашей схемой на транзисторах Q1-Q3 На Q1-источник тока, Q2 просто напряжение падает , Q3- эмитерный повторитель, в итоге получаем простой стабилизатор напряжения регулируемый 2 резисторами (отсюда вопрос зачем такой изврат😁)

Раньше я занимался проектированием импульсных источников питания поэтому в борьбе с помехами знаю толк. ваша схема может и будет работать в четырехслойной плате, если повезет. у вас на компараторе сравниваются миливольты (50mv) это сопоставимо с наводимыми помехами. надо усиливать сигнал c резистора R39 R40 хотябы до вольт 3-4 (усилитель рядом с резистором R39) и на R4-R5 подавать такое же напряжение. самое главное обратную связь правильно развести (цепи компаратора) на осцилографе все хорошо будет видно. микросхема вроде и на 5 в расчитана , наверное можно подать на С3 и 5в.
посмотрите как сделан усилитель тока у robozone.su/uploads/posts/…/1265808176_sch.jpg

у меня в бп по 600в с токами 3а коммутировалось на 1 слойной плате и ничего, помех никаких небыло, сигнал был намного чище чем в серийных изделиях.

boldive
andrey_als76:

отсюда вопрос зачем такой изврат😁)

…поэтому в борьбе с помехами знаю толк.

current set - дословный перевод “установка тока”.

Изврат для установки тока мотора без влезания на плату. К терминалам подсоединяется внешний резистор и все. Не надо ничего мерять и подбирать.

Усилить сигнал с токовых резисторов хорошая идея. Применять еще дополнительные 5В питания не совсем понятно зачем.
Если посмотреть внимательно на плату предложенной выше схемы то видно что проводники от резисторов через всю плату идут к усилителям и потом к компаратору. Какой смысл в такой разводке?

Если есть желание поучаствовать в “правильной” разводке платы (а ваш опыт несомнено будет полезен) могу дать проект со схемами и печатными платами в Altium Designer Summer 2009. В проекте двусторонняя печатная плата расчитанная на домашнее применение. Её фотки я выкладывал раньше. Там я старался максимально уменьшить количество переходных отверстий. Для домашнего изготовления это иногда критично (сверел не так уж и много, и переломал я их достаточно).