Аналогово-цифровой преобразователь - это узел, который "оцифровывает" мгновенное значение напряжения. В STM32F1 содержится два 12-битных преобразователя, а это значит, напряжения на любом канале АЦП будут представлены значением от 0 до 4095. Какое напряжение на канале на самом деле, вы сможете понять, если наверняка знаете напряжение питания АЦП (VDDA). Предположим, что питание микроконтроллера 3.30V, это значит, что показание АЦП 4095 соответствует этому напряжению, 3.30V. Показание АЦП 2048 единиц, это будет 1/2 от VDDA, а конкретно 1.65V. Эти величины меняются линейно, в зависимости от напряжения на канале АЦП. При напряжении питания 3.3В "вес единицы" АЦП будет 0.806 мВ. При напряжении питания 2.8В "вес единицы" АЦП будет 0.684 мВ. Думаю, принцип вы уже поняли.

АЦП не может замерять напряжение на нескольких каналах одновременно. Между АЦП и каналами стоит мультиплексор, который может захватывать только один из десяти возможных каналов. Однако если измерять каналы быстро по очереди, то можно создать эффект параллельности измерений. Эффективно и достаточно точно значения измеряются при меньшей частоте работы АЦП и большем Sampleticks. Более-менее сносно можно делать около 18000 замеров (выборок) в секунду. Минимальное время выборки для 12-битного режима - 1 мкс (то есть до 1000000 выборок в секунду при тактовой частоте АЦП 14 МГц).

В этом уроке мы будем пользоваться АЦП STM32F103 в самом простом режиме — одиночной конверсии. Это когда за одно преобразование мы обрабатываем только один канал. В этом уроке я покажу неблокирующую работу с АЦП (без прерываний) на разных каналах.

Широтно-импульсная модуляция в микроконтроллерах STM32F1 реализована через таймеры общего назначения TIM1, TIM2, TIM3. К каждому из этих таймеров можно «подцепить» до четырех выходных каналов. Принцип работы ШИМ очень прост: 
1) таймер тактируется от своей шины через Prescaler (делитель частоты) и считает, допустим, «вверх».
2) Как только счетчик таймера достигает значения равного значению регистра ARR (Auto-reload register), то он (счетчик) перезагружается, или, простыми словами, обнуляется и считает заново.
3) У каждого канала есть регистр CCR (Capture/compare register). Когда значение счетчика меньше CCR, на канале PWM (на выходе) высокий уровень. Когда значение счетчика равно CCR или больше, то на канале низкий уровень.
4) Работа таймеров, и, следовательно ШИМ, не занимает процессорного времени, они работают независимо друг от друга.

Tags: ,

Казалось бы, что может быть знакомее старой доброй AVR? Она на начало 2025-го настолько уже мне была неинтересна, что я даже не подозревал как сильно она мне понадобится. А еще, меня обескуражило то, как это непросто и нетривиально: работать с ATTINY10. Эта история для вас будет поучительной, потому что задача решена и остается лишь взять наш опыт на вооружение. Здесь нет никаких революционных открытий, но все же я делаю упор на предоставление расширенной информации. То что мне не удавалось прочитать "между строк" где-то в одном месте, но пришлось собирать информацию по сети, проверять и конечно - делиться!

Это синхронная шина обмена данными в которой присутствует один Master (ведущий) и от одного до нескольких Slave (ведомых). Соединены все по трем проводам GND, SDA (данные), SCL (тактирование).

Конфигурирование периферии I2C начинается с разрешения ее тактирования, затем нужно настроить GPIO, к которым будет подключена I2C. В примере ниже, I2C1 расположена на PB7 (SDA) и PB6 (SCL). Оба этих пина настраиваются как Alternate output Open-Drain (CNF=11, MODE=11).

Далее я приведу пример настройки интерфейса I2C в режиме мастера на скорости 100 кГц. Данный режим будет использоваться мной для работы с EEPROM памятью серии 24Сxx.

Tags: ,

Старый добрый UART, сколько лет он уже существует? Только сама природа это помнит, тех древних мудрецов, которые упаковывали сообщения в асинхронные пакеты и отправляли по гудящим столбам сквозь пространство и время... И вот этот интерфейс дожил до наших дней, и, кстати, никуда уходить не собирается. Внутри STM32 уже есть периферия для работы с портами UART во всевозможных режимах, на разных скоростях. Моя задача - показать, насколько просто и экономично можно программировать этот интерфейс. Вооружайтесь до зубов USB свистками UART, это будет увлекательное путешествие.

Tags: ,