Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/64: Рейтинг темы: голосов - 64, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 22.06.2016
Сообщений: 96

Опрос нескольких регулярных каналов АЦП STM32F100

20.11.2018, 09:17. Показов 15140. Ответов 30

Студворк — интернет-сервис помощи студентам
Всем привет! Проблема с опросом нескольких регулярных каналов АЦП STM32F100 (Отл плата STM32F100VL Discouvery). На входы PA0 и PA1 повесил потенциометры. При пошаговой отладке в IAR данные из ADC1->DR в a[0] попадают, а вот a[1] по нулям, как потенциометр ни крути.
Читал, что такие вещи лучше делать через DMA, но хотелось бы для начала попробовать без него...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stm32f10x.h"
 
int a[2],b=0;
 
void ADC1_IRQHandler () {
  
  if(ADC1->SR &ADC_SR_EOC) {
  
    
    GPIOC->BSRR |= GPIO_BSRR_BS9;
    a[b] = ADC1->DR;
    b++;
    ADC1->SR &= ~ADC_SR_EOC;
   
    if (b>=1) b=0;
    
  }
  
}
 
  
  
 
 
 
void  main () {
  
 
  
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);                      // Enable HSE
    while (!(RCC->CR & RCC_CR_HSERDY));                 // Ready start HSE      
    
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;          // Cloclk Flash memory
    
    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;                    // AHB = SYSCLK/1
    RCC->CFGR |= RCC_CFGR_PPRE1_DIV1;                   // APB1 = HCLK/1
    RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;                   // APB2 = HCLK/1
    
    RCC->CFGR &= ~RCC_CFGR_PLLMULL;                             // clear PLLMULL bits
    RCC->CFGR &= ~RCC_CFGR_PLLSRC;                      // clearn PLLSRC bits
    RCC->CFGR &= ~RCC_CFGR_PLLXTPRE;                    // clearn PLLXTPRE bits
    
    RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1;                   // source HSE
    RCC->CFGR |= RCC_CFGR_PLLXTPRE_PREDIV1_Div2;                // source HSE/2 = 4 MHz
    RCC->CFGR |= RCC_CFGR_PLLMULL6;                     // PLL x6: clock = 4 MHz * 6 = 24 MHz
    
    RCC->CR |= RCC_CR_PLLON;                                    // enable PLL
    while((RCC->CR & RCC_CR_PLLRDY) == 0) {}                    // wait till PLL is ready
    
    RCC->CFGR &= ~RCC_CFGR_SW;                                  // clear SW bits
        RCC->CFGR |= RCC_CFGR_SW_PLL;                                   // select source SYSCLK = PLL
    while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {}          // wait till PLL is used
        
        //Тактирование периферии
  
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_ADC1EN;
 
RCC->CFGR &= ~RCC_CFGR_ADCPRE; //АЦП тактируется без предделителя
 
 //Светодиод PC9 зеленый                       
GPIOC->CRH &= ~GPIO_CRH_MODE9;     GPIOC->CRH &= ~GPIO_CRH_CNF9; //MODE = 1,0; CNF = 0,0. Это General-purpose, Push-pull, 2MHz
GPIOC->CRH |= GPIO_CRH_MODE9_1; 
 
 
                                                                         //Настраиваем ADC1
 
ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CAL;
while (ADC1->CR2 & ADC_CR2_CAL);
NVIC_EnableIRQ(ADC1_IRQn);
ADC1->CR1 |= ADC_CR1_EOCIE;
ADC1->SMPR2 |= ADC_SMPR2_SMP1_0;
ADC1->CR2 |= ADC_CR2_EXTSEL | ADC_CR2_EXTTRIG | ADC_CR2_CONT;
ADC1->SQR3 &= ~ADC_SQR3_SQ1;
ADC1->SQR3 |= ADC_SQR3_SQ2_0;
ADC1->SQR1 |= ADC_SQR1_L_1;
//ADC1->CR1 |= ADC_CR1_SCAN;
//ADC1->CR1 |= ADC_CR1_DISCNUM_0 | ADC_CR1_DISCEN;
ADC1->CR2 |= ADC_CR2_SWSTART;
 
  
  while(1) //Крутимся в бесконечном цикле
 
  {
    
  
  
}
  
  
  }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2018, 09:17
Ответы с готовыми решениями:

Порядок оцифровки групп регулярных каналов АЦП в режиме dual mode
Ситуация... моделирую на плате stm32f103c8t6 режим АЦП dual regular simultaneous only. Настроил четыре канала (два для каждого АЦП): ...

AVR АЦП использование нескольких каналов
Кто пробовал использовать несколько каналов АЦП одновременно (ну, почти одновременно) - как это делать правильно? Используется два...

Измерение нескольких каналов АЦП один раз за период сигнала запуска
Всем привет! Встал в тупик с частью программы Работаю с АЦП. Нужно произвести последовательное измерение 11 каналов. Сигналом...

30
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 1
29.11.2018, 19:35
Студворк — интернет-сервис помощи студентам
Привет всем !

Ранее я программил на Атмега много лет, очень нравится MSP430FR* , сейчас вот хочу перейти в своих разработках на STM32.

По цене и возможностям (для меня) выбрал STM32L152RBT6 .
Хорошая цена и доступность, на борту хватает всего для моей работы.
Но вот документация написана........ черт ногу сломит. Непривычно как-то все...

Моя задача такая:
1) надо измерять в цикле (ADC SCAN??) 4-5 каналов АЦП 12 бит, (выводы АЦП идут подряд "на ножках")
читал что как-то группы АЦП можно создавать но не понял что это...

2) данные от каждого замера АЦП складывать в память (массив или просто сразу "в переменную") RAM.

3) не хочу прерываний тут вообще! в MSP430 можно было настроить "начальный канал и конечный" и оно само писало в память типа ADCМЕМ1....ADCМЕМ16. В STM32 читал-читал так и не понял как такое сделать.
Ткните пожалуйста в доки где это расписано - в базовых даташитах все как-то кратко и не очень понятно как настраивать.

Т.е. хочу чтобы основной процесс в main() будет сам вычитывать переменные из памяти, не производя никаких прерываний для обработки АЦП или всего буфера. Буфер циклический - новое значение затирает(замещает переписывает) старое, никаких прерываний не вызывает - переписали и пошли дальше.

вопрос так-же по DAC - его обязательно по прерыванию обслуживать? если я(например) хочу "выпилить" некий сигнал на выходе - то я могу загнать в буфер(массив данных в памяти) числа, и дать команду "играй" и чтобы в цикле само без прерываний "выворачивало" цифры из памяти (массив? переменные?) в DAC вывод "на ножку".

Заранее спасибо за помощь.
Я так понимаю что периферия что на "Отлаждочных платах" что на STM32L152RBT6 одинаковая по сути управления, так что если есть для STM32F* примеры то я думаю они мне для понимания подойдут.

P.S> что нравилось в MSP430 - там куча примеров есть готовых программ на применение перферии от производителя. Сильно помогало.

P.P.S> не хочу никаих RTOS и чужих библиотек вообще - все пишу сам. Хочу быть уверенным в коде и том что происходит.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
29.11.2018, 19:44
AlexSor, если будешь разбираться то создай отдельную тему. А так гугли связки ADC+DMA, DAC+DMA
0
Эксперт по электронике
7214 / 3393 / 347
Регистрация: 28.10.2011
Сообщений: 13,338
Записей в блоге: 7
29.11.2018, 22:02
Цитата Сообщение от AlexSor Посмотреть сообщение
В STM32 читал-читал так и не понял как такое сделать.
Нужно использовать DMA.

Не по теме:

Цитата Сообщение от AlexSor Посмотреть сообщение
выбрал STM32L152RBT6
Устройство питается от батареек? Иначе нет смысла брать МК с поддержкой пониженного потребления.

0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
29.11.2018, 23:23
AlexSor,
Цитата Сообщение от AlexSor Посмотреть сообщение
P.P.S> не хочу никаих RTOS и чужих библиотек вообще - все пишу сам.

Не по теме:

Это проходит)


Ну вот в этой теме автор с небольшой помощью смог завести оцифровку двух каналов АЦП с ДМА без участия ядра и прерываний. Чтобы завести 5 каналов надо добавить 3 строчки и изменить еще парочку. Посмотрите, что он делает, сравните с даташитом. Сильно сомневаюсь в каких либо сильных отличиях в работе АЦП и ДМА в F1 серии и L1 серии. Есть подозрения что регистры и биты одинаково называются. Пробуйте пишите, выкладывайте, подскажем.
1
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
03.12.2018, 17:48
Доброго времени суток !

2ТС Накидал быстренько вам пример, рабочий, опрос 2-х каналов А0 и А1 в произвольный буффер
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void hw_init() { // инициализация порта и периферии
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_ADC1EN; //включаем порт А и АЦП
    RCC->AHBENR |= RCC_AHBENR_DMA1EN; // Включаем ПДП
    RCC->CFGR |= RCC_CFGR_ADCPRE_1;  // устанавливаю пределитель частоты АЦП 6 (72/6) = 12МГц
 
    GPIOA->CRL &= 0xffffff00;  // Устанавливаем порт А.0 и А.1 на аналоговый вход
}
void adc_start(uint16_t *bf) { // Запуск АЦП с указанием буфера куда складывать результат
    // dma setup
    DMA1_Channel1->CMAR = bf;    // Адрес буфера памяти для результата
    DMA1_Channel1->CPAR = &ADC1->DR;  // Адрес регистра АЦП откуда читать данные
    DMA1_Channel1->CNDTR = 2; // Количество перебросок в цикле
    DMA1_Channel1->CCR = 0x15a1;  // Запуск канала
 
    // adc setup
    ADC1->SQR1 = 0x00100000;   // Количество опрашиваемых каналов 2
    ADC1->SQR3 = 0x00000020;  // первый канал А.0, второй канал А.1
 
    ADC1->SMPR2 = 9;     // количество тактов на преобразование - по 7.5 на канал
    ADC1->CR1 = 0x100; // установка scan mode
    ADC1->CR2 = 5;  // запуск калибровки
    while(ADC2->CR2 & ADC_CR2_CAL);  // Ожидание завершения калибровки
    ADC1->CR2 |= 0x102; // Включение режима ПДП и непрерывного сбора
    ADC1->CR2 |= 1; // Запуск преобразования
}
void adc_stop() {
    ADC1->CR2 = 0; // Остановка преобразования и сброс флагов
    DMA1_Channel1->CCR = 0; // Отключение канала ПДП
}
После adc_start(bf); в памяти bf[0] будет канал А.0; bf[1] будет канал А.1
ну собственно вот и все, по желанию можно добавить прерывания - конец преобразования; конец пересылки или просто смотреть регистры статуса.

Как вы можете видеть, для правильной организации работы периферии, необходимо хорошо понимать принципы ее работы. И ни HAL ни SPL вам в этом не помогут, только запись длинней сделают. Внимательно читайте RM и учите возможности инструмента на котором работаете (данный листинг для GCC). Желаю удачи в вашем начинании, но лучше отучиться в профильном ВУЗ-е, понимание придет намного быстрей.
0
03.12.2018, 18:44

Не по теме:

Цитата Сообщение от Void1509 Посмотреть сообщение
И ни HAL ни SPL вам в этом не помогут, только запись длинней сделают.
Цитата Сообщение от Void1509 Посмотреть сообщение
C
1
2
3
4
5
6
ADC1->SMPR2 = 9;
ADC1->CR1 = 0x100;
ADC1->CR2 = 5;
while(ADC2->CR2 & ADC_CR2_CAL);
ADC1->CR2 |= 0x102;
ADC1->CR2 |= 1;
Сможете без просмотра документации понять что и где настраивается? В этом плане HAL и SPL лучше.

0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
03.12.2018, 18:57
Конечно смогу, я комменты писал находу, уже в браузере. Для того что бы вы могли планировать работу АЦП (как и любую другую периферию) вы должны знать биты управления этой периферией, просто для того что бы понимать как ее применять. То есть вы еще ничего не пишете, вы только проектируете свое устройство. И для того что бы вы могли правильно спроектировать работу ваших датчиков, моторчиков, нагревателей, и т.д. Вы четко должны представлять как работает ваша периферия и какие функции, на какую периферию вы возложите и каким методом.
А если вам для простого включения периферии нужен HAL, то боюсь представить, что вы там на проектировали.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
03.12.2018, 21:41
Void1509, вы бы хоть осмысленные маски битов использовали, которые в CMSIS прописаны. А так, кто в лес кто по дрова, где HEX, где DEC. Рандомные числа в регистрах. Если писать код только ради того, чтобы написать его "на регистрах" - это бесполезные трудозатраты. Даже "на регистрах" можно писать код читаемым.
0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
04.12.2018, 00:06
Уважаемые господа !

Приведенный мной код, написан так как удобно лично мне. Это мое субъективное мнение, по поводу вопроса ТС. Переводить восьмеричные, десятичные, шестнадцатиричные числа в двоичные я научился еще в 12 лет и по этому такая запись меня не смущает. К тому же эта запись очень лаконична, просто лень было писать много букв на SPL. Но я хотел показать, что пишите вы хоть на SPL, хоть на HAL, хоть на CMSiS это без разницы ! Все равно вам надо понимать как соответствующие биты будут установлены в портах. То есть, я прочитал RM и мне необходимо запустить АЦП в определенном режиме, я по RM нашел биты которые мне нужны в регистрах настройки АЦП. Далее если я пользуюсь SPL или HAL мне нужно выяснить - какие функции устанавливают или сбрасывают интересующие меня биты. Или другой вариант - без SPL или HAL, я напрямую устанавливаю или сбрасываю интересующие меня биты. RM то описан в БИТАХ, а не в функциях HAL или SPL ! А чего я хочу от АЦП (в частности) я узнаю по RM. По этому мне кажется намного проще - прочитать RM, выяснить режим работы, по RM установить биты обеспечивающие этот режим, чем выяснять как установить те же биты через HAL или SPL.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
04.12.2018, 09:15
Void1509,
Цитата Сообщение от Void1509 Посмотреть сообщение
, я напрямую устанавливаю или сбрасываю интересующие меня биты.
да ради бога устанавливайте биты вручную, но почему их не установить так:
C
1
ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_CAL;
А то по записи
C++
1
ADC1->CR2 = 5;
те кто не разбирается - не разберется, тем кто разбирается лишний раз в RM лезть.
0
5 / 5 / 0
Регистрация: 17.09.2018
Сообщений: 43
04.12.2018, 14:05
Я же честно признался - писал "быстренько", и по коду видно, что в начале я указывал макроопределения, но ближе к окончанию стал лениться и вместо макроопределений ставить просто цифры.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2018, 14:05

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух (ну или с нескольких) каналов АЦП,...

АЦП несколько каналов
Нужно замерять сигналы с трех выводов АЦП МК, как это сделать грамотно?

Переключение каналов АЦП atmega88
Добрый день. В который раз сталкиваюсь с АЦП на меге и никак не могу понять как правильно перекючать каналы АЦП. Помогите пожалуйста. Ниже...

Stm8l и несколько каналов АЦП
Здравствуйте! Помогите, пожалуйста разобраться в совместной работе ADC и DMA. Пробовал и в одиночном преобразовании и в циклическом ни чего...

Большое количество АЦП каналов
Здравствуйте! Подскажите микроконтроллеры с количеством АЦП 50 или больше каналов. И есть ли такое вообще ? :)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru