Top.Mail.Ru
Уведомления
Очистить все

[Решено] STM32F4 USB ADC

(@ruslan)
Level 1

Всем доброго времени суток! Задача снять с АЦП 1 000 000 значений и отправить их на ПК. С АЦП я разобрался и могу снять 1 000 000 значений, но упираюсь в скорость передачи по USB. Подскажите пожалуйста как я могу решить эту проблему? Приходит на ум только снимать эти значения где то хранить в памяти и потом уже по USB передать. Но не знаю как это сделать... Может есть ещё какое решение? Использую USB_FS. По даташиту USB работает максимально на 12Mbit/s, но реально я не вижу этой скорости, максимум что я получил это ~ 500Kbit/s. Что я делаю не так?


			while (i<15874)
			{
				for (int j=0; j<63;j++)
				{				
				ADC1->SR=0;
				ADC1->CR2|=ADC_CR2_SWSTART;
				UserData[j]=ADC1->DR;
				}
				for (int delay=0;delay<=0x2DFF;delay++);
				
				CDC_Transmit_FS((uint8_t*)UserData, 63);
				i++;
				}

Я цифрую и кидаю в буфер из 63 значений, и они не успеваю передаться без задержки, как уже цифруется новая пачка, но с задержкой всё нормально работает, только получается что быстро цифрую 63 значения и потом какое-то время их передаю, то есть на выходе получаю сигнал рывками по 63 отсчета. Вы не знаете как бы мне сделать чтобы так не было. Думал создать несколько буферов, один отправляется, а другой по прерывании заполняется, и как первый передался, передается 2-ой, а третий заполняется и т.д....

Цитата
Создатель темы Размещено : 04.02.2016 13:40
Aveal
(@aveal)
Top level Admin

Тоже сталкивался с проблемой низкой скорости по USB, решения не нашел...Самым простым было бы в памяти собрать все данные, а потом за один раз отправить, но данных очень уж много, памяти не хватит. Сделай два буфера действительно - один заполнился - начинает передаваться - в это время заполняется второй - как закончилась передача - передается второй итд. Передача будет без перебоев.

ОтветитьЦитата
Размещено : 05.02.2016 00:29
(@ruslan)
Level 1

Ну тогда как мне параллельно предавать и оцифровывать? Т.е. я оцифровал пачку данных, начинаю передачу, при этом я оцифровка должна продолжаться...

ОтветитьЦитата
Создатель темы Размещено : 05.02.2016 12:49
Aveal
(@aveal)
Top level Admin

Ну ты же вызвал функцию передачи и процессор уже сам аппаратно делает всю работу, а ты уже можешь в while(1) заниматься чем угодно.

ОтветитьЦитата
Размещено : 05.02.2016 17:43
(@ruslan)
Level 1

			while (i<326)
			{
				for (int j=0; j<1023;j++)
				{		
				ADC1->SR=0;
				ADC1->CR2|=ADC_CR2_SWSTART;
				UserData[j]=ADC1->DR;
				}
				CDC_Transmit_FS((uint8_t*)UserData, 1023);
				for (int j=0; j<1023;j++)
				{				
				ADC1->SR=0;
				ADC1->CR2|=ADC_CR2_SWSTART;
				UserData2[j]=ADC1->DR;
				}
				CDC_Transmit_FS((uint8_t*)UserData2, 1023);
				for (int j=0; j<1023;j++)
				{		
				ADC1->SR=0;
				ADC1->CR2|=ADC_CR2_SWSTART;
				UserData3[j]=ADC1->DR;
				}
				CDC_Transmit_FS((uint8_t*)UserData3, 1023);
				i++;
			}

Пробовал с 3-я буферами всё равно АЦП быстрее оцифровывает, чем значения успевают передаваться...

ОтветитьЦитата
Создатель темы Размещено : 08.02.2016 19:23
Aveal
(@aveal)
Top level Admin

Ну так и отлично же... Проблема ведь была в том, что данные передаются кусками. Если бы оцифровка занимала больше времени, чем передача, тогда это бы пришлось как то решать другими способами. А так началась передача 64 значений, начинается параллельная оцифровка, оцифровка закончилась и контроллер спокойно ждет пока закончится передача, а затем передает уже готовые данные. В итоге передача идет без перерывов.

ОтветитьЦитата
Размещено : 09.02.2016 00:00
(@elena)
New member

Руслан, решала подобную задачу, правда для MSP430. Тоже необходимо было передавать результат непрерывной оцифровки, правда по RS-485. Использовала 2 буфера и 2 канала DMA.
Первый канал DMA был настроен, чтобы заполнять буферы (поочередно) результатами АЦП. Размер буфера уже не помню, по-моему, 256 или 512. Второй канал DMA использовался, чтобы передать данные из буфера по USART (в моем случае). Запрос данных производила каждые примерно 5 сек (это надо считать).
Как только буфер наполнился результатами АЦП, переключаемся на второй буфер и устанавливаем флаг готовности передачи. Запрос пришел - передаем данные через второй канал DMA.
Передавать каждое измерение в данном случае - не вариант.

ОтветитьЦитата
Размещено : 09.02.2016 13:40
Поделиться: