15.05.2018, 08:45
|
|
Временная регистрация
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
синхронизация осциллограммы
Подскажите алгоритм синхронизации осциллограммы.
Мой вариант не работает.
Код:
|
int main(void)
{
SystemInit();
FSMC_Init();
TFT9341_ini();
TFT9341_FillScreen(BLACK);
TFT9341_DrawRect(WHITE, 0, 0, 319, 201);
TFT9341_DrawString("Проверка дисплея ILI9341",5,20,YELLOW,BLACK,0);
TFT9341_DrawString("Нижняя строка ",5,210,YELLOW,BLACK,0);
ADC_Config(); // ADC configuration
ADC_SoftwareStartConv(ADC1); // Start ADC1 Software Conversion
while (1)
{
while(DMA_LISR_HTIF0==0) {} //ждать половины передачи
DMA2_Stream0 -› FCR |= DMA_LIFCR_CHTIF0 ;
for(i=0; i‹255; i++)
{
Buf[i] = ADC_Data[i];
}
//распаковать данные из Buf[]
j = 0;
for(i=0; i‹256; i++)
{
DataBuf[j] = Buf[i];
j++;
DataBuf[j] = Buf[i] ›› 8;
j++;
}
//синхронизация по переднему фронту
//вычислить среднее значение амплитуды
mediana = 0;
for(i=0; i‹512; i++)
{
mediana = mediana + DataBuf[i];
}
mediana = mediana/512;
//ищем "-" сигнала
decline = -1;
for(i=0; i‹512; i++)
{
if(DataBuf[i] ‹ (mediana-20)) decline = i;
if(decline != -1) break;
}
//ищем "+" сигнала
rise = -1;
for(i=decline; i‹512; i++)
{
if(DataBuf[i] › (mediana+20)) rise = i-20;
if(rise != -1) break;
}
//вывод на TFT
for(i=0; i‹320; i++)
{
TFT9341_DrawPixel(i, DataTFT[i], BLACK); //стираем предыдущюю точку
DataTFT[i] = 200 - DataBuf[rise]*200/256; //вычисляем и сохраняем новую точку
rise++;
TFT9341_DrawPixel(i, DataTFT[i], WHITE); //рисуем новую точку
}
} |
|
|
|
|
15.05.2018, 11:13
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: синхронизация осциллограммы
А что за процик-то у Вас? И что делает это код?
Сообщение от фёдорыч
|
Код:
|
for(i=0; i‹255; i++)
{
Buf[i] = ADC_Data[i];
}
//распаковать данные из Buf[]
j = 0;
for(i=0; i‹256; i++)
{
DataBuf[j] = Buf[i];
j++;
DataBuf[j] = Buf[i] ›› 8;
j++;
} |
|
Почему i в первом цикле до 255, а во-втором цикле до 256? Ошибка?
Последний раз редактировалось Signalshik2; 15.05.2018 в 11:27.
Причина: Совместил сообщения.
|
|
|
Сказали "Спасибо" Signalshik2
|
|
|
15.05.2018, 11:31
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,704
Сказал спасибо: 189
Сказали Спасибо 3,193 раз(а) в 2,070 сообщении(ях)
|
Re: синхронизация осциллограммы
обычно синхра снаружи на аналоговом компараторе сделана у многих.
__________________
кагмаподэ магмаподэ
|
|
|
|
15.05.2018, 11:33
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: синхронизация осциллограммы
фёдорыч, таки лучше расписать ваш алгоритм сначала на словах, например формулировками из постановки, блок схемой,…
Выразить математически как работать с разными сигналами - периодическими, апериодическими, стохастическими,…
Выразить математически как обрабатывать условие синхронизации - порог, поведение на длине развёртки на экране, поведение в конце экрана, условие полного периода,…
После такого труда на бумаге многие вопросы в написанном коде отпадут…
индюк, на аналоговом компараторе определение Space для посылок RS232?
Или на нем же выделение нужной строки или кадра в AV?
В цифровом потоке это уже давно программного решается…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 15.05.2018 в 11:38.
|
|
|
|
15.05.2018, 11:45
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: синхронизация осциллограммы
Сообщение от фёдорыч
|
Код:
|
if(DataBuf[i] › (mediana+20)) rise = i-20; |
|
- а почему здесь rise = i-20,
если должно быть rise = i. Правильно? Точно?
Ничего не понял.
Сообщение от фёдорыч
|
Код:
|
DataTFT[i] = 200 - DataBuf[rise]*200/256; |
|
- а вот это что означает?
В частности в части "*200/256"?
Мне кажется, что здесь только исправить rise = i-20 на rise = i - потому что там ошибка и вывод на TFT-дисплей нормальный сделать в последнем fore и все заработает!!!!!!!!!!
Последний раз редактировалось Signalshik2; 15.05.2018 в 12:00.
|
|
|
|
15.05.2018, 11:50
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,704
Сказал спасибо: 189
Сказали Спасибо 3,193 раз(а) в 2,070 сообщении(ях)
|
Re: синхронизация осциллограммы
Сообщение от mike-y-k
|
индюк, на аналоговом компараторе определение Space для посылок RS232?
Или на нем же выделение нужной строки или кадра в AV?
В цифровом потоке это уже давно программного решается…
|
ну я исходил из того что наверно у человека маленькая плата гшде все и сразу собрано. по аналогии с китайцами.
поэтому я имел ввиду что компаратор мониторит аналоговый тракт и дает на отдельную ногу проца импульс. мошт на прерывание даже.
причем там компорт?? нигде про него у автора не увидел
__________________
кагмаподэ магмаподэ
|
|
|
|
15.05.2018, 11:56
|
|
Временная регистрация
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: синхронизация осциллограммы
stm32f407ve, с помощью FSMC подключен дисплей ILI9341, 320x240. Инициализация ADC и DMA - код из примера ADC_DualModeInterleaved, изменен только размер буфера(1-›512).
По коду: инициализация периферии, запуск ADC с передачей данных по DMA. В цикле: ожидание флага половины передачи, сброс флага, преобразование 16-битных данных в массив uint8_t Buf[].
Так как заранее неизвестна амплитуда входного сигнала, а также смещение отн-но нуля, вычисляется ср. арифметическое отсчетов и принимается "волевое" решение, что (mediana-20) и менее относятся к "-" сигнала, соответственно (mediana+20) и более - "+" сигнала.
Далее поиск перехода в "-", нашли, от этого значения ищется переход сигнала в "+", нашли, считается, что это фронт сигнала для вывода на дисплей.
На дисплей сначала выводятся 20 предыдущих значений, чтобы фронт сигнала сдвинуть от края экрана.
Скорость оцифровки(если верить описанию примера) 7Msps, тестовый сигнал - 100KHz.
|
|
|
|
15.05.2018, 11:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 8,061
Сказал спасибо: 2,784
Сказали Спасибо 2,728 раз(а) в 2,017 сообщении(ях)
|
Re: синхронизация осциллограммы
индюк, не, с аналоговым компаратором не комильфо. Удобная фича цифровых - можно посмотреть, что творилось до момента синхронизации.
|
|
|
|
15.05.2018, 11:59
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: синхронизация осциллограммы
Федорыч, я там дописал еще в свое 5 сообщение. Почитайте, пожалуйста.
Сообщение от фёдорыч
|
Инициализация ADC и DMA - код из примера ADC_DualModeInterleaved, изменен только размер буфера(1-›512).
|
- вово, так и подумал, что откуда-то код стырили.
Отладчик есть нормальный? Типа как JTAG ICE MK2 на ATMega128.
И в коде неплохо бы разобраться.
Последний раз редактировалось Signalshik2; 15.05.2018 в 12:16.
|
|
|
|
15.05.2018, 12:05
|
|
Временная регистрация
Регистрация: 20.05.2015
Адрес: Бишкек, Киргизия
Сообщений: 59
Сказал спасибо: 22
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: синхронизация осциллограммы
Почему i в первом цикле до 255, а во-втором цикле до 256? Ошибка?
Да, ошибка, описАлся.
Счас исправлю, проверю, отпишусь.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:31.
|
|