С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Quodro-pro
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 76
1

Блиблиотека PWM (ШИМ) для STM32F4-Discovery [Решение]

26.03.2014, 02:15. Просмотров 5775. Ответов 0
Метки нет (Все метки)

Здравствуйте форумчане, понадобилось к плате STM32F4-Dyscovery подключить сервоприводы.

Для управления простыми сервопиводами как известно нужно использовать ШИМ, для этого покопавшись в инете и даташиту решил сделать библиотеку, чтобы как можно проще можно было бы подключать много сервов, каждый раз не копаясь в регистрах и прочих рутинных настройках.

В итоге получилась библиотека PWM в которой можно задействовать все возможные пины с таймерами которые могут гененрировать нам ШИМ.

Для работы ШИМ, нужно просто в заголовочном файле раскоментировать нужный пин и ВСЁ!!
Вся настройка регистров порта и нужного таймера делается автоматически.

Затем необходимо задать необходимую частоту ШИМ и его разрешение в битах на PA, PB, PC, PD или PE
Например: PWM_PD_Init (50, 16);
или PWM_PA_Init (50,16);
Эта функция задаёт ШИМу параметры 50Гц с разрешением 16 бит.

После чего можно использовать нужную функцию ШИМ
Например: PWM_PD12_Set (5000); где 5000, это задаваемая скважность
или SERVO_PA1_set_pos (45); где 45, угол поворота сервопривода

На одном порте, например PB пины могут использовать сразу несколько таймеров TIM2, TIM3 и TIM4, чтобы в пустую не запускать все три, при включении одного пина, задействуется только НУЖНЫЙ этому пину таймер. Это сделано для того, чтобы можно было использовать оставшиеся таймеры порта PB для других ваших целей .

Некоторые таймеры перекликаются с другими портами, например TYM1 используется как в PA так и в PE, а TIM4 используется в РB и PD.
У меня возникли сомнения, что можно коректно использовать один таймер на двух пинах, поэтому на всякий случай сделал один пин как мастер помеченный m другой как слейв помеченный s.
При включении сразу двух пинов используемых один и тот же таймер, автоматически отключаются все слейв пины этого таймера.

В библиотеке есть функции для управления сервоприводами, где задаётся угол поворота, или можно переключить в режим, где угол задаётся значением от 0 до 255, например если нужно посылать байты для управления сервой.
Также в заголовочном файле для сервопривода есть функция для калибровки диапазона сервопривода и подробно описал в заголовочном файле как он настраивается.

Также есть обычные функции ШИМ, которые подходят скажем для управления светодиодами, или если просто нужно задать скважность ШИМа.

Все строчки и функции я постарался подробно прокомментировать, в принципе настройка ШИМ дело не хитрое и почитав комментарии думаю не сложно понять логику и легко можете адаптировать по ваши нужды.

Код демо примера работы библиотеки ШИМ, который плавно зажигает на плате светодиоды, или циклично поворачивает сервопривод подключённый к PA1.
Для этого в заголовочном файле библиотеки PWM_stm32f4_discovery.h раскоментированы пины PWM_PA1 для работы сервы
PWM_PD12 - PWM_PD15 для работы светодиодов.

Код
#include "stm32f4xx.h"
#include "PWM_stm32f4_discovery.h"

#define Led_Blink_Dimo //Раскоментируйте для включения примера ШИМ со светодиодами
//#define Servo_Dimo   //Раскоментируйте для включения примера работы сервопривода

int main(void)
{
SystemInit();

uint8_t i;
uint8_t Value = 0;

//Инициализируем порт А и D для ШИМ и зададим частоту 50Гц с разрешением 16 бит
PWM_PA_Init(50,16); // порт А для использования сервопривода на PA1
PWM_PD_Init(50,16); // порт D для использования LED на плате STM32F4-Dyscovery

while(1)
{
#ifdef Led_Blink_Dimo
PWM_PD12_Set((uint16_t)Value << 8); // Используем ШИМ для пина PD12 с зелёным LED
PWM_PD13_Set((uint16_t)Value << 8);
PWM_PD14_Set((uint16_t)Value << 8);
PWM_PD15_Set((uint16_t)Value << 8);

// следующее число
Value++;
PWM_Delay(100000); //изменяя число задержки, можем менять скорость изменения яркости
#endif // End Led_Blink_Dimo btock

#ifdef Servo_Dimo
for (i=0; i<=180; i++)
{
SERVO_PA1_set_pos(i);
PWM_Delay(100000); //меняя задержку, можем менять скорость сервопривода
}
#endif // End Servo_Dimo btock
}
}
Прямая ссылка с моего Яндекс диска на проект в CooCox http://yody.sk/d/W8aF4C4rLGngU

Прямая ссылка на библиотеку PWM_stm32f4_discovery.c / h http://yody.sk/d/medNTJGrLGneC

Если есть какие- либо ошибки в коде, пишите.

Также буду рад если вы добавите или усовершенствуйте библиотеку своими функциями и выложите сюда. ))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 02:15
Ответы с готовыми решениями:

Модуль WiFi HLK-RM04 + STM32F4-Discovery [Решение]
Решил свою STM32F4 подключить к WiFi модулю, выбор пал на не дорогой HLK-RM04 совместимый с...

STM32F4 discovery для начинающего?
Есть опыт разработки устройств на контроллерах AVR, подключение к интернету, удаленный доступ и...

Живая отладка для STM32F4-discovery
Доброго времени суток.Купил плату STM32F4-discovery. Прошил проект с работой АЦП. Хочу...

Любая прошивка для USB на STM32F4-discovery [Решено]
Ковыряюсь с USB на STM32. На ум приходит анекдот (ну это завсегда так): Заходит человек в...

Вопрос о сенсорных кнопках для STM32F4-Discovery [Решено]
Возникла акая задача, для контроллера STM32F4-Dyscovery не имеющего на борту снсорных кнопок, их...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 02:15

STM32F4 PWM Input
Пытаюсь захватить сигнал с IR датчика с помощью таймера в режиме PWM Input. Конечной целью...

STM8L ШИМ(PWM)
Здравствуйте, необходимо сделать с помощью ШИМа генерацию трехфазного напряжения. Среда разработки...

ATtiny13. PWM (ШИМ)
прошу знающих пояснить принцип управления аппаратным ШИМом, а именно: 1. как в коде Си это...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru