в полтора раза дороже 32F303, и корпус паябельный...
Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
- Сообщения: 410
- Зарегистрирован: Чт янв 08, 2015 00:58:11
у STM32F446RCT6 есть Camera Interface - 8/14bit, 54mbps
в полтора раза дороже 32F303, и корпус паябельный...
в полтора раза дороже 32F303, и корпус паябельный...
- Реклама
Да, я уже проверил. STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно.
Правда при этом происходят какие то чудеса.
Процессор на что то иногда отвлекается)
Пока не разобрася на что. Прерывания отключены.
А если забирать с внутреннего АЦП то вроде все чисто.
Вот и получается:
1. STM32F3 + AD9280 + ОУ + делитель + генератор минуса = 32мГц (может 40) Входное сопротивление 1 мОм.
2. STm32F303 (и все!) = 16 мГц Входное сопротивление 100 кОм. Правда всего 4 предела по уровню.
Сейчас собран втотой вариант и что характерно работает и пользуюсь.
А первый... ну наверно неспешно доделаю..
Правда при этом происходят какие то чудеса.
Процессор на что то иногда отвлекается)
Пока не разобрася на что. Прерывания отключены.
А если забирать с внутреннего АЦП то вроде все чисто.
Вот и получается:
1. STM32F3 + AD9280 + ОУ + делитель + генератор минуса = 32мГц (может 40) Входное сопротивление 1 мОм.
2. STm32F303 (и все!) = 16 мГц Входное сопротивление 100 кОм. Правда всего 4 предела по уровню.
Сейчас собран втотой вариант и что характерно работает и пользуюсь.
А первый... ну наверно неспешно доделаю..
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Есть такое. Я после запуска DMA делал __WFI(), проц засыпает до прерывания и, во-первых, меньше помехи на ADC, во-вторых, DMA никто не мешает и должно всегда забирать данные за 2 такта.Fusion писал(а):Да, я уже проверил. STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно.
Правда при этом происходят какие то чудеса.
Процессор на что то иногда отвлекается)
fusion, P-CAD пока осваиваю может по-этому второго слоя не вижу. Печатка на Хмегу 32 односторонняя, судя по-всему? Если так, то площадки с отверстиями соединять проводами согласно схемы? Шина АЦП на какие порты МК включена или тупо делать по печатке? Оптрон не указан, через ключ включу реле или можно применить полевик?
man_200:
Печатка односторонняя, соединять проводами.
Шина АЦП на порту С.
Оптореле 350В, 100мА cpc1035.
Чтобы не засорять форум давайте в личку что ли.....
Печатка односторонняя, соединять проводами.
Шина АЦП на порту С.
Оптореле 350В, 100мА cpc1035.
Чтобы не засорять форум давайте в личку что ли.....
- Реклама
- Сообщения: 410
- Зарегистрирован: Чт янв 08, 2015 00:58:11
на F030 DMA тоже молотит до F_CPU/2.STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно
вот меандр 15МГц, проц на 60МГц, DMA1.1 в режиме MEM2MEM, приоритет максимум, чтение из GPIOA.IDR:


видно что читает по 4 точки на период, без пропусков, т.е. и на F030 получается 30MSPS
программным чтением (типа *buf++ = GPIOA->IDR; ...) длительность одного уровня "пляшет" по 1/2/3 семпла на полупериод...
задайте макс.приоритет DMAПроцессор на что то иногда отвлекается)
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Я такое тоже наблюдалncp1400 писал(а): видно что читает по 4 точки на период, без пропусков, т.е. и на F030 получается 30MSPS![]()
- Сообщения: 410
- Зарегистрирован: Чт янв 08, 2015 00:58:11
- Сообщения: 410
- Зарегистрирован: Чт янв 08, 2015 00:58:11
по SysTick получается 5 тактов на пересылку - 12MSPS на 60МГц, преимущества над АЦП F303 нет.
переход в SLEEP на время пересылки не влияет.
переход в SLEEP на время пересылки не влияет.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Я и говорил, что 5 тактов. Вчера проверил на F407, там 4. Заявленные 2 такта - это если загрузить в регистры константы и по очереди выводить их в порт, что в данном случае бесполезно.ncp1400 писал(а):по SysTick получается 5 тактов на пересылку - 12MSPS на 60МГц, преимущества над АЦП F303 нет.
переход в SLEEP на время пересылки не влияет.
Я забираю с АЦП за 2 такта ассемблером:
LDRB rez,[#0x50000040] // ADC1
STRB rez,[addressbuffer], #1
LDRB rez,[#0x50000140] // ADC2
STRB rez,[addressbuffer], #1
и так 1024 раза)
Получается 36 МСПС при 72 мГц у F303.
АЦП конечно 18 мГц не тянет, теряет младшие разряды. Но сигнал на мелком экране все равно видно.
LDRB rez,[#0x50000040] // ADC1
STRB rez,[addressbuffer], #1
LDRB rez,[#0x50000140] // ADC2
STRB rez,[addressbuffer], #1
и так 1024 раза)
Получается 36 МСПС при 72 мГц у F303.
АЦП конечно 18 мГц не тянет, теряет младшие разряды. Но сигнал на мелком экране все равно видно.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Пробовал так с порта забирать, правда с ассмом не связывался, но компилятор сделал практически то же самое:Fusion писал(а):Я забираю с АЦП за 2 такта ассемблером:
LDRB rez,[#0x50000040] // ADC1
STRB rez,[addressbuffer], #1
LDRB rez,[#0x50000140] // ADC2
STRB rez,[addressbuffer], #1
и так 1024 раза)
Получается 36 МСПС при 72 мГц у F303.
Код: Выделить всё
ldr r2, [r3, #16] ;*p++ = GPIOA->IDR;
str r2, [r1, #72]
ldr r2, [r3, #16] ;*p++ = GPIOA->IDR;
str r2, [r1, #76]
...
Про CCM RAM не знаю не изучал еще)
Но в Кейл если поставить оптимизацию на 0, то скорость сразу падает до 5 тактов вместо 2.
Как так может быть пока не понимаю. Он что оптимизирует мой ассемблерный код?
Пробовал на stm32f411 100mHz. Забирает с порта 50 мГц. Но иногда опять пропуски. Редко. Но есть.
Прерывания отключены.
__disable_irq();
__disable_fiq();
Даже не знаю чем там процессор занимается)
Документации мало. На АВР с ассемблером было все четко - как написал так и работает.
Буду разбираться дальше
Но в Кейл если поставить оптимизацию на 0, то скорость сразу падает до 5 тактов вместо 2.
Как так может быть пока не понимаю. Он что оптимизирует мой ассемблерный код?
Пробовал на stm32f411 100mHz. Забирает с порта 50 мГц. Но иногда опять пропуски. Редко. Но есть.
Прерывания отключены.
__disable_irq();
__disable_fiq();
Даже не знаю чем там процессор занимается)
Документации мало. На АВР с ассемблером было все четко - как написал так и работает.
Буду разбираться дальше
- Сообщения: 410
- Зарегистрирован: Чт янв 08, 2015 00:58:11
замерьте такты Systick. На F030 ldr/str получаются те же 5 тактов, strb допускает смещение максимум 31, пришлось использовать SP
У меня STRB без смещения.
STRB rez,[addressbuffer], #1 - это автоинкремент addressbuffer на единичку.
Без проверки без цикла 1024 раза - считать/записать.
На вход подаю мегагерц и по клеточкам на дисплее считаю какая скорость.
STRB rez,[addressbuffer], #1 - это автоинкремент addressbuffer на единичку.
Без проверки без цикла 1024 раза - считать/записать.
На вход подаю мегагерц и по клеточкам на дисплее считаю какая скорость.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Чего гадать, ставь брейпоинт в релизной сборке и смотри что он там нагенерил... Я первый раз на массив volatile не поставил, так умный компилятор сначала в кучу регистров данные с порта считал, а потом все это сохранилFusion писал(а):Про CCM RAM не знаю не изучал еще)
Но в Кейл если поставить оптимизацию на 0, то скорость сразу падает до 5 тактов вместо 2.
Как так может быть пока не понимаю. Он что оптимизирует мой ассемблерный код?
Без разницы есть смещение или нет, все равно команда выполняется одинаковое время. Но я переделал на ассме:У меня STRB без смещения.
STRB rez,[addressbuffer], #1 - это автоинкремент addressbuffer на единичку.
Без проверки без цикла 1024 раза - считать/записать.
На вход подаю мегагерц и по клеточкам на дисплее считаю какая скорость.
Код: Выделить всё
asm("LDRB R0, [R1]");
asm("STRB R0, [R2], #1");
asm("LDRB R0, [R1]");
asm("STRB R0, [R2], #1");
Вроде два такта вижу:
asm("LDRB R0, [R1]");
asm("STRB R0, [R2], #1");
Но это все справедливо если с порта забирать.
Встроенный АЦП в 303 на 18 мГц непотянет (при 72 тактовой)
asm("LDRB R0, [R1]");
asm("STRB R0, [R2], #1");
Но это все справедливо если с порта забирать.
Встроенный АЦП в 303 на 18 мГц непотянет (при 72 тактовой)
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Ладно, проведем очередную проверку, так чтобы без ЛА, частотомеров и подсчета квадратиковFusion писал(а):Вроде два такта вижу:
asm("LDRB R0, [R1]");
asm("STRB R0, [R2], #1");
Проверяли,интерфейс DCMI может забирать за 2.5 такта, но он не 16 бит и не во всех камнях присутствует
Извините, что влезаю в процесс, но...
А аналоговую часть уже делали?
Вопрос такой - можно ли так создать искусственную среднюю точку для усилителя. Понимаю, что это в 2 раза заузит входной диапазон (до +-1,6V), но всё же имеет ли такое решение шанс на жизнь?
Жутко не хочется возиться с преобразователем -3,3V, к тому же лишний источник помех.
Спасибо.
А аналоговую часть уже делали?
Вопрос такой - можно ли так создать искусственную среднюю точку для усилителя. Понимаю, что это в 2 раза заузит входной диапазон (до +-1,6V), но всё же имеет ли такое решение шанс на жизнь?
Жутко не хочется возиться с преобразователем -3,3V, к тому же лишний источник помех.
Спойлер







