...
Może to ci w czymś pomoże. Metoda trochę inna, znaczy się podobna, ale działająca w przeciwny sposób. Komparator wytwarzałby ci przebieg prostokątny z sygnału, który zliczałby licznik w zadanym czasie, reszta to porównania.
http://cronos.rutgers.edu/~lrr/Reprints ... ection.pdf
Wracając jednak do twojego programu. Jest on jak dla mnie dziwnie napisany, bo po uruchomieniu go dokonujesz dziwnych operacji na niezainicjowanych zmiennych. Np. ten fragment:
No i cały program jest dosyć zawiły przez to goto nieszczęsne.
Co do twojego problemu. Dałoby się to pewnie obejść, tablicując wyniki pomiaru. Chodzi o to żeby stworzyć tablicę TONY[x] as Byte, gdzie x to ilość tonów, i zliczać w niej ile razy w ciągu np. 20 pomiarów, dany ton się pojawił. Na tej podstawie powinno dać się oszacować, w pewnych granicach poprawnie tony.
Właściwie przy takim procesorze to należałoby zastosować algorytm Goertzela.
http://cronos.rutgers.edu/~lrr/Reprints ... ection.pdf
Wracając jednak do twojego programu. Jest on jak dla mnie dziwnie napisany, bo po uruchomieniu go dokonujesz dziwnych operacji na niezainicjowanych zmiennych. Np. ten fragment:
To takie raczej błędy merytoryczne ,ale istotne. Podobnie masz w przerwaniu, odejmujesz za pierwszym razem..., no właśnie nie wiadomo właściwie co ? Bo domyślnie nie musi być tam zero.Main:
Waitms 2
Czest_pom = 20000000 / Icr_new ' Przez co dzielisz ? Przez 0, czy wartość przypadkową ?
Icr_new = 1 << tu dopiero przypisujesz wartość zmiennej
Czest = Czest_pom
No i cały program jest dosyć zawiły przez to goto nieszczęsne.
Co do twojego problemu. Dałoby się to pewnie obejść, tablicując wyniki pomiaru. Chodzi o to żeby stworzyć tablicę TONY[x] as Byte, gdzie x to ilość tonów, i zliczać w niej ile razy w ciągu np. 20 pomiarów, dany ton się pojawił. Na tej podstawie powinno dać się oszacować, w pewnych granicach poprawnie tony.
Właściwie przy takim procesorze to należałoby zastosować algorytm Goertzela.
A.. jednak coś znajomy mi się temat wydawał. Na pewno można to jakoś udoskonalić. Ale ja już nie mam AVRów, poza ATTiny681. Mi niestety Goertzela nie wypali bo potrzebowałbym proca z przetwornikiem co najmniej 200Kbps (lepiej 300-500Kbps), a AVR, ani małe PICi takowym nie dysponują, XMEGA za wielka, a ARMa puki co nie opanowałem, choć to też by byl przerost formy nad treścią. Wiec twoja metoda jest interesująca, tylko potrzebowałbym jaki prosty generator programowy do karty dźwiękowej.
Tak trochę jeszcze nad tym myślałem i najprościej to chyba zrobić na PICu (ale niestety nie na tym który posiadasz). Tam komparator może bramkować Timer1. Jeżeli timer, będziesz taktował 2MHz, to jak podasz 1KHz to powinien zliczyć ok 1000 impulsów, dla przebiegu prostokątnego, czyli zasadniczo wynik będzie gotowy od razu w rejestrze Timera. Teraz należałoby te dane wrzucić do jakiegoś bufora, nawet 8 elementowego, i sprawdzać go.
TZn. Tak. Ten pomiar czasu będzie zależał silnie od amplitudy badanego przebiegu. dla tego należało by zebrać w jakieś tablicy np. 8 pomiarów i je uśrednić. Wynika to z tego że w zależności od amplitudy sygnału komparator wytnie ci odcinki czasu o różnej długości, dla tej samej częstotliwości.
Ja pisałem o PICu bo tam fajnie Timer1 z komparatorem robi to sprzętowo, znaczy mierzy czas sygnału. A z AVRów to mam jeszcze w domu chyba jakie ATTINY461, wiec tylko na tym mógłbym coś popróbować.
Ewentualnie można próbować przerobić ten program, w taki sposób żeby miał zapis proceduralny, a nie typu GOTO.
Tylko że ja widze tu już w tym programie uśrednianie jest ? Wiec nie wiem co tu mozna jeszcze dodac ?
Ogólnie to w tym programie nie podoba mi się metoda przechwytywania wartości z Timera, która nie jest w żaden sposób synchronizowana, To może powodować że odczytane wartości będą po prostu rozbieżne. Moim zdaniem przerwanie od Komparatora na zboczu narastającym sygnału, powinno odpalać wcześniej wyzerowany Timer, po czym zbocze opadające powinno wyzwalać układ ICP, i odczytywać wartość timera, oraz zerować go do następnego pomiaru.
Ja pisałem o PICu bo tam fajnie Timer1 z komparatorem robi to sprzętowo, znaczy mierzy czas sygnału. A z AVRów to mam jeszcze w domu chyba jakie ATTINY461, wiec tylko na tym mógłbym coś popróbować.
Ewentualnie można próbować przerobić ten program, w taki sposób żeby miał zapis proceduralny, a nie typu GOTO.
Tylko że ja widze tu już w tym programie uśrednianie jest ? Wiec nie wiem co tu mozna jeszcze dodac ?
Kod: Zaznacz cały
For Probka = 1 To 5
Czest_suma = Czest_suma + A(probka)
Next
Czest_pomiar = Czest_suma / 5
Czest_gorna = A(1) + 20
Czest_dolna = A(1) - 20
Ostatnio zmieniony 13 paź 2012, 16:22 przez kayron, łącznie zmieniany 1 raz.
No to chyba na podobnej zasadzie działał układ na zwykłych scalakach do którego podałem ci link w moim pierwszym poście, tam właśnie licznik zliczał impulsy w zadanym okresie czasu.
Znalazłem tez archiwalny opis układu UM92870 z EDW. https://elportal.pl/pdf/k01/11_01.pdf.
Ogólnie trzeba mierzyć okres sygnału w przejściach przez zero, ale także, uśredniać go z kilku pomiarów. Pisze tam też o zakłóceniach, które mogą się nakladać, więc nie jest to taki prosty układ jakby mogło się wydawać.
Znalazłem tez archiwalny opis układu UM92870 z EDW. https://elportal.pl/pdf/k01/11_01.pdf.
Ogólnie trzeba mierzyć okres sygnału w przejściach przez zero, ale także, uśredniać go z kilku pomiarów. Pisze tam też o zakłóceniach, które mogą się nakladać, więc nie jest to taki prosty układ jakby mogło się wydawać.