плохо проверял 1й и 2й работают... два дня потерял, но нет худа без добра! - зато теперь могу похвастаться знанием АЦП а дело видимо в том, что 0й канал делят ногу с WKUP. Теперь найти бы, как направить ногу на путь истинный
PWR power control/status register (PWR_CSR) Bit 8 EWUP: Enable WKUP pin This bit is set and cleared by software. 0: WKUP pin is used for general purpose I/O. An event on the WKUP pin does not wakeup the device from Standby mode. 1: WKUP pin is used for wakeup from Standby mode and forced in input pull down configuration (rising edge on WKUP pin wa kes-up the system from Standby mode). Note: This bit is reset by a system reset
И ADC отличается от ADC других линеек только "незначительными нюансами " . ))))) Зато эти грабли надолго запомнишь- как бы не прославляли SPL от чтения даташита она не освободит...
Ну блин. Я же пользую SPL исключительно ради читабельности кода, а разбираюсь по даташитам... Все: теперь трипл-мод возводить. Благо все регистры перековырял, и если скрытых граблей не попадется, - то все должно прокатить быстро и безболезненно
Кстати, никто не знает кем ДМА запрос формируется в мульти модах АЦП? я так понимаю, что это в регистре ADC_CCR надо настроить, а в ADC1..3->CR2 надо запретить. или же в ADC1 разрешить.
uint16_t adc_buffer[1024*3]; // сюда будем сбрасывать данные с АЦП 1,2,3,1,2,3,...
void ADC_multi_test(void) { ADC_config(); dma_config(); ADC_Cmd(ADC1, ENABLE); ADC_Cmd(ADC2, ENABLE); ADC_Cmd(ADC3, ENABLE); ADC_SoftwareStartConv(ADC1); // стартуется АЦП №1 как мастер while(DMA_GetCurrDataCounter(DMA2_Stream0)>0) // тут висим в ожидании окончания ДМА. Можно организовать и через прерывание, но в моей задаче не имеет смысла { }; // ждем окончания ДМА
// тут настраиваем как АЦП так и порты void ADC_config(void) { //настройка пинов АЦП RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); // а надо ли тактировать аналоговый вход??? PWR->CSR &= ~PWR_CSR_EWUP; //пин PA0 должен работать на ввод/вывод а не на WKUP
ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Resolution = 12; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //ENABLE; // пофиг как последовательность повторяется от 1 до 16 или 1долбит ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // это не имеет значения из за предыдущей строчки. Запуск будет программный ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_RegularChannelConfig( ADC1,ADC_Channel_0,1,ADC_SampleTime_15Cycles); ADC_RegularChannelConfig( ADC2,ADC_Channel_1,1,ADC_SampleTime_15Cycles); ADC_RegularChannelConfig( ADC3,ADC_Channel_2,1,ADC_SampleTime_15Cycles); // конфигурируем трипл мод ADC_CommonInitTypeDef ADC_CommonStructure; ADC_CommonStructure.ADC_Mode = ADC_TripleMode_RegSimult; ADC_CommonStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; //Disabled,1,2,3 ADC_CommonStructure.ADC_Prescaler = ADC_Prescaler_Div2; //2,4,6,8 ADC_CommonStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //5..20 cycles роляет только в интерливед моде, в данном примере не имеет значения ADC_CommonInit(&ADC_CommonStructure); ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);// запрос на ДМА будет генериться после каждого преобразования ADC->CCR |= ADC_CCR_TSVREFE; // включаем сенсор на всякий случай. для примера не критично }
Спасибо за код. А чего не на STM32f303/313, там ведь ADC пошустрее будет? В теме об самодельном осциллографе выкладывали результаты разработок(но не код к сожалению) на STM32F3DISCOVERY - вполне прилично получилось
А чего не на STM32f303/313, там ведь ADC пошустрее будет?
Ну, что под рукой было то и осваиваю... А он действительно шустрее? Я думал, что 2мгц (на 12 бит) это предел для STM32... Обещают дельтасигму вроде, но не в курсе пока. Посмотрел... Действительно шустрее 5мгц x 4. Нехило, однако. И кроме всего прочего операционники на борту. Не хватает только цифровых потенциометров для полного счастья Посмотрел еще повнимательнее, всетаки 5мгц x 2. Оцифровать 4канала синхронно получится. А вот как засинхронизировать ADC12 и ADC34 в interlived mode, что бы получить 20 Мгц, почти без идей. Разве что счетчиками меандр с нужной скважностью задать и разными фронтами блоки ADC12 и ADC34 запускать... типа такого:
Про STM32F303 Можно запустить два таймера одновременно в MASTER/SLAVE режимах. Потом выставить скажем разные PWM задержки на них и уже от этого закпускать ADC12 и ADC34 в continuous dual mode. Теоретически все должно работать, но не пробовал. Лично мне с запасом хватает и двух каналов.
Сэмплирование 1.5 такта - это как мне кажется несколько экстремально. Разумнее выбирать консервативные 7.5 такта.
С таймер-счетчиками пока не бодался, отсюда и сомнения Кстати, пока не пробовал, да и в случае неудачи программно должно фиксится. Вопрос такой: Если один и тот же канал одновременно оцифровывать разными АЦП. Насколько будет разница полученного результата (смещение) ? понятное дело, программно это легко решается, но в некоторых случаях не совсем удобно.
И вот еще вопрос по поводу культурного шока: сегодня у меня открылись глаза на факт, что в микроконтроллер встраивают компараторы и ОУ. По этому поводу, подскажите, пожалуйста, наиболее мощные решения однокристалок со встроенным аналоговым обвесом (не обязательно АРМ ), заточенных на построение измерительных систем (не особо прецизионных).
Ну, как бы, там вокруг цифра кипит с другой стороны аналоговая часть расположена на одной части кристалла. Немного удручает , что выход 4го ОУ и его его входы разделены цифровым питанием (для 48 пинового корпуса) . Как по вашему? если расположить полигон аналоговой земли под этой частью? на сколько это поможет?
Максимум для чего подходит - повысить входное сопротивление ADC да усилить в 2-3 раза сигнал, что вобщем тоже приятно
И все таки. Допустим я снимаю 40кгц-овый ультразвук муратовскими датчиками. Ориентировочно мне надо 2-3тыс коэф. усиления. При этом, в конечном счете в ход пускается программный фильтр нехилого порядка, так как отклик предпологается порядка 10 периодов. Естественно я ставлю 2 каскада. 1й внешний с аналоговым фильтром, маленького порядка, и 2й чисто усилительный. Остальное решает ЦОС. По идее, для этой задачи и встроенными усилителями можно обеспечить кф 50. Главное, чтоб ВЧ в ограничение не врубались А по хорошему надо пдф просмотреть внимательно по поводу характеристик АЦП.
А чего не на STM32f303/313, там ведь ADC пошустрее будет?
Ну, что под рукой было то и осваиваю... А он действительно шустрее? Я думал, что 2мгц (на 12 бит) это предел для STM32... Обещают дельтасигму вроде, но не в курсе пока. Посмотрел... Действительно шустрее 5мгц x 4. Нехило, однако. И кроме всего прочего операционники на борту. Не хватает только цифровых потенциометров для полного счастья Посмотрел еще повнимательнее, всетаки 5мгц x 2. Оцифровать 4канала синхронно получится. А вот как засинхронизировать ADC12 и ADC34 в interlived mode, что бы получить 20 Мгц, почти без идей. Разве что счетчиками меандр с нужной скважностью задать и разными фронтами блоки ADC12 и ADC34 запускать... типа такого:
По идее, для этой задачи и встроенными усилителями можно обеспечить кф 50.
Да может быть. Хотя лично я не смог воспользоваться. Потому, что ОУ там напрямую без RC цепочки подключается к ADC.
Там есть такая чудная вещь, как PGA резистивный делитель, для задания коэффициента усиления. Но он подключен так, что усиливает сигнал относительно нуля (если ничего не путаю). Мне бы очень пригодился усилитель с PGA встроенный в STM32, если бы можно было задать центральную точку как VREF/2. А так не смог ни для чего путного использовать. В конце концов прикрутил внешний MCP6S21 усилитель.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения