Prosim nekoho kdo by koukl na tento zdrojak...problem je ve funkci PWM2. Toto PWM je dobre nastavene, primym dosazenim hodnot 173-345 se zachova tak jak ma -90° az 90°. Problem je v tom ze ma byt rizeno hodnotou z ADC2 prevodniku,jde o vstupni analogovy signal 0-5V, ktery je primo ve funkci pro ADC2 preveden z digitalni hodnoty 0-1024 na 173-345 pro PWM, kdyz teda dosadim funkci read_ADC2, tak na tento signal nereaguje, naopak zrejme reaguje na signal z ADC1. JA na to koukam a nevim proc, taky sem to poslal kamosovi, ten v tom taky nevidel zadnou chybu, ten AVR studoval na stredni a dale s nimi pracuje...pls snad uvidite chybu nebo neco...
melo by jit asi jen o AD prevodnik?? i kdyz fakt nevim proc by melo..ale pro jistotu ja nevim, porty nebo kde by to mohlo byt, vsecko vidim ze je v poradku.....((((((((
Fórum › Mikrokontroléry
HELP PLS!! kontrola zdrojaku - chyba???
nevidim duvod proc by to melo brat neco jineho nez pin ADC1 ... do admux hazes 1 -> kanal 1 alias pin ADC1
u read_ADC1 hazes do ADMUX 0 -> nacitas pin ADC0
i to tam mas jasne napsany jako poznamku: "KANAL 1", ale rves signal na kanal 2
Problem je v tom ze ma byt rizeno hodnotou z ADC2 prevodniku
kdyz teda dosadim funkci read_ADC2, tak na tento signal nereaguje, naopak zrejme reaguje na signal z ADC1
Ja vim ze je to matouci. Ja mluvim vzhlem k tomu jak to mam napsane, mam napsane ADC1 jako kanal 0 a ADC2 kanal 1. Takze kdyz mluvim ADC2 myslim vlastne jedna...kdybych to v te funkci nazval jako ADC0 a ADC1, udelal bych to asi citelnejsi a lepsi,ale nic to nezmeni,ten problem bude stale stejny...
matouci je slabe slovo - zmatecne je blize - neni nad to, mit nejake oznaceni a jen tak si ho pro prehlednost zmenit na jine... co mas za procesor a na ktery pin davas zminenou hodnotu?
Beru to jako jeden prevodnik a druhy, uz sem to tam tak napsal pak priradil kanaly podle zapojeni a uz to nemenil...ja vim, radsi to prepisu...
Mno je to ATmega16. No ja posilam z merici karty analog signal prave na ten ADC2 (kanal1) a tim se ma ridit to servo, je tam ten prepocet na tech 173-345 a volam to co chci aby bral,takhle to mam asi spravne...o tom ze tam ten signal leze a tak jak ma to mam zmerene multimetrem, jak na ADC0 tak na ADC1, ted jsem koukal na zapojeni v eaglu jestli by nemohl dojit tam k necemu, ale ne-e...to musi byt asi fakt neco v tom kodu, nevim proc nebre ten kanal 1 ale chova se divne zavisle na kanale 0:-(
no pokud to mas opravdu spravne
tak by teoreticky mohl vypadnout ten while - tj. necekal bys na konec konverze prvni, zmenil kanal na druhou, ale prvni stale bezi,
pak tam mas delay 250ms - tj. prvni konverze dobehne a nastavi se kanal na druhej.. nicmene zadna konverze se nenastartuje takze se nikdy k mereni ty dvojky nedostane.... no a dale se nastavi kanal 1, nastartuje konverze ....
a uz i vidim proc vypadne to while
Takze on nemuze brat z obou prevodniku zaroven? on muze cist kanal 0 a az dokonci tak kanal 1? a pak zas tak? ja myslel ze to muze normlane bezet neustale, ten kanal 0 stejne je tam ten buffer neustale se pricitaji dalsi hodnoty a dela prumer a mazou posledni a nezavisle na tom podle potreby rizeni by mel ten kanal 1 pobrat to co mu prijde z karty, ne? ten prvni delay tam je aby mel cas pobrat tech prvnich par hodnot do bufferu a ten druhy jakoze aby pracoval v sekvencich po ctvrt vterine, vyhodnoceni z bufferu a odeslani hodnoty z toho kanalu 0 a zaroven uridil servo na kanalu 1...takze mam jeste nejak oddelit cteni kanalu 0 od cteni kanalu 1 delayem nejak? a melo by byt?
To Hanisss : mas jen jeden AD prevodnik... kanaly sou spojeny pres multiplex...
na to cekani by mel byt "while ((ADCSRA & (1 << ADSC)) == 1){};" nicmene jak sem naznacil je spatne podminka - tj. nikdy se nevykona a tudiz ani neceka na dokonceni konverze
no to tam mam tak aby to bezelo neustale...aby program nedokoncil a zase nezacinal znovu kvuli toho bufferu, aby jen pridaval a mazal posledni, nenacital po dokonceni dalsich 15...tak mam z te inicializzace start prevodu vyhodit a dat ho za ten while? jakoze zapne kanal 0 a kdyz precte ten prumer tak pak dalsi delay, zapnout kanal 1...ale zas to by neprobihalo kontinualne...
nemyslim ze vis k cemu to je :D
while ((ADCSRA & (1 << ADSC)) == 1){};
ma testovat bit "bezici konverze" a cekat dokud se sam nevynuluje (tj. konec konverze)
ted to sice jednou otestujes ale srovnavas s jednickou, ktera nemuze NIKDY v zivote vyjit - protoze (1 << ADSC) == 64
a at uz mas v ADCSRA cokoliv, tak muzou vyjit jen dve hodnoty -> 64 (konverze bezi) a 0 (konverze uz skoncila a nebo nebezi)
aha:D on se sam pokazde znuluje kdyz se dokonci prevod tedy....jen mi neni jasne ze to srovnavas s tou jednickou, tam muzes napsat rovnou 64 a bude pracovat dokud se neznuluje?:D
no takze napisu za while tuto podminku a pokracuju s tim bufferem jak mam az po ten prumer. a pak dalsi delay? a pak az cteni z kanalu 1 pro PWM2? jenze v tom pripade nebude porad zasobovat ten buffer:D ja uz z toho blbnu...
To Hanisss : ja to nesrovnavam s 1... ty to tak mas v kodu cos poslal :D
technicky vzato tam staci mit while ( ADCSRA & _BV(ADSC) ); pripadne nemusis pouzit to makro a mit tam (1<<ADSC)
pripadne pokud chces mit explicitni podminku tak to cely > 0
tak staci napsat do zavorky za ten while toto: ((ADCSRA & (1 << ADSC)) == 1). to znamena ze ten buffer bezi kdyz je nastartovany prevod a tak bych pak mel jeste od toho oddelit to zapsani te hodnoty z toho kanalu 1 do pwm aby bezel ten druhy prevodnik ne?
nestaci, protoze ani kdyby ses rozkrajel, tak se to nikdy v zivote nemuze za zadnych okolnosti nikdy rovnat 1
(nikdy sem pouzil vickrat, protoze je to opravdu dulezite zduraznit, ze to nemuze nikdy nastat :D)
no ja vim ze si rikal ze to je 0 a 64, ale to s tou jednickou tak vsude pisou ze se to tak pise...ja ted nevim...nebo ja uz nevim kde jsem to vycetl...takze tak jak jsem rikal ale 64, hm? a jak oddelit to cteni z toho kanalu 1? aby se nebyl s tim prevodem na vkladani do bufferu.
mimo to - pokud si nahodou prectes datasheet - AD prevod neco trva... cim dele tim kvalitnejsi je
mas pak postup, jak na nem ziskat jednu hodnotu z konkretniho kanalu (verze bez preruseni):
1) nastavis kanal
2) nastartujes konverzi
3) cekas dokud se konverze nedokonci
4) nactes data
pro dalsi kanal to same
tenhle postup nemuzes nijak ochcat - jedna konverze proste zabere urcitej cas a ty musis pockat nez je hotova aby si mohl ziskat spravnou hodnotu
Ja vim no...to jsem se dovttipil v prvnich dotazech kdyz jsem zjistil ze to nemuze pracovat spolu. Jen ted nevim njak s tim bufferem, on se pak prerusi a jak to nastartovat ten druhy ADC nebo to staci jen tou podminkou a ten druhy zvlast jen za delayem ale tim se zrusi ta nekonecna smycka a on pak zacne do toho bufferu zase znovu hazet novych patnact hodnot misto pripisovani a smazavani poslednich ne? Ja uz asi rikam trochu nesmysly, rano moudrejsi vecera...ted uz to tu nejak nedavam...uff
pracovat spolu to muze, nemuze to pracovat zaroven...
mas na vstupech multiplex? tak musis multiplexovat i nacitani ...
nejak vubec nechapu co mas s bufferem a uz vubec co myslis tim prerusenim? megy maj jen jeden procesor, takze at udelas cokoliv, v zivote nedokazes udelat nic, co by bezelo opravdu soubezne...
v jednom cyklu v main mas nacteni nejake hodnoty z ADC1 do bufferu
pak mas nacteni nejake hodnoty z ADC2 kdo vi kam :)
pak cekas 250ms - jestli todle neni "preruseni" tak uz nevim co je
proste se nikde nic neprerusuje.. kazdejch 250ms nactes neco do bufferu, pak na pwm a delay..
servo = 173+ADCW*172/1024;
Tento kód nefunguje správně.
Hodnoty jsou typu int ale mezivýsledek po násobení může být větší než int a je ořezaný.
Takové výrazy je dobré otestovat v simulátoru.
Tady pomůže třeba
servo = 173+ADCW*172UL/1024;
To AB : ano to taky, mimo jine ze stejne nenacita vubec spravne hodnoty z ADC :D (neceka na konec konverze)
mimochodem, pokud by to trochu zkratil, tak se vleze uz do unsigned intu s tim vypoctem 173 + ADCW*43/256
maximalni hodnota je 0x03FF a to * 43 je pak 0xABD5 ... a pak posun vpravo
ono to funguje jen jsem misto 1 napsal 64...aj ty delaye jsem uplne zrusil a jede to ok....uz jedine co bych potreboval tak ty filtrace...ja tam mel z potenciometru RC filtr, ale ten kondik byl 100uF a bylo to docela pomalejsi, zitra ho vymenim asi za 100nF, protoze kdyz jsem ho vyhodil bylo to mnohem lepsi...teda az na ty odskoky, tech se musim nejak zbavit:-( Nebo jde nejak zjistit nejefektivnejsi volba kondiku? Pripadne bych potreboval ten gauss filtr jeslti by to slo...
neco takoveho by se mi strasne libilo!!!
http://www.google.cz/url?sa=t&source=web&cd=7&ved=0CEsQFjAG&url=http%3A%2F%2Fwww.jamesgoulding.com%2FResearch_II%2FEhlers%2FEhlers%2520(Gaussian%2520and%2520Other%2520Low%2520Lag%2520Filters).doc&rct=j&q=lag%20filter&ei=1__TTcT7JIPzsga4-OTdAg&usg=AFQjCNH1BQkjPbZu0ItVEnJsA4IxFO3l8Q&sig2=T7fwj2r3G08HpcpuhQ5oQQ&cad=rja
bohuzel... dodelavam jeden nekolikamesicni projekt v praci, dalsi jeste mimo ... posledni co chci je nabrat dalsi programovani :D ikdyz by to bylo ve srovnani s tim co delam jen na chvilku
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Chyba ve zdrojáku — založil juklmi
Help please!!!! Chyba ve zdrojáku — založil Michal
Chyba v zdrojaku — založil rudiy
Help please!! chyba ve zdrojáku --->neukládá do databáze — založil michal
Zkompilování zdrojáků — založil Mutagen
Moderátoři diskuze