logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR, R2R, generowanie sinusa z płynną zmianą częstotliwości

Marcin1326 24 Lut 2008 19:13 2421 6
REKLAMA
  • #1 4841801
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    Jak zrealizować płynną zmianę częstotliwości w układzie z przetwornikiem D/A w postaci drabinki rezystancyjnej?
    Schemat podobny do tego: http://www.myplace.nu/avr/minidds/minidds_schematic.gif
    Przerwanie w moim programie wygląda tak:

    
    SIGNAL(SIG_OVERFLOW1)
    {
    	TCNT1 = wpisz;
    	i++;
    	PORTB = pgm_read_byte(&sinewave[i]);
    }
    


    Tablica:
    const uint8_t  sinewave[] PROGMEM = //256 values
    {
    0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
    0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
    0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
    0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
    0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
    0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
    0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
    0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
    0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
    0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
    0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
    0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
    0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
    0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
    0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
    };


    zmieniając wartość zmiennej wpisz zmieniam częstotliwość. Chciałbym żeby ta zmiana była przynajmniej co 1Hz, co jest teraz niemożliwe szczególnie przy wyższych częstotliwościach. Jak można rozwiązać ten problem?
  • REKLAMA
  • #2 4842145
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Możesz zrobić to na dwa sposoby:
    1. przez regulację częstotliwości timera który generuje przerwanie
    2. przez regulację skoku w banku próbek przy dużym skoku podstawowym (np 100-200) zmiana +1/-1 powinna dać bardzo mały krok w zmianie częstotliwości sygnału wyjściowego.
  • REKLAMA
  • #3 4842174
    tajwoj
    Poziom 26  
    Posty: 560
    Pomógł: 106
    Ocena: 102
    Jaki zakres częstotliwości potrzebujesz?
  • REKLAMA
  • #4 4842452
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    Cytat:
    1. przez regulację częstotliwości timera który generuje przerwanie

    tym sposobem przy większych częstotliwościach zwiększa się krok
    Cytat:

    2. przez regulację skoku w banku próbek przy dużym skoku podstawowym (np 100-200) zmiana +1/-1 powinna dać bardzo mały krok w zmianie częstotliwości sygnału wyjściowego.

    mógłbyś szerzej opisać albo dać jakieś linki? Czy w takim przypadku musiałbym zwiększyć ilość próbek w tablicy.

    Zakres częstotliwości od 20Hz do 2 albo 3 KHz

    Chodzi mi głównie o to żeby mieć stały krok, np. co jeden Herz.
  • Pomocny post
    #5 4842639
    tajwoj
    Poziom 26  
    Posty: 560
    Pomógł: 106
    Ocena: 102
    Podaję skompresowany programik robiący DDS.
    Zakres częstotliwości od poniżej 7Hz do powyżej 30kHz ze skokiem poniżej 1Hz.
    Możesz go łatwo dostosować do swoich potrzeb po zapoznaniu się np. z:
    http://teleinfo.pb.bialystok.pl/~krashan/pracownia2.html
    http://www.edw.com.pl/modules.php?op=modload&...le=article&sid=25&mode=thread&order=0&thold=0
    Archiwum zawiera plik sin256.prj umożliwiający natychmiastową symulację w VMLAB.
    Załączniki:
    • dds_sin_256.tar.gz (11.99 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #6 4848984
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    tajwoj! dzięki wielkie za linki i program!
  • #7 4851698
    Marcin1326
    Poziom 13  
    Posty: 120
    Pomógł: 2
    Ocena: 39
    A skąd się biorą te dziwne liczby:
    tuwo = 1395865
    stroj = 5000
    Jak je wyliczyłeś?

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy realizacji płynnej zmiany częstotliwości sygnału sinusoidalnego generowanego za pomocą mikrokontrolera AVR i przetwornika DAC w postaci drabinki rezystancyjnej (R2R). Proponowane metody obejmują regulację częstotliwości timera generującego przerwania lub zmianę kroku indeksu w tablicy próbek sinusoidy, co pozwala na kontrolę częstotliwości wyjściowej. Wskazano, że przy wyższych częstotliwościach zmiana kroku powoduje większe skoki częstotliwości, co wymaga zwiększenia liczby próbek w tablicy. Zakres częstotliwości do uzyskania to od około 20 Hz do 2-3 kHz z krokiem 1 Hz. Udostępniono przykładowy program DDS umożliwiający generację sygnału w szerokim zakresie (od poniżej 7 Hz do ponad 30 kHz) z krokiem mniejszym niż 1 Hz, wraz z linkami do materiałów i symulacji w VMLAB. Pojawiły się pytania dotyczące obliczania parametrów programu, takich jak wartości „tuwo” i „stroj”, które są związane z ustawieniami częstotliwości i strojenia generatora DDS.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA