Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 ADC - injected channels
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
acorn
Коллеги,

простой вопрос.
Изучаю документацию на STM32F1xx. Раздел про ADC описывает regular и injected channels. Теперь я знаю как конфигурить те и другие, как читать результат и т.п. Чего я не понимаю, так это в чем между ними разница?
Может кто-нить простыми словами объяснить зачем нужны injected-каналы?

Спасибо.
acorn
Разобрался.
Ничем не отличаются, кроме возможности прервать обработку regular-каналов по событию, обработать более приоритетные (injected) и продолжить обработку обычных.
Как-то так.
SasaVitebsk
Ну и ещё такая фишка, что инжектированные идут напрямую в регистры. То есть 4 регистра отдельных. Каждому каналу - свой. Кроме того, есть возможность прибавить смещение, но это уже мелочь.

Я не смог найти, как можно запустить только инжектированные измерения без регулярных. Похоже нельзя.
acorn
Цитата(SasaVitebsk @ Nov 21 2010, 22:26) *
Я не смог найти, как можно запустить только инжектированные измерения без регулярных. Похоже нельзя.


Ага, спасибо.
С регистрами понятно, это в доке есть. Меня основная идея интересовала - зачем они (со всеми своими регистрами и смещениями) вообще понадобились. Теперь вроде ясно.
Кста, в errata есть по поводу нулевого канала пунктик (№1), и как-то невнятно рекомендуют использовать этот канал именно как инжектированный. Неужели нельзя этого сделать без регулярных каналов? Впро, я не пробовал пока.
zoddy
Цитата(SasaVitebsk @ Nov 22 2010, 01:26) *
Ну и ещё такая фишка, что инжектированные идут напрямую в регистры. То есть 4 регистра отдельных. Каждому каналу - свой. Кроме того, есть возможность прибавить смещение, но это уже мелочь.

Я не смог найти, как можно запустить только инжектированные измерения без регулярных. Похоже нельзя.


Почему нельзя-то???!!! Очень даже можно! См. раздел 11.3.9 Injected channel management -> Triggered injection
SasaVitebsk
Что-то в железе у меня не получилось.
zoddy
Цитата(SasaVitebsk @ Nov 23 2010, 11:56) *
Что-то в железе у меня не получилось.


Изучал работу АЦП на платке STM32F10B путем переделки готовых примеров из IAR. Вот примерчик кода.

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // режим АЦП
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // режим сканирования группы каналов
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // вкл/выкл непрерывное преобразование
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// выравнивание
ADC_InitStructure.ADC_NbrOfChannel = 3; // количество каналов в группе
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 3, ADC_SampleTime_239Cycles5);

/* Set injected sequencer length */
ADC_InjectedSequencerLengthConfig(ADC1, 4);

/* ADC1 injected channel Configuration */
ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_28Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 2, ADC_SampleTime_28Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_28Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_28Cycles5);

/* ADC1 injected external trigger configuration */
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while (ADC_GetResetCalibrationStatus(ADC1));

/* Enable JEOC interupt */
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); // вкл. прерывание по окончанию преобразования инжектированной группы

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while (ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE); // программный запуск преобразования инжектированной группы
ADC_SoftwareStartConvCmd(ADC1,ENABLE); // программный запуск преобразования регулярной группы

У меня этот пример работал.
Как я понял, принцип работы групп АЦП в STM32... регулярная группа каналов может опрашиваться либо непрерывно, либо по событию ( или по программному запуску). А инжектированную группу при этом можно запустить в любой момент времени тоже
либо по триггеру, либо программно. Соответственно, если нет необходимости измерять каналы регулярной группы, а есть необходимость измерить только инжектированные каналы, мы просто запускаем измерение инжектированных каналов.

ViKo
Цитата(zoddy @ Nov 23 2010, 09:56) *
Вот примерчик кода...

который надо оформлять с помощью тэгов [code][/code]. Они есть в панели набора сообщения в виде кнопки. А для большого объема кода - codebox.
(vS)
acorn можешь свой код по АЦП показать?
acorn
Цитата((vS) @ Dec 21 2010, 23:05) *
acorn можешь свой код по АЦП показать?

Точно ко мне вопрос? Я с этой архитектурой только начал работать, никакого кода не анонсировал, да и показать по АЦП нечего.
HardEgor
Есть аппликуха по АЦП, там куча примеров во всех вариантах.
AN3116 STM32™’s ADC modes and their applications.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.