Jump to content

    

Recommended Posts

Доброе время суток!

Помогите настроить АЦП в каскадном режиме работы.. чтото не очень понял как это сделать.. проблема в следующем.. почему то нет данных со старщих каналов АЦП.. код настройки такой

Hardware->ADCTRL1.bit.SUSMOD=1; //1

Hardware->ADCTRL1.bit.ACQ_PS=15; //15

Hardware->ADCTRL1.bit.CPS=0;

Hardware->ADCTRL1.bit.CONT_RUN=0; //0

Hardware->ADCTRL1.bit.SEQ_CASC=1;

 

 

Hardware->ADCTRL2.all=0;

 

Hardware->ADCTRL2.bit.INT_ENA_SEQ1=1;

Hardware->ADCTRL2.bit.INT_MOD_SEQ1=0;

Hardware->ADCTRL2.bit.EVA_SOC_SEQ1=1;

 

 

 

Hardware->ADCTRL3.bit.ADCPWDN=1;

Hardware->ADCTRL3.bit.ADCCLKPS=3;

Hardware->ADCTRL3.bit.SMODE_SEL=0;

 

 

Hardware->ADCMAXCONV.all=15;

Hardware->ADCCHSELSEQ1.bit.CONV00=0;

Hardware->ADCCHSELSEQ1.bit.CONV01=1;

Hardware->ADCCHSELSEQ1.bit.CONV02=2;

Hardware->ADCCHSELSEQ1.bit.CONV03=3;

Hardware->ADCCHSELSEQ2.bit.CONV04=4;

Hardware->ADCCHSELSEQ2.bit.CONV05=5;

Hardware->ADCCHSELSEQ2.bit.CONV06=6;

Hardware->ADCCHSELSEQ2.bit.CONV07=7;

Hardware->ADCCHSELSEQ3.bit.CONV08=12;

Hardware->ADCCHSELSEQ3.bit.CONV09=11;

Hardware->ADCCHSELSEQ3.bit.CONV10=8;

Hardware->ADCCHSELSEQ3.bit.CONV11=10;

Hardware->ADCCHSELSEQ4.bit.CONV12=9;

Hardware->ADCCHSELSEQ4.bit.CONV13=13;

Hardware->ADCCHSELSEQ4.bit.CONV14=14;

Hardware->ADCCHSELSEQ4.bit.CONV15=15;

Share this post


Link to post
Share on other sites

Можно попробовать набросать модель в Симулинке Матлаба. Сгенерить сишный код оттуда и посмотреть как осуществляется настройка АЦП в коде 8-)

Share this post


Link to post
Share on other sites

Я тут сделал модель в "Матлабе", которая принимает данные с АЦП и отправляет их в последовательный порт УАРТ. Настройки АЦП следующие:

1. ADCCLKPS = 6;

2. CPS = 0;

3. ACQ_PS = 12;

4. Sample time = 0.001 sec.;

5. Оцифровываются каналы с ADCINA0 по ADCINA7.

Модель и получившийся проект в "Код композере" с исходниками на Си я прилагаю во вложении. Может поможет кому-нибудь.

AdcTest.zip

Share this post


Link to post
Share on other sites

Народ помогите плз,

Не мону ни как понять, даже читая датащит по АЦП(http://www.ti.com/lit/ug/spru812a/spru812a.pdf), этож надо так извращенно писать, раз 20 перечитавал, ничего так и не понял.

вот тут, в коде ...

Hardware->ADCCHSELSEQ1.bit.CONV00=0;

Hardware->ADCCHSELSEQ1.bit.CONV01=1;

Hardware->ADCCHSELSEQ1.bit.CONV02=2;

Hardware->ADCCHSELSEQ1.bit.CONV03=3;

Hardware->ADCCHSELSEQ2.bit.CONV04=4;

Hardware->ADCCHSELSEQ2.bit.CONV05=5;

...

...

0 1 2 3 4 5 ... - это что за magic_numbers, что за значения такие?

В даташите тоже такое в примерах указвается но не сказано что за значения...

Это то в каком порядке должны переключаться каналы АЦП, или чтото другое?

Хелп плиз, актуально очень...

Share this post


Link to post
Share on other sites
0 1 2 3 4 5 ... - это что за magic_numbers, что за значения такие?

стр. 44 вышеприведенного даташита. 0 1 2 3 4 5 - это номер канала АЦП (физическая ножка). А регистр предназначен для выбора последовательности опроса каналов в автоматическом режиме (собственно и название регистра говорящее).

 

 

Share this post


Link to post
Share on other sites
стр. 44 вышеприведенного даташита. 0 1 2 3 4 5 - это номер канала АЦП (физическая ножка). А регистр предназначен для выбора последовательности опроса каналов в автоматическом режиме (собственно и название регистра говорящее).

выходит я верно понял, однако хочу уточнить, верно ли я понял передаваемый смысл работы этого мудренного ацп

если я укажу последовательность 12 7 4 9 3 6 2 13 5... - то имено в такой последовательсти будут опрашиваться все каналы, включая режим каскадирования?

И именно в такой последовательности будут находиться измерения каналов в соответствующих ADCRESULTn ?

И еще - как мне сделать если нужно опросить не 8 и не 16 каналов, а к примеру только 5 каналов, причем в режиме Dual Sequences, тоесть эти 5 каналов разбросаны на 2 банка АЦП как (например)3 и 2? Ограничение каналов измерения как я понял указывается значением в регистре - ADCMAXCONV, верно?

Если верить примеру на стр22 то так можно но вот как, однако из написанного ниграму не ясно как, пример бы посмотреть...

PS

Нашел интересный сайт с примерами - http://search.pudn.com/search_read.asp?key...s320f28*&p=

Share this post


Link to post
Share on other sites
выходит я верно понял, однако хочу уточнить, верно ли я понял передаваемый смысл работы этого мудренного ацп

если я укажу последовательность 12 7 4 9 3 6 2 13 5... - то имено в такой последовательсти будут опрашиваться все каналы, включая режим каскадирования?

может, книга поможет? Глава 6. все по АЦП именно этого процессора. Ссылка на Книгу в этой ветке

Share this post


Link to post
Share on other sites
может, книга поможет? Глава 6. все по АЦП именно этого процессора. Ссылка на Книгу в этой ветке

не могу, у меня заблокированы на работе многие сайты с файлозашарками, и указанный вами тоже... Дома посмотрю, но толку будет мало - на работу то я её не принесу, флешки запрешены тоже.

Share this post


Link to post
Share on other sites
выходит я верно понял, однако хочу уточнить, верно ли я понял передаваемый смысл работы этого мудренного ацп

если я укажу последовательность 12 7 4 9 3 6 2 13 5... - то имено в такой последовательсти будут опрашиваться все каналы, включая режим каскадирования?

Вроде бы, да - в такой последовательности. Даже логично получается: если у вас на всех входах АЦП висят датчики внешние и Вам приспичило именно в такой последовательности оцифровывать, то почему бы и нет, т.е. TI тут предоставила свободу творчества, что вылилось в общем усложнении

Вот что я в прошлом году натворил (хотя тогда еще зелёнее, чем сейчас был..)

 

//функция, подключающая к питанию все внутренние блоки АЦП
void PowerUpADC(void)
{
    //Должна быть использована следующая последовательность
    //без ТИ не будет записи,чтения в регистры АЦП
    
    if(!SysCtrlRegs.PCLKCR0.bit.ADCENCLK)
    {
        //включаем тактирование
        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
        EDIS;
        //д/б задержка 2-SYSCLOCK цикла
        asm(" NOP");
        asm(" NOP");
    }
    //1. Разрешаем/запрещаем внешний источник опоры
    AdcRegs.ADCREFSEL.bit.REF_SEL = 1;
    //2. Power up reference/bandgap/ADC circuits together (одновременно)
    AdcRegs.ADCTRL3.all = 0x00E0;
    //3. Before performing the first conversion, a delay of 5 ms is required
        //сбросим WatchDog, если он включен
    ServiceDog();
    DELAY_US(5000);    
}

void InitializeADCmy()
{
    
    if(!SysCtrlRegs.PCLKCR0.bit.ADCENCLK)
    {
        ////разрешаем тактирование АЦП от HSPCLK (HISPCP)
        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
        EDIS;
        //д/б задержка 2-SYSCLOCK цикла
        asm(" NOP");
        asm(" NOP");
    }

   // *IMPORTANT*
   // The ADC_cal function, which  copies the ADC calibration values from TI reserved
   // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the
   // Boot ROM. If the boot ROM code is bypassed during the debug process, the
   // following function MUST be called for the ADC to function according
   // to specification. The clocks to the ADC MUST be enabled before calling this
   // function.
   // See the device data manual and/or the ADC Reference
   // Manual for more information.

    ADC_cal();
    

//Включение питания
    PowerUpADC();

//Тактирование: прескайлеры
    //FCLK = HSPCLK
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x00;
    //ADCLK = FCLK
    AdcRegs.ADCTRL1.bit.CPS = 0;


//Sampling Window (determines for what time duration the sampling switch is closed): 
//The width = (ACQ_PS + 1) times the ADCLK period.
/* 
From 'TMS320F2812_Implementation tutorial' p.169 (6-6): 

"the sampling window controlled by the field ”ACQ_PS”. This group of bits 
defines the length of the window that is used between the multiplexer switch
and the time when we sample (or ”freeze”) the input voltage.
This time depends on the line impedance of the input signal.
So it is hardware dependent"

*/
    //для оцифровки максимально возможных сигналов для данного АЦП
    // примем Окно = 0;
    //т.е 1- ADCKL УВХ будет обрабатывать входной аналоговый сигнал
    //и в конце следующего 1-ADCKL цифровой результат появится на выходе АЦП
    //ПОЭТОМУ ЧАСТОТА ADCKL = 25 МГц, хотя у АЦП мах частота = 12,5 МГц!!!!!! 
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0;
    //Выставляем "Continious conversion mode"
    AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
    //разрешаем SEQ wrap around при достижении MAXCONVn
    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
    //Объединяем SEQ1 & SEQ2 -> SEQ = 16-state sequenser
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;



    //Режим сэмплирования: последовательный
    AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;
    //выставляем глубину буффера АЦП = 16
    AdcRegs.ADCMAXCONV.all = BUF_ADC_DEPTH;

    //Выбираем каналы для сэмплирования: везде нулевой канал ADCINA0

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x0;

    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x0;
    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x0;
    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x0;

    AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x0;
    AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x0;
    AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0;
    AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0;

    AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x0;
    AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0x0;
    AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0x0;
    AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x0;


//Прерывание  sprufb0d p. 122

    //запрещаем глобально
    DINT;

    //Разрешаем прерывание от SEQ1 при каждом достижении конца последовательности (EOS)
    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
#if EXAMPLE2
    //разрешаем работать SOC от ePWMxSCOA 
    AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
#endif
    
    //Разрешаем прерывание ADCINT инициируемое EOS (концом последовательности SEQ1)
    // в блоке PIE: ADCINT = INT1.1
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

    // группа INT1
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;

    //Разрешаем прерывание в CPU по каналу INT1
    IER |= (1<<0);
/* 
в main добавить следующие строки

    разрешаем глобальное прерываниe
    и режим отладки
    EINT;
    ERTM;

*/
}    // InitializeADCmy();

 

не могу, у меня заблокированы на работе многие сайты с файлозашарками, и указанный вами тоже... Дома посмотрю, но толку будет мало - на работу то я её не принесу, флешки запрешены тоже.

ну пишите в личку вашу почту - вышлю книгу

 

И именно в такой последовательности будут находиться измерения каналов в соответствующих ADCRESULTn ?

Чего - то мне кажется, что Да - в той же последовательности .. "Each sample and hold is connected to 8 multiplexed input lines. The auto sequencer is a programmable state

machine and is able to automatically convert up to 16 input signals. Each state of the auto sequencer puts a measurement into its own result register.

"

 

Дома посмотрю, но толку будет мало

Не надо ничего! Вот глава ( мог бы в лучшем качестве распечатать, но даже 300 dpi почему то печатает 5,8 Метров, а 600 dpi чуть больше 6 Метров, а 150 dpi - уже 2,5 М... нелинейность)

 

TMS320F2812_Implementation_tutorial_Ch_6_ADC.pdf

Edited by beaRTS

Share this post


Link to post
Share on other sites

beaRTS - Огромное Вам спасибо! Человек! :)

Кое что прояснилось. Пошел читать документ что вы прицепили. За код - отдельное Спасибо!

 

Заметил у вас использование вот этих команд в коде, раньше тоже встречал уже, специфических для этой архитектуры

EALLOW;

...

EDIS;

...

//запрещаем глобально

DINT;

...

разрешаем глобальное прерываниe

и режим отладки

EINT;

ERTM;

 

Где есть полный их перечень? А то приходится по огрызкам гуглить и конспектировать ;) .

Share this post


Link to post
Share on other sites
Заметил у вас использование вот этих команд

EALLOW;

...

EDIS;

...

//запрещаем глобально

DINT;

...

разрешаем глобальное прерываниe

и режим отладки

EINT;

ERTM;

 

Где есть полный их перечень? А то приходится по огрызкам гуглить и конспектировать ;) .

Я начал методично весь геммор записывать к себе в бложик, так сказать, конспектирую - без этого никуда..

НАсчет где почитать. Сейчас приложу файлы и кидану ссылочки, что накопаю.

 

EALLOW, EDIS:

качаем на свой проц доку "System Control and Interrupts" -> глава EALLOW-Protected Registers (в моем глава 7.2), кратко:

The following registers are EALLOW-protected:

• Device Emulation Registers

• Flash Registers

• CSM Registers

• PIE Vector Table

• System Control Registers

• GPIO MUX Registers

• Certain eCAN Registers

• XINTF Registers

 

EINT, DINT - enable/disable interrupt - для того, чтоб сделать часть Вашего кода атомарной (не прерываемой ни под каким предлогом!)

качаем "TMS320C28x CPU and Instruction Set" и пользуемся поиском по документу.

 

ERTM - не нашел в каком документе искать, но помнится, что это Enable Real-Time Mode - для средств отладки. По-любому, он вписывает какой-то бит в один из регистров специального назначения, который за отладку отвечает (вроде такой был на борту 28х )

DSP2833x_HeaderFiles_QuickStart_EALLOW_EDIS.pdf

Edited by beaRTS

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this