M16 + winavr090313 -nejak mi to spatne pocita a nejen to. – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

M16 + winavr090313 -nejak mi to spatne pocita a nejen to. – Mikrokontroléry – Fórum – Programujte.comM16 + winavr090313 -nejak mi to spatne pocita a nejen to. – Mikrokontroléry – Fórum – Programujte.com

 

xhans690
Návštěvník
10. 8. 2009   #1
-
0
-

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

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
10. 8. 2009   #2
-
0
-

Volatile urcite vsechny promenne, ktere se mohou zmenit mimo treba cekaci smycku..

pocitani je problematicke.. ja sem napriklad pri pouziti long musel vse pretypovat na long, jinak to proste nespocitalo spravne...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
11. 8. 2009   #3
-
0
-

Tak jsem to zkusil jinak. Protoze pouzivam float, prekopal jsem vsecko na float. Rozjelo se to komplet. Zitra zkusim pouzit fintu co jsem provozoval na J2ME, kde nejsou floaty. Vynasobit desetinne cisla 1000, vlastne vsecko, a pak by to melo sedet i s longama

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
11. 8. 2009   #4
-
0
-

To xhans69 : jo tahle finta dokaze taky docela ulehcit.. floaty v jednocipech nebyvaj moc rychly...

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
13. 8. 2009   #5
-
0
-

To KIIV :
tak jsem to predelal na long a v podstate zadny uspech, jsem tam kde jsem byl. Ale aspon jsem zjistil, ze kombinace int a long nefunguje.
Mel jsem long=long * int, a vysledek byl v int, nevim jestli to je chyba kompilatoru.
Budu muset jeste zapatrat. Ale je to divne.

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
13. 8. 2009   #6
-
0
-

To xhans69 : dej long = long * (long) int

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
14. 8. 2009   #7
-
0
-

To KIIV :
Jo to uz jsem delal taky, ale nechapu proc to ulozi do int, kdyz to ma byt long

ovsem jsem v koncich
vsechny promenne jsem dal na stejny typ, nejdriv long, potom uint32_t, mensi nemuzu, 16bitovy je malo. Budu delat az 160k kroku motoru.
A porad to dela jednu a tu samou vec pritom jsem si 100% jist ze vzorec pro vypocty je spravny

Zajimave je ze pri simulaci v avrstudiu to jede normalne

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
14. 8. 2009   #8
-
0
-

To xhans69 : tak debug.. ja si to odkrokuju pomoci jtagu a da se mnohem rychleji prijit na to kde ma clovek chybu

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
14. 8. 2009   #9
-
0
-

takze mensi pokrok
pocita mi to spravne, ale nedela spravny pocet kroku
ale ja na to prijdu

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
14. 8. 2009   #10
-
0
-

neposilas tam jen moc rychle signaly pro posun krokovych motorku? na rozjezd to musi byt trochu pozvolnejsi nez kdyz uz je v pohybu

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
15. 8. 2009   #11
-
0
-

to nehrozi
dela to pri kterekoliv rychlosti
navic krokace neridim pwm, takze pokud do nich nahustim moc rychle zmeny, tak se kousnou a jenom bzuci, pri extra rychle zmene se dokonce toci naopak, ted mam tak stredni rychlost - cca 2ot/s
kroky neztraci, spis delaji navic

jtag pozuit nemuzu, blbec jsem si na jtag piny osadil koncove spinace
hodnoty jsem si ukladal do eeprom, takze jsem zjistil, ze vypocty provadi spravne

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
15. 8. 2009   #12
-
0
-

To xhans69 : vsak ja vim ze se krokove motorky neridi pwm :) kdyby se ztracely kroky tak by to bylo treba tema prilis rychlou sekvenci prepinani .. da se nejak zjistit i o kolik kroku/z kolika nebo tak?

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
xhans690
Návštěvník
15. 8. 2009   #13
-
0
-

To KIIV : krokace se ridi aji pwm ;), toho vyuzivaji profi drivery
ridi to pwm a jeste regulujou napeti zdroje, ale to jen tak na okraj
zjistit to asi pujde tezko
mam suplerou zmerene ze je to o cca 1,4mm +- sirka tuhy a faktor tresouci se ruky
coz by odpovidalo jedne otacce, pri stoupani 1,5mm
zkusim to jeste nejak natvrdo omezit

Nahlásit jako SPAM
IP: 81.30.255.–
xhans690
Návštěvník
20. 8. 2009   #14
-
0
-

Tak jsem to rozlousknul.
Chybu zpusobila vadna elektronka E13 z naseho podniko Katoda Olomoc. Tato elektronka se vklada mezi zidli a klavesnici.
Blbec jsem pri vyberu hodnoty posilane na port pro aktivaci civek, posilal jenom 7 hodnot misto 8. Coz v mechanice znamena 6 pulkroku a 1 celokrok (=2 pulkroky), ovsem pocitano jako 7 kroku v programu, takze na jednu stranu to chodilo v poradku, na druhou to prave pridavalo.
Ale ze mi to trvalo najit, cele 2 mesice.
Nakonec jsem z puvodniho programu pomazal vse krome funkci generujici hodnotu spinani civek a tam jsem to nasel.

Ponauceni: Vykaslat se uz na ten pascal :D

Nahlásit jako SPAM
IP: 81.30.255.–
KIIV
~ Moderátor
+43
God of flame
20. 8. 2009   #15
-
0
-

no vida.. :)

Nahlásit jako SPAM
IP: 80.188.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý