Zdravim, pro nezasvecene, mam nejaky potenciometr, z toho lezou libovolne hodnoty a ja se snazim jejich prubeh vylepsit aby to moc neodskakovalo apod. K tomuto nereste detaily, mam jiny problem, ty filtry co mam v programu napsane mi nechteji pocitat.
Takze ADC1 bere hodnoty z potenciometru a pak hodnoty posila do predem vlozenych funkci a vypocty by mely generovany na PWM signal funcki PWM1. Vsechno ostatni v pragramu je plne funkcni, kdyz tam zadavam hodnoty primo z ADC1 generovani pwm i jeho hardwarove osetreni je v cajku. Problem je kdyz tam dosadim hodnoty z adc upravene danymi funkcemi, vysledek je "stejny" jakoby tam hazeli rovnou to co z toho ADC aniz by probehl vypocet...nevim jestli to tam spatne volam nebo chybi neco v define nebo knihovna??? netusim.... pls help...zkouknete to, beztak to bude nejaka blbost, diky moc!!!!
Fórum › Mikrokontroléry
Nefunkcni pocitani vlozenych funkci
To Hanisss : zkousel sis to krokovat?
+ da se docela snadno vyhnout i pointeru... stejnou praci udela bez problemu i index a lip se kontroluje (hlavne z debugeru)
staticke promenne se daji dat globalne (muze v pohode stacit jeden buffer - usetri se misto - stejne nepouzivas vic typu filtrovani naraz)
preruseni nepouzivas takze nemusi byt volatile
To KIIV : Mno nezkousel....a ty pointery neres, ty funkce jsou napsany spravne, mam to potvrzene a nez bych zjistil jak se to dela jinak...
mno a prave proto ze pouzivam vzdycky jen jeden filtr tak je jedno ze tam mam napsane dva buffery...vic mista taky nepotrtebuju...ja proste vim ze toto funguje, ze to je spravne, chci se zamerit na to kde je chyba, indexy a jine, s tim si budu hrat a naucim nekdy az bude cas...
Mno jasne preruseni nepouzivam, to jsem tam zrusil a spravilo se tim i to PWMko ktere jsem predtim resil, delalo mi to tam jen bordel, ted vim ze elektronika uz je plne funkcni, program by taky mel byt, az na to ze to nepocita....
ale zkousel jsem tohle, napsat to oklikou.
int main(void)
{
uart_init();
init_port();
init_PWM1();
init_PWM2();
prumer = avg(read_ADC1()/4);
while(1){
PWM1(prumer);
//PWM1(read_ADC1()/4);
//PWM1(avg(read_ADC1())/4);
//PWM1(gauss(read_ADC1()));
PWM2(read_ADC2());
}
}
vysledkem byly nizke hodnoty s temer konstantnim prubehem,...je to dobre takto napsane? myslim ze jo...je to ale divne, melo by to byt to same, jako kdyz to tam mam napsane primo ne? ale tgrosku by se tim dalo vysvetlit proc to (kdyz to je napsane primo) ma stejny prubeh jak bez filtru, ze to nasobi malou konstantni hodnotou...mozna, mozna ne, ja nevim...
Takze mysdlis ze volani tech funkci je ok? ja si totiz pak rikal ze to mam tam treba nejak spatne...nebo v define nikde nic nechybi? knihovna? Diky moc za odpoved...
prave proto, kdyz mi neco nefunguje jak ma, pripichnu jtag a pekne si to odkrokuju.. hodi se breakpoint na zacatek te funkce a nechas si zobrazit vsechny promenny a to pole, samozrejme to predpoklada aspon megu 16 (a ze nebudes ty vstupy menit - je to takhle o dost pomalejsi - hlavne kdyz se zastavuje na breakpointu)
To KIIV : ok, polopate prosim:-) co mam pripojit, kde to mam sehnat, jtag je jen rozhrani podporovane procesorem, to vim, takze cos tim myslel. A co myslis ze nebudu menit vstupy, ja zadne vstupy nemenim...Tak rekni co a jak a ja hned jak to vykutim ti zpetne reknu, diky moc.
To Hanisss : no jtag byva u vsech 40 a vice pinovych Atmega procesoru (obvykle cast portu C)
na to, abys mohl debugovat potrebujes nejaky jtag debugger (avr dragon, jtag ice, jtag ice mk II... ) a avr studio (+ win avr - tj port gcc)
pak uz to jen pospojovat.. ale pokud nemas tak mas vicemene smulu a budes muset ladit jinak
- da se pripadne rozjet seriovej port a posilat hodnoty na nej
- da se pridat display a zobrazit na nem
- da se to proste zobrazovat primo na jeden nebo dva porty (pres led) - tady ale budes potrebovat aspon neco cim to zastavovat
mozna by se dalo pouzit externi preruseni a krokovat si jednotlive hodnoty (pak uz bys to pole ale musel mit globalni a volatile)
To KIIV : no ten procak mam, ale to by znamenalo ze bych to musel napajet na nejaky ten port...coz s elektrem se mi moc uz delat nechce, ta deska uz je ted v takove stavu, muzel bych to tam napajet a nastavit porty a jtag atd, ze?
seriovy port tam mam, ale pokud jen posilat hodnoty to muzu pres jednu vecicku, podle ni rikam jaky to ma prubeh a asi bych mohl to tam zmenit abych videl i cisla, jenze ty jsou pro me neuzitecna a bylo by to i neuzitecne v zjistovani problemu...mam to jen graficky.
JA potrebuju spis videt ty pole, tech bufferu...jestli to tam chodi a tak. aaachjo...mno a co si myslis o tom volani tech funkci a o tom jak jsem psal jak jsem to napsal oklikou a co to delalo, myslis ze kdyz to mam primo ze by to melo byt dobre? a vis proc to delalo to co delalo kdyz jsem to napsal jinak? nebo myslis? Mam urcite hodne zkusenosti, u me nejsou da se rict zadne tak co si myslis o tom zapisu, diky moc...
To Hanisss :
1. pres jtag si muzes trasovat vsechno (i promenne)
2. pres seriovy port muzes posilat vsechny cisla ne jen to vysledny (zalezi jen na tobe co tam narves)
3. jakou oklikou? tim ze si je zakomentoval? nebo myslis to jak si tu funkci hodil uplne mimo hlavni cyklus - tj. vicemene taky zakomentoval?
To KIIV : jo sorac, tohle jsem tady nenapsal, mno ja pak zkusil tohle:
...
prumer = avg(read_ADC1()/4);
while(1){
//PWM1(prumer);
...
vysledkem byl nizky konstantni prubeh....nezavisly na zmenach potenciometru, nebo mozna nejak , nevim ted uplne presne, ale dase rict ze to davalo "nic"....coz by mozna mohlo vysvetlit proc pri primem zapisu PWM1(avg(read_ADC1())>4) se to chova stejne jako bez filtru ze to nasobi nizkou konstantou = to same..ja nevim, zas je to asi blbost kdyz by oba zapisy mely delat to same, ne? diky
dobre, takze s tim jtagem, musim si sehnat nejaky debugger a pripajet to na prislusne nozky, to bych si vycetl s datasheetu, co pak:-)
a pres ten serial, jak tam mam hazet jine hodnoty? pole, bufferr, atd? a v jakem programu to mam cist?
To KIIV : jo to ja vim, to uz bylo jasne z toho prvne cos napsal...ale kdybych to dal dolu tak melo by oboji delat to same zE? takze nevidis problem v tom zapisu volani tech funkci? a jak jsem se ptal na ten jtag a jkak posilat ty ostatni hodnoty a v jakem programu pres ten serial...nevim jak na to takze by se mi hodila rada nebo odkaz, fakt nevim v cem by mela byt chyba, skoda ze tam nic nevidis...
Zkoušel jsem tvůj kód:
Připojil jsem potenciometr 10k mezi GND a VCC (+5V)
Střed jde na ADC0 . (vypni pull-up na adc vstupech)
K výstupu PWM1 (OC0, u tebe PB3) jsem připojil Led v serii s odporem proti zemi a voltmetr.
1. Kód
int main(void)
{
init_port();
init_PWM1();
init_PWM2();
while(1){
PWM1(read_ADC1()/4);
}
} /code]
funguje podle očekávání.
Potenciometrem se dá nastavit jas diody od nuly do maxima.
Napětí výstupu se při tom mění od 0 do 5V.
Úplně stejně to funguje když místo
PWM1(read_ADC1()/4);
použiju
PWM1(avg(read_ADC1())/4);
Takže v čem je problém?
Ale vyvíjet program takhle naslepo není dobré.
Přidej k tomu nějaký převodník uart/rs232 aby sis na PC terminálu mohl zobrazovat hodnoty při běhu programu.
No tak na svitivosti led bys ty filtry stejne nepoznal...spis poustet nejaky signal a vzit si oscilator nebo tak neco (ja neco na ten zpusob praqve delam a bez filtru je to stejne jako s...Ale diky ze to tak zkousis, vim ze mi to funguje, vse je nekolikrat predelavane a odzkousene, jen ty funkce (prestoze jsou dobre napsane) mi nehcteji pocitat...
No tak na svitivosti led bys ty filtry stejne nepoznal
Nerozumím jaké filtry?
PWM1(read_ADC1()/4);
Tady se nic nefiltruje, jenom se výstup nastaví podle hodnoty ADC.
PWM1(avg(read_ADC1())/4);
Tady se děje totéž, jenom hodnota ADC se průměruje z 16-ti měření.
Průměrování funguje, zkoušel jsem v simulátoru.
Filtr se dává až na výstup pro vyhlazení průběhu PWM.
ty funkce (prestoze jsou dobre napsane) mi nehcteji pocitat
Které funkce konkrétně?
Chápu dobře, že napětí na výstupu PWM má být úměrné hodnotě ADC vstupu?
Pokud ano, tak můj test ukazuje že to tak funguje.
Funguje to prumerovani? mno funkcemi neboli filtry jsem myslel prave ten klouzavy prumer a toho gausse...
No na ADC vstupu je 0-5V a PWMko generuje taky 0-5, s vice AVR nepracuje. Na vstupu desky je ale ve skutecnosti mala hodnota napeti, ktera je na tech 0-5 zvysena operacnim zesilovacem. Stejne pak potom na vystupu je tech 0-5 zvetseno na 0-10. Tim se ale vubec netrap:-)
Ja mam vytvoreny potenciometr, po kterem jezdim kovovou kulickou, ktera dotvari obvod a tyto hodnoty vstupuji do toho ADC. Jenze dochazi k odskokum a sumu atd. Prave tento signal chci temi filtry filtrovat. vyhlazeni odesilaneho PWM me nezajima, tam je potom nejaky RC clanek, me jde o ten vstupni signal. Pred vstupem do AVR je taky nejaky RC clanek, ktery to trosicku poupravi, neni to spatne, ale chtel jsem pouzit i na ukazku nejaky programovy filtr. Jedine co z te karty vidim je graficky prubeh pohybu pred jakoukoliv filtraci a potom na srovnani co leze i z toho mikroprocesoru. Takze kdyz naprogramuju desku primo s pobranim hodnot z ADC ukazuje to jen vlastnosti toho RC clanku. A kdyz to preprogramuji s tim avg nebo gaussem, kde se to prumeruje anebo upravuje podle funkce normalniho rozdeleni, mel by se ten prubeh trosku zmenit, ne? Mel bych tam videt rozdil oproti tomu primemu....bohuzel mi to ale pripada uplne, ale uplne stejne...
vychazel jsem z navrhu v programu matlab, ktery posilam v priloze. Je tam manualne vlozenych par vstupnich hodnot a zobrazene vypocty jak by to vypadalo s avg a s gaussem.
Taky kdyz jsem resil jestli mam ten prumer a toho gausse dobre napsane, napsali mi, ze vazne je to dobre a poslali mi prubeh filtrace jedne sinusovky. taky prikladam.
Prave proto ze jsem ujistovan ze to mam dobre napsane premyslim jestli neni chyba ve volani tech funkci nebo nekde jinde...takhle nemuzu porovnat filtracni metody kdyz to ukazuje "to stejne":-)
Ja vim, necekam neco primo tak jak jsem poslal, je tam jen par hodnot, me jich to za sekundu nacte mnohem vic, i tak jsem ale cekal nejaky rozdil, , melo by to byt jeste plynulejsi nebo mozna i mensi, u avg bych ocekaval trosku skokovy signal, naopak u gausse ze by to bylo pekne vyhlazene, roztazene...ja nevim, nebo myslis ze to je tim ze tech par hodnot z toho filtru co to filtruje se uda za par milisekund a tim padem to vypada stejne? co se s tim da delat? buffer uz natahnout vice nemuzu, to by avrko nespocitalo...takze jestli je to opravdu dobre tak nicmoc asi...ja nevim...ale kdyz jsem to hledal a zjistoval co a jak, vsude meli prumery nebo ruzne filtry s pocitanim jen na par poslednich hodnotach...
par poznamek:
* spocitat jak sou dlouhy ty zakmity ( na to by ale byl potreba prinejmensim osciloskop )
* spocitat si, jak rychle nacitas data ? ( dejme tomu vygenerovat impuls pri kazdem pocitani a pak to zmerit citacem )
dale:
* nevyplati se nacitat data jen dejme tomu 100x za sekundu? ted muzes mit klidne 16tisic/s
* pri velke vzorkovaci frekvenci budes mit tak jak tak problemy - filtr zachyti jen opravdu rychly zmeny
* co jednoduchy RC filtr na vstupu ?
Jednoduchy RC tam mam...a jako je to docela pekne. Ale mam udelat i toto na ukazku a porovnani...
tak ono mi to nejspis celou dobu funguje...:-):D
tak mam tam hodit nejake delay nebo neco? s tema taky moc pracovat neumim, navedes me, pls?:-) mohl bych to pak jeste v pondeli odzkouset...
Jo, takze myslim ze staci jen na konec programu pozkouset delay a melo by to fungovat? Kdyz jsem predtim prevadel ten vystup pwm na jiny port pomoci preruseni, dost se mi tam predtim bilo jedno s druhym. Vystup pwm nefungoval jak mel, cteni jednoho ADC se bilo s druhym a ja zkousel zpozdovat at ma na jednotlive veci cas atd a mel z toho takove nervy ze mam i na ten delay averzi:D:D:D Tak jestli to staci jen na konec, tak to v pondeli pozkousim a snad to pujde, hlavne ze vim ze mi to jinak funguje:-) Tak dik
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
Nefunkční cyklus s funkcí strtok — založil MucoVerde
Mysql a (pravdepodobne nefunkcní diakritika)nefunkcni — založil Alex
Počítání v long — založil Boblig
Počítání Sessions — založil Bryant
Počítání metody — založil lekejs
Moderátoři diskuze