Микроконтроллеры

Мигаем диодами с помощью ШИМ ( PWM ) stm32f4 discovery [ arm ]

В этой статье речь пойдёт об использовании ШИМ контроллера. Применений этому режиму работы море, от банального моргания диодом, до управления двигателями и прочей электроникой.. Суть заключается в том, что при помощи широтно-импульсной модуляции и сглаживающей RC цепи можно получать аналоговое напряжение в диапазоне от логической еденицы до 0.

Мы же будем использовать таймер TIM4 нашего STM32F4 Discovery в качестве формирователя ШИМ сигнала (на буржуйском PWM - pulse width modulation).

Настроим и оставим как есть, чтобы диоды "моргали" с разной частотой.

Моргаем портами контроллера AVR или программируем в Atmel AVR Studio

Эта статья подойдёт новичкам, которые только делают первые шаги.

Нам понадобится:
Atmel AVR Studio - для программирование
Proteus - для симуляции

Открываем студию. Видим привычное для пользователей Microsoft Visual Studio окно.

Жмём Файл - Новый проект

Создаём "C Executable Project". Задаём имя и жмём ок.
Теперь перед вами окно выбора контроллера:

Выводим строку "Hello world!" на LCD экран - [ AVR AtMega8 ]

Сейчас мы выведем нашу первую строку на LCD экран при помощи микроконтроллера AVR AtMega8.
Кодить будем на Си в AVRCodeVision. Симулировать результат в ISIS.

Собираем схему:

Ну а теперь открываем AVRCodeVision, создаём новый проект ну и кодим:

Работаем с простыми таймерами STM32 F4 discovery

В любом современном контроллере есть таймеры. В этой статье речь пойдёт о простых (базовых) таймерах stm32f4 discovery.
Это обычные таймеры. Они 16 битные с автоматической перезагрузкой. Кроме того имеется 16 битный программируемый делитель частоты. Есть возможность генерирования прерывания по переполнению счётчика и/или запросу DMA.

Приступим. Как и раньше я пользуюсь Eclipse + st-util в ubuntu linux

Первым делом подключаем заголовки:

Работаем с АЦП stm32f4 discovery - мерим температуру

В отладочной плате STM32F4 discovery микроконтроллер оснащенный 12битным АЦП со встроенным датчиком температуры и напряжения.
В этой статье займёмся датчиком температуры, заодно рассмотрим принципы работы с АЦП в stm32 spl (стандартной периферийной библиотеке).
Напишем приложение, которое зажигает 4 диода в зависимости от уровня получаемого с АЦП1.

Необходимые инклуды:

#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_adc.h>

Инициализируем диоды:

Программируем первый AVR контроллер [ AtMega8 ]

Для всего нижеизложенного нам понадобится:

  • CodeVisionAvr - для компиляции программы контролера
  • Proteus - для симуляции

Если у вас нет этих программ лучше скачайте именно их. В других всё может кардинально отличатся.
Немного для понимания процесса.
Тут вы не найдёте теоретических сведений о контроллерах и правильном их программировании. Это всего навсего хелловорд в мире контроллеров.
Мы запрограммируем контроллер, который будет мигать диодом по заданной программе.

Схема:

Прошивка внешнего контроллера при помощи stm32 discovery - SWD

Для создания минимального проекта нам понадобится: контроллер stm32 ( у меня stm32f103 ), жменя проводов, светодиод (для проверки).
Мы не будем вешать даже кварц, чтобы не усложнять процесс.
Очень удобно использовать вот такую плату-переходник с LQFP:

Стоит она в районе 1$. Зато не надо травить крохотные дорожки.
Собираем вот такую схему (для stm32f103 48ног):

Ставим Eclipse + ARM plugin + stlink utility для работы с STM32F4 DISCOVERY в Linux

Недавно приобрел не безызвестную отладочную плату STM32F4.
Порадоваля дефолтной прошивке и приступил к настройке IDE для разработки.

Свой выбор я остановил на связки Eclipse + ARM plugin + Sourcery CodeBench.
Плюсы такого решение: бесплатно, много примеров
минусы: ставить всё придётся ручками и отдельно.

Прерывание на контроллере AVR в Atmel AVR Studio

Первым делом о том что такое прерывание.
Прерывание ( interrupt ) - это своеобразная функция, которая будет выполнена при поступлении сигнала на какой нибудь вход контроллера.
При работе в AVR Studio прерывания создаются при помощи макросов ISR() , SIGNAL() и INTERRUPT(). Они помечают некоторую функцию как обработчик прерывания. Их различие в том, что INTERRUPT() и ISR() определяют функцию обработчик для случая, когда разрешено общее прерывание (обработчик может быть прерван), а SIGNAL() для случая когда общее прерывание запрещено.