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

ADC w TMS320F2812 / zmiana kanału próbkowania

ziobroo 03 Wrz 2007 23:25 1679 2
  • #1 4248278
    ziobroo
    Poziom 12  
    Mam przykładowy projekt ze strony TI : adc_seqmode_test.
    Jest to przykład próbkowania przez kanał A0. Które części w kodzie muszę zmienić, żeby procesor próbkował mi z kanału BO?

    Na razie wywnioskowałem, że w pliku Example_281xAdcSeqModeTest.c
    trzeba chyba zmienić linijki:
    SampleTable[i] =((AdcRegs.ADCRESULT0>>4) );
    na
    SampleTable[i] =((AdcRegs.ADCRESULT8>>4) );
    (choć nie jestem przekonany czy tu trzeba coś zmieniać)
    oraz
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    na
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8;

    Ale na razie bez efektów. Mam kwarc 20 MHz i w pliku DSP281x_Examples.h ustawiłem:
    #define CPU_RATE 10.000L // for a 100MHz CPU clock speed (SYSCLKOUT)

    Przykład jest niby na 150 MHz, a co za tym idzie na próbkowanie z częstotliwością 12,5 MSPS. Ale to po prostu tylko powinien mi układ próbkować wolniej o 1/3 chyba i to wszystko.

    Wklejam kod tego pliku źródłowego do próbkowania:

    // TI File $Revision: /main/2 $
    // Checkin $Date: April 28, 2005   15:17:26 $
    //###########################################################################
    //
    // FILE:   Example_281xAdcSeqModeTest.c
    //
    // TITLE:  DSP281x ADC Seq Mode Test.
    //
    // ASSUMPTIONS:
    //
    //          This program requires the DSP281x V1.00 header files.  
    //          As supplied, this project is configured for "boot to H0" operation.  
    // 
    //          Make sure the CPU clock speed is properly defined in 
    //          DSP281x_Examples.h before compiling this example.
    //
    //          Connect the signal to be converted to channel A0.
    //
    // DESCRIPTION:    
    //
    //          Channel A0 is converted forever and logged in a buffer (SampleTable)
    //
    //          Open a memory window to SampleTable to observe the buffer
    //          RUN for a while and stop and see the table contents.
    //
    //          Watch Variables:
    //             SampleTable - Log of converted values.
    //
    //###########################################################################
    // $TI Release: $
    // $Release Date: $
    //###########################################################################
    
    #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
    #include "DSP281x_Examples.h"   // DSP281x Examples Include File
    
    // ADC start parameters
    #define ADC_MODCLK 0x3   // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)         = 25MHz
    #define ADC_CKPS   0x1   // ADC module clock = HSPCLK/2*ADC_CKPS   = 25MHz/(1*2) = 12.5MHz
    #define ADC_SHCLK  0xf   // S/H width in ADC module periods                      = 16 ADC clocks
    #define AVG        1000  // Average sample limit
    #define ZOFFSET    0x00  // Average Zero offset
    #define BUF_SIZE   2048  // Sample buffer size
    
    // Global variable for this example
    Uint16 SampleTable[BUF_SIZE];
    
    main() 
    {
       Uint16 i;
    
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP281x_SysCtrl.c file.
       InitSysCtrl();
          
    // Specific clock setting for this example:      
       EALLOW;
       SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/ADC_MODCLK
       EDIS;
    
    // Step 2. Initialize GPIO: 
    // This example function is found in the DSP281x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    // InitGpio();  // Skipped for this example  
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts 
       DINT;
    
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.  
    // This function is found in the DSP281x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt 
    // Service Routines (ISR).  
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP281x_DefaultIsr.c.
    // This function is found in DSP281x_PieVect.c.
       InitPieVectTable();
    
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP281x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
       InitAdc();  // For this example, init the ADC
    
    // Specific ADC setup for this example:
       AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
       AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;     
       AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode
       AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8;// to zmieniłem 
       AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run
    
    
    // Step 5. User specific code, enable interrupts:
    
    
    // Clear SampleTable
       for (i=0; i<BUF_SIZE; i++)
       {
         SampleTable[i] = 0;
       }
    
       // Start SEQ1
       AdcRegs.ADCTRL2.all = 0x2000;
    
       // Take ADC data and log the in SampleTable array  
       while(1)
       {  
         for (i=0; i<AVG; i++)
         {
            while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt
            // Software wait = (HISPCP*2) * (ADCCLKPS*2) * (CPS+1) cycles
            //               = (3*2)      * (1*2)        * (0+1)   = 12 cycles
            asm(" RPT #11 || NOP");
            AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
            SampleTable[i] =((AdcRegs.ADCRESULT8>>4) ); //tu zmieniłem
         }
       }
    }
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    
  • #2 4259531
    __Grzegorz__
    Poziom 30  
    SPRU060, strona 1-2:
    
    ..
    The two 8-channel modules have the capability to autosequence a series of
    conversions, each module has the choice of selecting any one of the
    respective eight channels available through an analog MUX
    ...
    


    To znaczy, że SEQ1 załatwia kanały A a SEQ2 kanały B...
    W programie korzystasz z SEQ1....
  • #3 4260032
    ziobroo
    Poziom 12  
    To znaczy, że SEQ1 załatwia kanały A a SEQ2 kanały B...
    W programie korzystasz z SEQ1....


    Hm... dziwne.
    W końcu mi zadziałało to, miałem po prostu błąd w projektowaniu płytki.
    Ale przyznam, że zadziałał mi kanał B0 przy korzystaniu z SEQ1

    Tak jak poniżej:
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8;


    Przy okazji mam inne pytanie. Jak to jest dokładnie z ustawianiem częstotliwości do przetwornika(i nawet ogólnie do programowania częstotliwości pracy programu).
    Jak używałem CCS 3.1 razem w SDFlash to tam ustawiałem w 2 plikach dane odnośnie częstotliwości:
    1) w pliku sdflash28xWrapper.h ustawiałem na przykład :
    #define PLLCR_VALUE 0x00A// SYSCLKOUT = (OSCLK*10)/2
    2) w pliku Flash281x_API_Config.h ustawiam na przykład:
    #define CPU_RATE 6.667L // for a 150MHz CPU clock speed
    I z tego wychodziło dla kwarcu 30 MHz, że taktowanie CPU jest 150 MHz.
    Teraz jak chcę programować tylko pamięć RAM i tylko przez CCS 3.1 to jest informacja, że należy jedynie ustawić odpowiednią częstotliwość w pliku DSP281x_Examples.h
    No i ustawiam w tym pliku:
    #define CPU_RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT)


    I tutaj się trochę gubię. Nie muszę ustawiać tego współczynnika pętli PLL ?? Bo chodzi o to, że mam kwarc 20MHz. I nie wiem, czy jak ustawiam to 150 MHz to program działa mi na 150 MHz, czy jak? Czy on sobie automatycznie te wartości pętli PLL wylicza czy jak??
    Generalnie, co bym nie ustawiał programy mi ruszają chyba dobrze. Tylko nie jestem pewny jaka jest częstotliwość pracy przetwornika.
    Czy mogę wtedy domyślnie założyć, że skoro jest kwarc 20 MHz to program zakłada mi automatycznie przelicznik pętli PLL na 15/2 ??(wiem, że dostępne są współczynniki od 1/2 do 10/2, ale sprawdziłem i 15/2 też program akceptuje).
REKLAMA