ниже код который занимается подсчётом импульсов и генерацией.
michael-yurov писал(а):Осциллографа у вас, полагаю, нет?
есть конечно. без него собирать наощупь такие штуки незнаю как
michael-yurov писал(а):Какие временные параметры сигнала заданы в программе?
(длительность, время между импульсами, время до и после смены сигнала Direction, какой активный фронт?)
временные параметры в программе у меня измеряются в том, сколько раз прокрутится цикл(весь код крутится в бесконечном цикле опрашивая пины и генеря импульсы из переменной) время до и после смены сигнала Direction маленькое, но на практике вижу что нормально отрабатывает, поэтому не занимался выставлением этого времени, сразу после смены направления может идти импульс шага - тестил нормально работает, слал с программки сначала импульс в одном направлении затем в другом. что такое активный фронт незнаю.
michael-yurov писал(а):Как происходит подсчет одновременно с генерацией?
опрашиваются одни пины МК на которые приходит сигналы с ЛПТ(записывается в переменную, в эту же переменную добавляются шаги которые пришли от программы корректировки на компе через UART - com port), и одновременно на другие пины идёт выдача импульсов STEP и установка направления DIR. могу подробней объяснить если надо.
я вообще пока решил забить на динамическое определение ширины и частоты импульсов. хочу потестить само устройство в целом. поэтому пока поставил
ширину и частоту постоянную z_f=60;z_w_result=5;
когда я раньше тестил вначале, то тоже выставил ширину и частоту постоянную, и заметил что если вручную двигал ось Z кнопками на LinuxCNC, то после того как отпускал кнопку мотор ещё некоторое время продолжал вертеться. оказалось что частота была завышена, но так как импульсы шли не напрямую а через МК, то все импульсы отрабатывались нормально с подходящей частотой. потом обнаружил это когда включил динамическое определение частоты и исправил в конфиге LinuxCNC.
сейчас поездил стало нормально крутиться, добавляет компенсирующие шаги на столько шагов на сколько приходит с программы.
завтра потестю ещё, сегодня уже позно жужжать фрезой.
if (PINC.4==1){ zdir=1;}
if (PINC.4==0){ zdir=0;}
if (PINC.5==1 && tempz==0){ // импульс STEP с LPT
tempz=1;z_w=0;
if (z_f_temp<z_f && z_f_temp>1){ z_f=z_f_temp;z_f_temp=0;}
}
if (PINC.5==1 && tempz==1){z_w=z_w+1;}
if (PINC.5==0 && zdir==1 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps+1;}
if (PINC.5==0 && zdir==0 && tempz==1){ tempz=0;z_w_result=z_w;zsteps=zsteps-1;}
z_f_temp=z_f_temp+1;
if (zsteps!=0){temp=zsteps;}
if (temp>0){PORTC.3=1;}
if (temp<0){PORTC.3=0;}
///////////////////////
if (PIND.5==1){ xdir=1;}
if (PIND.5==0){ xdir=0;}
if (PIND.4==1 && tempx==0 && xdir==1){xsteps=xsteps+1 ;tempx=1;}
if (PIND.4==1 && tempx==0 && xdir==0){xsteps=xsteps-1 ;tempx=1;}
if (PIND.4==0){ tempx=0;}
if (PIND.7==1){ ydir=1;}
if (PIND.7==0){ ydir=0;}
if (PIND.6==1 && tempy==0 && ydir==1){ysteps=ysteps+1 ;tempy=1;}
if (PIND.6==1 && tempy==0 && ydir==0){ysteps=ysteps-1 ;tempy=1;}
if (PIND.6==0){ tempy=0;}
/////////////////////////////
z_f=60;z_w_result=5;
if (zsteps>0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps-1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
if (zsteps<0 && z_w_count==0 && z_f_count==0){ zsteps=zsteps+1;PORTC.2=1;z_w_count=z_w_result;z_f_count=z_f;z_process=1;}
if (z_w_count>0){z_w_count=z_w_count-1;}
if (z_f_count>0){z_f_count=z_f_count-1;}
if (z_w_count==0 && z_process==1){PORTC.2=0;z_process=0;}
p.s. программер с меня никакой, так что код чисто чтобы поглазеть.разбираться в нём тяжко даже мне через пару дней написания
