Zdar lidi,
prosim pomozte. Postavil jsem si takovy maly cnc ploter na plosnaky. HW stranka je relativne vyresena.
Jen pro info. Je tam 6 koncaku a 3 krokove motory se 4 fazemi. Ale mam problem se SW.
Udelal jsem si HPGL radic, abych mohl kreslit primo z eagle. Jenze mam takovy problem. Polohu pera mam v promenne typu long, ktera znamena pocet kroku od nuly. Tudiz si souradnice z eaglu (mils) prepocitavam na pocet kroku. Beru v uvahu pocet kroku na otacku a stoupani zavitu. Problem je v tom, ze v AVR studiu pri krokovani programu je vse v poradku, v realite je to vsak jinak. Pri pohybu na jednu stranu to napocita vic kroku, pri pohybu na opacnou stranu to napocita min. Muze to byt tim ze pouzivam vice typu promennych pro jednu operaci?
Napriklad long=long*char*float?
Zkousel jsem to i s pretypovanim ale nic nepomohlo.
Prikladam kousek kodu
#define mils 39.3700787 //1mm=39.3701mils
#define stoupx 1.5 //stoupani zavitovky
#define stoupy 1.5
#define stoupaniX stoupx*mils; //stoupani zavitu 1,5, posun v mils pri jedne otocce 1mm=39.3701mils 1.325
#define stoupaniY stoupy*mils;
#define kroky_otX 400 //pocet kroku na otacku pro X motor
#define kroky_otY 400
void peroxy(unsigned int pcilx, unsigned int pcily,unsigned char milsy)
{
//nastaveni pera na pozadovanou polohu primocarym pohybem
//souradnice sx,sy jsou v mils pokud mils=1, jinak jsou souradnice v krocich
//1mm = 39,3701 mils
//tan vraci hodnotu v radianech, prepocet na stupne je radian*180/M_PI
startx=perox; //vychozi pozice pera pred posunem
starty=peroy;
if(milsy==1){cilx=kroky_otX / stoupaniX * pcilx;} //pozadovana pozice pera pred posunem
else{cilx=pcilx;}
if(milsy==1){cily=kroky_otY / stoupaniY * pcily;}
else{cily=pcily;}
delkax=abs(startx-cilx);
delkay=abs(starty-cily);
konectoceni=0; //promenna urcujici dosazeni konecne hodnoty
//vypocet uhlu ve kterem se budu pohybovat a podle toho budu pocitat souradnice po kazdem kroku osy X
if(delkax>0)
{
px=delkax;
py=delkay;
uhel=atan(py/px)*180/M_PI;
}
else
{
uhel=90;
}
//samotny pohyb pera
while(konectoceni==0)
{
if(uhel==90)
{//pohyb ve svislem smeru, po ose Y
while(peroy>cily)
{
motory=krokdolu();
peroy--;
cekej();
PORTA=motorx+motory;
}
while(peroy<cily)
{
motory=kroknahoru();
peroy++;
cekej();
PORTA=motorx+motory;
}
}//if uhel==90
else
{//pohyb pod uhlem
if(perox>cilx)
{
motorx=krokvlevo();
perox--;
}//if perox>cilx
if(perox<cilx)
{
motorx=krokvpravo();
perox++;
}//if(perox<cilx)
krx=abs(startx-perox);
kry=abs(krx*tan(uhel*M_PI/180)); //kolik kroku musim udelat pri aktualni pozici X
if((perox!=cilx)&&(peroy<cily))
{
while((starty+kry)>peroy)
{
motory=kroknahoru();
peroy++;
if(abs(starty+kry-peroy)>1)
{
PORTA=motorx+motory;
cekej();
}
}
}//if peroy<cily
if((perox!=cilx)&&(peroy>cily))
{
while((starty-kry)<peroy)
{
motory=krokdolu();
peroy--;
if(abs(starty+kry-peroy)>1)
{
PORTA=motorx+motory;
cekej();
}
}
}//if peroy>cily
PORTA=motorx+motory; //aktivace civek motoru
cekej();
}//uhel<90
if((perox==cilx)&&(peroy==cily)){konectoceni=1;}
}//while konectoceni
}//void peroxy
Pak mam dalsi problem, sem tam kdyz udelam nejake upravy v programu, tak musim nektere promenne zadefinovat jako volatile, jinak je zniceho nic zacne ignorovat. Treba v cekaci smycce kde menim hodnotu jedne prodlevove promenne (mam v planu pouzivat v budoucnu vice rychlosti pohybu a rampy).
Prosim poradte proc to treba misto 12 000 kroku spocita jenom 11 000 nebo naopak 14 000