Всем доброго времени суток! Задача снять с АЦП 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-ой, а третий заполняется и т.д....
Тоже сталкивался с проблемой низкой скорости по USB, решения не нашел...Самым простым было бы в памяти собрать все данные, а потом за один раз отправить, но данных очень уж много, памяти не хватит. Сделай два буфера действительно - один заполнился - начинает передаваться - в это время заполняется второй - как закончилась передача - передается второй итд. Передача будет без перебоев.
Ну тогда как мне параллельно предавать и оцифровывать? Т.е. я оцифровал пачку данных, начинаю передачу, при этом я оцифровка должна продолжаться...
Ну ты же вызвал функцию передачи и процессор уже сам аппаратно делает всю работу, а ты уже можешь в while(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-я буферами всё равно АЦП быстрее оцифровывает, чем значения успевают передаваться...
Ну так и отлично же... Проблема ведь была в том, что данные передаются кусками. Если бы оцифровка занимала больше времени, чем передача, тогда это бы пришлось как то решать другими способами. А так началась передача 64 значений, начинается параллельная оцифровка, оцифровка закончилась и контроллер спокойно ждет пока закончится передача, а затем передает уже готовые данные. В итоге передача идет без перерывов.
Руслан, решала подобную задачу, правда для MSP430. Тоже необходимо было передавать результат непрерывной оцифровки, правда по RS-485. Использовала 2 буфера и 2 канала DMA.
Первый канал DMA был настроен, чтобы заполнять буферы (поочередно) результатами АЦП. Размер буфера уже не помню, по-моему, 256 или 512. Второй канал DMA использовался, чтобы передать данные из буфера по USART (в моем случае). Запрос данных производила каждые примерно 5 сек (это надо считать).
Как только буфер наполнился результатами АЦП, переключаемся на второй буфер и устанавливаем флаг готовности передачи. Запрос пришел - передаем данные через второй канал DMA.
Передавать каждое измерение в данном случае - не вариант.