Może mi ktoś wytłumaczyć czemu pokazują 2 różne wyniki?? Kod ten sam atmega328 i atmega16 mega wszystko liczy idealnie m328 jak chce i nie widzi zbocz na innych falach niż kwadratowe

#elektronika #arduino

PWM 1mhz jest w miarę ok ale m328 na PWM 8Mhz już pokazuje zaniżone wyniki

Oba kwarce 16Mhz ale ten na m328 jest bardzo malutki

d35bbe2d-c027-48cd-a5ca-9058898fa2a4

Komentarze (16)

MostlyRenegade

@Fox ja tam się nie znam, ale może ten drugi kwarc jest jakiś padnięty, czy coś?

Fox

@MostlyRenegade Nie to by nie zadziałało wgl. Stawiam grube dolany że to po prostu chiński klon podjebka m328. Stąd nie wyrabiają norm bardzo pasuje do diagnozy.

psalek

A na pewno chodzą na tym kwarcu a nie na wbudowanym R-C? (Choć nie pamiętam już nawet czy atmegi miały wewnętrzny generator R-C)

Fox

@psalek Tak sprawdzałem Błąd by był liniowy gdyby kitajec zamontował np 12Mhz kwarc. Do tego liczenie tajmerów pokazuje ze to musi być 16Mhz. Żółty klon Atmega po prostu. M88 m328 m48 to wszystko chyba tylko podróby można dostać które nie machają nóżkami tak szybko jak oryginały.

macgajster

Policz jaka to jest różnica w czasie między obydwoma sygnałami (różnica częstotliwości -> różnica czasu), sprawdź jaki masz rozrzut częstotliwości kwarców, jak szybkie są te procesory względem siebie, jak szybkie są odczyty na portach.

Na różne wyniki składają się rozrzuty technologiczne wszystkich komponentów w torze pomiarowym i przetwarzania.

Do tego, jeśli nawet operujesz z częstotliwością 16 MHz, to jest to minimalna częstotliwość, żeby odczytać sygnał. Twierdzenie Shannona-Nyquista.

Jesteś na granicy, procek trochę się spóźni z odczytaniem sygnału i już masz inną częstotliwość niż zakładana. Zmniejsz częstotliwość do np. 4 MHz i obserwuj, powinno być dużo lepiej, bo na jeden okres przypadną 4 próbki (idealnie).

Fox

@macgajster Szkoda że nie mam generatora powyżej 8Mhz. Bo bym sprawdził. Liczy przede wszystkim tylko kwadratowe sygnały z falą sinus już mu nie idzie. A prostokąty do ok 2Mhz w miarę bez większego błędu.

Stawiam na podróbę. Jakoś M16 sobie radzi z prędkością połowy własnego zegara i różnymi falami które nie są kwadratem. To by się zgadzało na żółte wykonanie.

6502

@Fox Możesz napisać coś więcej o tym czym generujesz sygnał i jak go mierzysz? Częstotliwość bezpośrednio przez wejście T0/T1?

Fox

@6502 Timer sobie mierzy 500ms, czyli wynik 2x sekundę, to działa.

Timer na przerwaniu falling edge inkrementuje licznik niby działa ale jak widać coś przegapia

np analogowe wolniejsze zbocza

Sygnał sobie generuję na DAC R2R np sinus trójką można wiele fali sobie wygenerować. Mniejsza o fale licznik w 328 nie widzi opadających zbocz na zwykłej atmega16 bo może latać na 5V i 16Mhz

6502

@Fox

Timer na przerwaniu falling edge

To inkrementujesz timer sprzętowo, czy zmienną w przerwaniu triggerowanym zboczem opadającym? Bo na T0/T1 nie ma przerwania na zboczu tylko od przepełnienia licznika jeśli dobrze pamiętam. Wrzuć gdzieś kod to zerknę w wolnej chwili ʕ•ᴥ•ʔ

Kiedyś zrobiłem czestościomierz na Atmedze 8, pamiętam ze dawałem na wejściu jakiś wzmacniacz na jfecie i przerzutnik Schmitta żeby prawidłowo działał z sygnałami analogowymi

Fox

@6502


$regfile = "m328pbdef.dat"

$crystal = 16000000

$hwstack = 100

$swstack = 100

$framesize = 256

Ddrd = &B00001000

Const Licznik = 57775'wymaga kalibracji

Dim Frequency As Long

' zegar / 1024 = wynik/4 wyniki na sekundę, 65536 - wynik '57723 dla 16mhz

Config Timer1 = Timer , Prescale = 1024

On Timer1 Czas

Enable Timer1

Config Timer0 = Counter , Edge = Falling

On Timer0 Zlicz

Enable Timer0 'wej T0

Counter1 = Licznik

Dim Tmp As String * 16

$include "Decl.bas"

'Wave = 1

Call Lcd_init()

Call Lcd_text( "16Mhz 16/10/25r" , 10 , 5 , 1) 'Draw Text to Buffer

Call Lcd_text( "JM Foxbat" , 10 , 18 , 1)

Call Lcd_show()

Wait 1

Call Lcd_clear(black)

Enable Interrupts

Do

Ocr2b=128'wypełninie pd3

Loop

$include "6x8.font"

$include "12x16.font"

$include "SSD1306_i2c.bas"

Czas:

Stop Timer0

Stop Timer1

Shift Frequency , Left , 8 'miejsce na doklejenie

Frequency = Frequency + Counter0 'doklejamy niepełny ovf

Frequency = Frequency * 2 'bo wynik aktualizujemy 2x/sek

Tmp = Str(frequency)

Tmp = Format(tmp , "00000000")

Tmp = Tmp + "Hz"

Call Lcd_text(tmp , 1 , 1 , 2) 'Draw Text to Buffer

Call Lcd_set_pixel(25 , 15 , White) : Call Lcd_set_pixel(61 , 15 , White)

Call Lcd_set_pixel(25 , 16 , White) : Call Lcd_set_pixel(61 , 16 , White)

Call Lcd_text( "PWM 31164Hz PD3" , 4 , 24 , 1)

Call Lcd_show()

Frequency = 0

Counter0 = 0

Counter1 = Licznik

Start Timer0

Start Timer1

Return

Zlicz: 'tu naliczamy herce

Incr Frequency

Return

6502

@Fox Chryste Panie, BASCOM ʕ•ᴥ•ʔ Tutaj niestety nie pomogę ( ͡° ʖ̯ ͡°)
Edit: na 16 używałeś dokładnie tego samego kodu co na 328? Powinieneś zmienić m328pbdef.dat. Poza tym timery w 16 i 328 trochę się różnią jeśli dobrze pamiętam.

d4560c95-25af-40c9-94f9-9588b43c50a4
Fox

@6502 do hobbi wystarczy mi bas. Może kiedy spubóję cpp na RP. A timer gdyby sie różniły to by nie zadziałał w ogóle. Albo inaczej zupełnie, a nie że sie wyniki rozjeżdżają.

m_h

A ta różnica pojawia się od razu po uruchomieniu generatora czy po jakimś czasie? Bo jeżeli po jakimś czasie może być problem jitter cleanera.

Fox

@m_h nie no natychmiast liczy źle

m_h

@Fox Cholera, a to nie bedzie problem z wyświetlaczem? Widzę że mimo wszystko używasz dwóch innych wyświetlaczy a jak dobrze rozumiem kod to aktualizujesz wartość wyświetlacza w przerwaniu. Jakiekolwiek operacje matematyczne czy komunikowanie z peryferiami na poziomie przerwania wpływają na koncowy wynik.

Fox

@m_h oba mają jednakowe oledy i jednakowe kody. Tylko ilość nóżek się różni ale to nie ma znaczenia. Chińska podróba nie radiz sobie ze zboczami inna technologia produkcji wyłazi mi tutaj.

Zaloguj się aby komentować