STM32f205: ADC меня игнорирует!

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

FPGAlover писал(а): проверял 0й и 1й и 2й
плохо проверял :-(
1й и 2й работают... два дня потерял, но нет худа без добра! - зато теперь могу похвастаться знанием АЦП :-)
а дело видимо в том, что 0й канал делят ногу с WKUP. Теперь найти бы, как направить ногу на путь истинный :-)
Шоб я польку танцевал..
Реклама
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

все стало на свои места!
RM0033 писал(а):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
Шоб я польку танцевал..
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

FPGAlover писал(а):все стало на свои места!
И ADC отличается от ADC других линеек только "незначительными нюансами " . :))))))))
Зато эти грабли надолго запомнишь- как бы не прославляли SPL от чтения даташита она не освободит...
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Ну блин. Я же пользую SPL исключительно ради читабельности кода, а разбираюсь по даташитам...
Все: теперь трипл-мод возводить. Благо все регистры перековырял, и если скрытых граблей не попадется, - то все должно прокатить быстро и безболезненно :-)

Кстати, никто не знает кем ДМА запрос формируется в мульти модах АЦП?
я так понимаю, что это в регистре ADC_CCR надо настроить, а в ADC1..3->CR2 надо запретить. или же в ADC1 разрешить.
Шоб я польку танцевал..
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Итак, наступил на грабли SPL :-)
Ну вот совсем не очевидно, что после

Код: Выделить всё

  // конфигурируем трипл мод
  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);
В общем все заработало, осталось доработать напильником. Если кому интересно - могу выложить код
Шоб я польку танцевал..
Реклама
Родился
Сообщения: 3
Зарегистрирован: Ср дек 26, 2012 16:39:10

Сообщение Edal »

FPGAlover писал(а):В общем все заработало, осталось доработать напильником. Если кому интересно - могу выложить код
Выложите, буду благодарен. Кстати, а что за девайс должен выйти?
Реклама
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

Edal писал(а):Кстати, а что за девайс должен выйти?
3х канальный осциллограф.

Код: Выделить всё

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) // тут висим в ожидании окончания ДМА. Можно организовать и через прерывание, но в моей задаче не имеет смысла
 {
 }; // ждем окончания ДМА
 
 ADC_Cmd(ADC1, DISABLE);  //экономим электричество
 ADC_Cmd(ADC2, DISABLE); 
 ADC_Cmd(ADC3, DISABLE); 
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, DISABLE);
}


// тут настраиваем как АЦП так и порты
void ADC_config(void)
{
  //настройка пинов АЦП
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); // а надо ли тактировать аналоговый вход???
  PWR->CSR  &= ~PWR_CSR_EWUP; //пин PA0 должен работать на ввод/вывод а не на WKUP
 
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);
   
  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_Init(ADC1, &ADC_InitStructure);
  ADC_Init(ADC2, &ADC_InitStructure);
  ADC_Init(ADC3, &ADC_InitStructure);

  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; // включаем сенсор на всякий случай. для примера не критично
}

void dma_config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
    DMA_DeInit(DMA2_Stream0);
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC->CDR; //регистр данных АЦП в мульти моде
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &adc_buffer[0];
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = 1024*3;//ARRAY_LENGHT(adc_buffer);
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);
    DMA_Cmd(DMA2_Stream0, ENABLE);
}
Шоб я польку танцевал..
Родился
Сообщения: 3
Зарегистрирован: Ср дек 26, 2012 16:39:10

Сообщение Edal »

FPGAlover писал(а):
Edal писал(а):Кстати, а что за девайс должен выйти?
3х канальный осциллограф.
Спасибо за код. А чего не на STM32f303/313, там ведь ADC пошустрее будет?
В теме об самодельном осциллографе выкладывали результаты разработок(но не код к сожалению) на STM32F3DISCOVERY - вполне прилично получилось
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

FPGAlover писал(а):А чего не на STM32f303/313, там ведь ADC пошустрее будет?
Ну, что под рукой было то и осваиваю...
А он действительно шустрее?
Я думал, что 2мгц (на 12 бит) это предел для STM32... Обещают дельтасигму вроде, но не в курсе пока.
Посмотрел... Действительно шустрее :-) 5мгц x 4. Нехило, однако. И кроме всего прочего операционники на борту. Не хватает только цифровых потенциометров для полного счастья :))
Посмотрел еще повнимательнее, всетаки 5мгц x 2. Оцифровать 4канала синхронно получится. А вот как засинхронизировать ADC12 и ADC34 в interlived mode, что бы получить 20 Мгц, почти без идей. Разве что счетчиками меандр с нужной скважностью задать и разными фронтами блоки ADC12 и ADC34 запускать... типа такого:

Код: Выделить всё

 ____             ____ 
/50ns\__150ns___ /50ns\__150ns___/
1    3   2    4   1    3    2    4     <- запуски ADC

Но пока нет уверенности, что это реализуемо.
Шоб я польку танцевал..
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Про STM32F303
Можно запустить два таймера одновременно в MASTER/SLAVE режимах. Потом выставить скажем разные PWM задержки на них и уже от этого закпускать ADC12 и ADC34 в continuous dual mode. Теоретически все должно работать, но не пробовал. Лично мне с запасом хватает и двух каналов.

Сэмплирование 1.5 такта - это как мне кажется несколько экстремально. Разумнее выбирать консервативные 7.5 такта.
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

С таймер-счетчиками пока не бодался, отсюда и сомнения :-)
Кстати, пока не пробовал, да и в случае неудачи программно должно фиксится.
Вопрос такой: Если один и тот же канал одновременно оцифровывать разными АЦП. Насколько будет разница полученного результата (смещение) ?
понятное дело, программно это легко решается, но в некоторых случаях не совсем удобно.

И вот еще вопрос по поводу культурного шока: сегодня у меня открылись глаза на факт, что в микроконтроллер встраивают компараторы и ОУ. По этому поводу, подскажите, пожалуйста, наиболее мощные решения однокристалок со встроенным аналоговым обвесом (не обязательно АРМ :-) ), заточенных на построение измерительных систем (не особо прецизионных).
Шоб я польку танцевал..
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

FPGAlover писал(а):Вопрос такой: Если один и тот же канал одновременно оцифровывать разными АЦП.
Так на STM32F303 делать нельзя.
Точнее можно на низких частотах.
На высоких - каждый канал на отдельную ножку, и отдельную RC цепочку.

FPGAlover писал(а):в микроконтроллер встраивают компараторы и ОУ.
В STM32F303 ОУ довольно шумный. Максимум для чего подходит - повысить входное сопротивление ADC да усилить в 2-3 раза сигнал, что вобщем тоже приятно :)
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

FPGAlover писал(а):В STM32F303 ОУ довольно шумный
Ну, как бы, там вокруг цифра кипит :-) с другой стороны аналоговая часть расположена на одной части кристалла. Немного удручает , что выход 4го ОУ и его его входы разделены цифровым питанием (для 48 пинового корпуса) :shock: . Как по вашему? если расположить полигон аналоговой земли под этой частью? на сколько это поможет?
Шоб я польку танцевал..
Прорезались зубы
Сообщения: 210
Зарегистрирован: Пн окт 21, 2013 07:33:45

Сообщение FPGAlover »

balmer писал(а):Максимум для чего подходит - повысить входное сопротивление ADC да усилить в 2-3 раза сигнал, что вобщем тоже приятно :)
И все таки. Допустим я снимаю 40кгц-овый ультразвук муратовскими датчиками. Ориентировочно мне надо 2-3тыс коэф. усиления. При этом, в конечном счете в ход пускается программный фильтр нехилого порядка, так как отклик предпологается порядка 10 периодов. Естественно я ставлю 2 каскада. 1й внешний с аналоговым фильтром, маленького порядка, и 2й чисто усилительный. Остальное решает ЦОС. По идее, для этой задачи и встроенными усилителями можно обеспечить кф 50. Главное, чтоб ВЧ в ограничение не врубались :-)
А по хорошему надо пдф просмотреть внимательно по поводу характеристик АЦП.
Шоб я польку танцевал..
Родился
Сообщения: 3
Зарегистрирован: Ср дек 26, 2012 16:39:10

Сообщение Edal »

FPGAlover писал(а):
FPGAlover писал(а):А чего не на STM32f303/313, там ведь ADC пошустрее будет?
Ну, что под рукой было то и осваиваю...
А он действительно шустрее?
Я думал, что 2мгц (на 12 бит) это предел для STM32... Обещают дельтасигму вроде, но не в курсе пока.
Посмотрел... Действительно шустрее :-) 5мгц x 4. Нехило, однако. И кроме всего прочего операционники на борту. Не хватает только цифровых потенциометров для полного счастья :))
Посмотрел еще повнимательнее, всетаки 5мгц x 2. Оцифровать 4канала синхронно получится. А вот как засинхронизировать ADC12 и ADC34 в interlived mode, что бы получить 20 Мгц, почти без идей. Разве что счетчиками меандр с нужной скважностью задать и разными фронтами блоки ADC12 и ADC34 запускать... типа такого:

Код: Выделить всё

 ____             ____ 
/50ns\__150ns___ /50ns\__150ns___/
1    3   2    4   1    3    2    4     <- запуски ADC

Но пока нет уверенности, что это реализуемо.
Вроде возможно
СпойлерИзображение
Взято отсюда http://radiokot.ru/forum/viewtopic.php? ... &start=960
почитайте с начала страницы(не забывая смотреть картики во вложениях)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

FPGAlover писал(а):По идее, для этой задачи и встроенными усилителями можно обеспечить кф 50.
Да может быть.
Хотя лично я не смог воспользоваться.
Потому, что ОУ там напрямую без RC цепочки подключается к ADC.

Там есть такая чудная вещь, как PGA резистивный делитель, для задания коэффициента усиления. Но он подключен так, что усиливает сигнал относительно нуля (если ничего не путаю).
Мне бы очень пригодился усилитель с PGA встроенный в STM32, если бы можно было задать центральную точку как VREF/2. А так не смог ни для чего путного использовать. В конце концов прикрутил внешний MCP6S21 усилитель. :?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Edal писал(а):Взято отсюда http://radiokot.ru/forum/viewtopic.php? ... &start=960
Там вариант без DMA, а это "жесть".
Ответить

Вернуться в «ARM»