Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
1

Цифровой осциллограф на LPC1768 LangTiger

27.12.2014, 12:35. Просмотров 3807. Ответов 55
Метки нет (Все метки)

Добрый день.
Хочу набраться теории и опыта в программировании ARM и Cortex. Для освоения выбрал нетривиальную тему - "Осциллограф".
За основу взял демоборд с LPC1768 LangTiger (все что нужно на первое время есть на борту).
Написал обработчик прерывание АЦП (накопление выборок) и процедуру вывода на дисплей данных, накидал простейший алгоритм синхронизации.

Подскажите алгоритмы синхронизации. Подскажите как лучше накапливать выборки: в прерываниях по таймеру с определенным интервалом или по прерываниям от АЦП и измерением времени накопления выборок?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        for (m = 1; m < 0x7FF - 320; m++){
            
             temp0 = (ADCBuffer[m-1]/256) & 0xFF;
             temp1 = (ADCBuffer[m]/256) & 0xFF;
            temp2 = (ADCBuffer[m+10]/256) & 0xFF;
 
            if (((temp0 < 127 & temp0 > 110)& temp2 > 127 + i) | z > 0){  //Поиск условия синхронизации
                z++;
                LCD_DrawLine( oldADC[z-1], z-1, oldADC[z], z , White ); //Стирание предыдущих линий
                oldADC[z-1] = temp0;                
                LCD_DrawLine( temp0, z-1, temp1, z , Black );   //Вывод новых линий         
                if (z == 320) break;
            }
 
        }

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

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2014, 12:35
Ответы с готовыми решениями:

LPC1768 + DP83848 = Ethernet
Всем привет. Собственно, проблема в следующем, есть связка LPC1768 + DP83848 и...

Осциллограф на Atmega 8
Все доброго дня. Решил я по этой статье собрать осциллограф. Мегу взял в дип...

Простой цифровой осциллограф.
Сделал себе простенький цифровой осциллограф. Скорее даже, осциллографический ...

Цифровой осциллограф RIGOL DS1052E
добрый день, хочу взять осциллограф, использоваться будет в схемах с AVR...

Цифровой осциллограф. Что скажете.
На диалэкстриме появился осцил Siglent SDS1102CM за $438.80....

55
VladimirU
132 / 110 / 20
Регистрация: 14.02.2013
Сообщений: 799
27.12.2014, 13:04 2
Цитата Сообщение от korsaj Посмотреть сообщение
по прерываниям от АЦП и измерением времени накопления выборок
Из двух только так. Если по отдельному таймеру то это намного сложней. Так или иначе надо не прошляпить выборки.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
27.12.2014, 18:29  [ТС] 3
А по мне так по таймеру проще. И выбирать частоту развертки проще - изменил время срабатывания прерывания от таймера и все.
И к тому же если потом использовать внешний АЦП, то все равно его считывать по таймеру.

А что значит не прошляпить выборки?

И еще, в даташите на мк написано что АЦП работает при тактовом сигнале не более 13 МГц, а я его запустил на 50 МГц, где ошибка?

Посмотрел в отладчике получил примерно 769526 выборок/с, что очень похоже на теоретический расчет 50МГц/65 = 769230 выборок/с, где 65 - кол-во тактов на преобразование, 50 МГц - тактовая частота АЦП.

Для нормального отображения сигнала можно выбрать начальный отсчет в 10мкС на деление при частоте выборок 500 000 выборок/с, что даст 5 выборок на деление.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
27.12.2014, 20:51  [ТС] 4
Фото с экрана демоборда: синусоида 3169 Гц, развертка 2мкС на пиксель, экран 240х320.
0
Миниатюры
Цифровой осциллограф на LPC1768 LangTiger  
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
27.12.2014, 21:04  [ТС] 5
Выборки по прерыванию от таймера.
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
28.12.2014, 00:42 6
В этом кортексе что, нету DMA? Естественно, что использовать нужно его, если есть. Иначе вы рискуете пропускать данные.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
28.12.2014, 00:45  [ТС] 7
DMA есть, но что значит пропускать данные, точнее сказать как без этого? Вы что ли предлагаете кольцевой буфер? Я не совсем пойму выражения "пропускать данные"..
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
28.12.2014, 11:11 8
korsaj, при использовании DMA вы получите строго выстроенную временнУю последовательность данных от АЦП. Тактование будет конечно от АЦП(а не от таймера), но зато задержек в обработке никаких не будет. Кольцевой буфер типа FLIP-FLOP, два прерывания - половины буфера и всего буфера, и будет вам счастье.

При использовании же таймера вы вообще не сможете получить равномерные по времени данные, т.к. АЦП в таком случае будет работать асинхронно (с таймером), а значит будут некоторые временнЫе погрешности.

Ну, и самый тяжкий вариант - когда вы не будете успевать обрабатывать приходящие данные ввиду неких внутренних задач (например, вы ведь при выводе на экран тоже DMA не используете?).
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
28.12.2014, 11:32  [ТС] 9
Чет вы перемудрили...
Все очень синхронно. В прерывании от таймера (каждые 2 мкС) считываем значения АЦП запущенное в предыдущий раз и запускаем новое однократно преобразование. Так повторяется до заполнения буфера в 2048 байт. Все это время функция вывода на экран ожидает и как только буфер заполнен выводит данные на экран.
В осциллографе только 1 функция временно зависимая - выборка, вот она строго привязана ко времени за счет прерываний от таймера.

DMA пока не использую, но есть желание функции вывода на экран перевести на аппаратный SPI в связке с DMA.
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
28.12.2014, 20:14 10
Цитата Сообщение от korsaj Посмотреть сообщение
Чет вы перемудрили...
ну чего перемудрил? Так делается осцил. Например, я уверен, что вот такой осцил (DSO201), который выполнен на Cortex M3 STM32F103, использует именно DMA и прямой доступ к памяти для вывода на экран. Сегодня вы хотите вывести данные, а завтра - посчитать амплитуду, максимумы и минимумы. А в момент вывода на экран никакого анализа данных реалтайм не будет.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
28.12.2014, 20:37  [ТС] 11
Да я не о том.., не о DMA, а о том что нет никакой разсинхронизации.
Допустим я сделаю непосредственную запись данных от АЦП в ОЗУ за счет модуля DMA, но тогда как мне делать масштабирование по оси Х, ведь буфер имеет конечный объем. И как организовать атомарный доступ к участку памяти с данными, ведь он может переписываться в любой момент. Если я остановлю АЦП, то будет пропуск данных, чего вы тоже опасаетесь.
Но к тому же пропуск (потеря данных) неизбежна, ведь время вывода на экран намного выше времени заполнения буфера выборок. А так же все равно нет смысла обновлять экран чаще 25 Гц, так как человеческий глаз не заметит изменений.

Если использовать DMA, то изменяя тактовую частоту модуля АЦП можно частично скомпенсировать изменение масштаба по оси Х.

И почему вы решили что если использовать синхронизацию от таймера для АЦП, то на все остальное не хватит времени ядра?
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
28.12.2014, 21:56 12
Цитата Сообщение от korsaj Посмотреть сообщение
И почему вы решили что если использовать синхронизацию от таймера для АЦП, то на все остальное не хватит времени ядра?
Цитата Сообщение от korsaj Посмотреть сообщение
В прерывании от таймера (каждые 2 мкС) считываем значения АЦП
а вы посчитайте сколько тактов у вас есть в арсенале между вызовами этих двух прерываний.

Цитата Сообщение от korsaj Посмотреть сообщение
о том что нет никакой разсинхронизации.
рассинхронизация есть. В случае с использованием клока от АЦП вы синхронизируетесь с его "нативным" тактом. В случае же таймера вы все равно будете синхронизироваться с клоком АЦП и его шиной данных (на которой он сидит). Ведь в прерывании по таймеру вы всего-лишь меняете значения регистров АЦП, но когда он к ним "доберется" - это уже другой вопрос. Поэтому, я и озвучил, что рассинхронизация существует, и чем выше частота дискретизации, тем она будет ощутимее.
Цитата Сообщение от korsaj Посмотреть сообщение
как организовать атомарный доступ к участку памяти с данными, ведь он может переписываться в любой момент
. Для этого и существует FLIP-FLOP буферы. Пока анализируете одну половину одного большого буфера, вторая половина заполняется. И так друг за другом. Этот подход очень распространен во всех потоковых системах.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
28.12.2014, 22:29  [ТС] 13
Цитата Сообщение от Voland_ Посмотреть сообщение
.. в прерывании по таймеру вы всего-лишь меняете значения регистров АЦП, но когда он к ним "доберется" - это уже другой вопрос..
Доберется он да них в один и тот же промежуток времени, без каких либо задержек, например если он начинает зарядку конденсатора на 3 такте, так он это будет делать каждый раз именно на третьем такте.

На счет кол-во тактов между прерываниями, ну так я считал - 200, минус 31 такт на обработку прерывания (оптимизация 0), те 169 тактов свободно во время заполнения буфера.

Посмотрел описание DSO201 - вы правы, там нет синхронизации по таймеру, так как отсчеты (точки перелома на макс частоте) не попадают на деления разметки..
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
28.12.2014, 22:51 14
Цитата Сообщение от korsaj Посмотреть сообщение
например если он начинает зарядку конденсатора на 3 такте, так он это будет делать каждый раз именно на третьем такте.
сомневаюсь я однако. Структура шин, клоков и главного конвейера в кортексе сложнее, чем скажем, в том же АВР. Поэтому, его нельзя рассматривать настолько упрощенно.
Цитата Сообщение от korsaj Посмотреть сообщение
На счет кол-во тактов между прерываниями, ну так я считал - 200
Вы еще забыли про prefetch и latency для флеша, так что посчитать будет немного сложнее. Честно сказать, я даже не знаю "как". На высоких частотах latency = 2, это значит, что команда флеш читается за два такта. Но, существует кеширование в виде prefetch'а, которое, согласно ДШ, позволяет увеличить количество действий за один такт и сделать его несколько больше, чем сама частота ЦПУ.

Добавлено через 2 минуты
PS: почитайте за источники клоков шин и АЦП для вашего камня. Вполне возможно, это что-то прояснит. Я не вдавался в подробности, но однакоже для АЦП существуют свои предделители, и я подозреваю, что он (АЦП) будет управляться с тиками, кратными своей частоте, а не "на том такте, когда подали команду", как вы предполагаете.
0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
28.12.2014, 22:55  [ТС] 15
Возможно с запуском АЦП будет джитер, все таки с учетом разных предделителей возможно появление события не кратного тактовой частоте одного из модулей.
В общем убедили )
0
Voland_
28.12.2014, 23:26
  #16

Не по теме:

Цитата Сообщение от korsaj Посмотреть сообщение
Возможно с запуском АЦП будет джитер
ну вот :) а так получится "мягкий, ламповый" осцил ). И никаких джиттеров!

0
korsaj
28.12.2014, 23:40  [ТС]
  #17

Не по теме:

Ламповый не получится, т.к. для задержки свечения нужно много памяти.. и с повышением частоты дискретизации памяти нужно будет еще больше..
ЗЫ. Хотя попробовать можно )

0
Voland_
29.12.2014, 10:57
  #18

Не по теме:

"ламповый" - это в контексте аудиофильских вопросов :). Hi-end в общем, "высокий конец". Никакого джиттера, и т.д. и т.п. Слово "джиттер" впервые для меня появилось именно из мира цифровой музыки :).

0
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 539
29.12.2014, 17:43  [ТС] 19
А не подскажите как в Keil сделать отладку DMA (увидеть состояние модуля, например как для переферии)?

А то он у меня после инициализации и запуска АЦП (однократно) весь буфер заполняет значениями 0х0020 и 0х0120
Во код инициализации:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*------------------------------------------------------------------------------
  DMA_Init
 *------------------------------------------------------------------------------*/
void DMA_Init (void) {
 
    LPC_SC->PCONP       |=  (1<<29);               /* Enable power to PCGPDMA block */
 
    LPC_GPDMA->DMACConfig = 1;                          // enable the GPDMA controller
    LPC_GPDMA->DMACSync   = (1<<6);                                // enable synchro logic for all reqs
 
    LPC_GPDMACH0->DMACCSrcAddr  = (uint32_t) &(LPC_ADC->ADCR);
    LPC_GPDMACH0->DMACCDestAddr = (uint32_t) mADCBuffer;
    LPC_GPDMACH0->DMACCLLI      = (uint32_t) &LPC_GPDMACH0->DMACCLLI; // linked lists for ch0
    LPC_GPDMACH0->DMACCControl  = 0x7FF   // transfer size (0 - 11) = 2048
                            | (0 << 12)                    // source burst size (12 - 14) = 1
                            | (0 << 15)                    // destination burst size (15 - 17) = 1
                            | (2 << 18)                    // source width (18 - 20) = 32 bit
                            | (2 << 21)                    // destination width (21 - 23) = 32 bit
                            | (0 << 24)                    // source AHB select (24) = AHB 0
                            | (0 << 25)                    // destination AHB select (25) = AHB 0
                            | (0 << 26)                    // source increment (26) = no increment
                            | (1 << 27)                    // destination increment (27) = increment
                            | (0 << 28)                    // mode select (28) = access in user mode
                            | (0 << 29)                    // (29) = access not bufferable
                            | (0 << 30)                    // (30) = access not cacheable
                            | (0 << 31);                   // terminal count interrupt disabled
 
    LPC_GPDMACH0->DMACCConfig   =  1                   // channel enabled (0)
                            | (4 << 1)                 // source peripheral (1 - 5) = ADC
                            | (0 << 6)                 // destination peripheral (6 - 10) = none
                            | (2 << 11)                // flow control (11 - 13) = per to mem
                            | (0 << 14)                // (14) = mask out error interrupt
                            | (0 << 15)                // (15) = mask out terminal count interrupt
                            | (0 << 16)                // (16) = no locked transfers
                            | (0 << 18);                     // (27) = no HALT
                                                        
    /* Enable GPDMA interrupt */
    NVIC_EnableIRQ(DMA_IRQn);      
 
}
Добавлено через 3 минуты
И еще вопрос:
Если я использую 1 канал то указатель связанного списка я указываю 0 или его же, как сделано в коде выше?
C
1
LPC_GPDMACH0->DMACCLLI      = (uint32_t) &LPC_GPDMACH0->DMACCLLI; // linked lists for ch0
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,393
29.12.2014, 20:15 20
Советую посмотреть примеры для LPC. Скорее всего все написано уже до нас. Что касается настроек, то не видно чтобы вы включали запросы от АЦП к DMA, ведь это он должен "крутить" это шарманку. То же самое касается выбора канала - вы уверены, что именно канал 0 занимается работой с АЦП и принимает от него сигналы запросов? В частности, в СТМ32 каналы относительно жестко закреплены за периферией.
В третьих, работа АЦП конечно должна быть в continuous-режиме. Иначе значения из АЦП будут "падать" в буфер по одному.
Ну, и раз уж взялся, в-четвертых . У вас 10ти или 12ти битный АЦП. Если DMA поддерживает, то лучше использовать 16-битный размер данных, а не 32-битный, как выбрано у вас. Хотя, можно и так.
0
29.12.2014, 20:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2014, 20:15

Цифровой осциллограф RIGOL DS1102E
Какие щупы у данного осцила идут в комплекте? (маркировка)

Цифровой осциллограф Rigol DS1052E + Linux
Здравствуйте. Рассматриваю в качестве потенциального кандидата для покупки...

Цифровой осциллограф SIGLENT SDS1202CNL+ (200 МГц)
Добрый день! Решил приобрести осциллограф, так как без него некуда. Занимаюсь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru