реклама на сайте
подробности

 
 
> STM32F4 несколько ШИМ на одном таймере, Не знаю как подступиться к STM32F4-Discovery
peroid
сообщение May 17 2015, 19:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-05-15
Пользователь №: 86 555



Доброго времени суток всем.

В текущий момент разбираюсь с ШИМ, объектом манипуляций являются две сервы SG90.
Посмотрел на примеры в уроках, и кое-как сваял функцию для управления сервой.

CODE
void Hard_PWM (void){

TIM_TimeBaseInitTypeDef TIM_Time_user;
TIM_OCInitTypeDef Hard_PWM_ini;
GPIO_InitTypeDef GPIO_Init_LED;
TIM_ICInitTypeDef TEST_Dop;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

GPIO_Init_LED.GPIO_Pin = GPIO_Pin_12;
GPIO_Init_LED.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init_LED.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init_LED.GPIO_OType = GPIO_OType_PP;
GPIO_Init_LED.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_PinAFConfig (GPIOD, GPIO_PinSource12,GPIO_AF_TIM4);

GPIO_Init(GPIOD, &GPIO_Init_LED);
Hard_PWM_ini.TIM_OCMode=TIM_OCMode_PWM1;
Hard_PWM_ini.TIM_OutputState=TIM_OutputState_Enable;
Hard_PWM_ini.TIM_Pulse=0; //250-1000
Hard_PWM_ini.TIM_OCPolarity=TIM_OCPolarity_High;

TEST_Dop.TIM_Channel = TIM_Channel_1;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_Time_user.TIM_Prescaler = 83;
TIM_Time_user.TIM_CounterMode = TIM_CounterMode_Up;
TIM_Time_user.TIM_Period = 19999;
TIM_Time_user.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM4, &TIM_Time_user);
TIM_Cmd(TIM4, ENABLE);

TIM_OC4Init(TIM4, &Hard_PWM_ini);

}


В юзер мануале (UM1472) на странице 30 указано, что выходу PD12 соответствует первый канал таймера 4 (TIM4_CH1), PD13 - второй, PD14 -третий и четвертый для PD15 .

Вопрос в следующем - можно ли использовать одновременно 4 различные функции для разных ножек, но с одним таймером (это будет нога гексапода)? Ну и конечно был бы очень благодарен за подсказку в каком направлении читать и рыть.
Я еще плохо ориентируюсь в чтении мануалов. Оказывается не просто сел и прочитал rolleyes.gif на одно предложение, сразу десять вопросов. Недавно снизошла благодать в виде чтения библиотек и попыток чего-нибудь из них вкрячить в код biggrin.gif.
Вот, попытался добавить TIM_Channel = TIM_Channel_1, чтобы явно указать канал 1, но не получается чего-то... не выходит каменный цветок.

Заранее спасибо за любую помощь.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
peroid
сообщение May 23 2015, 17:02
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-05-15
Пользователь №: 86 555



Решено.
Курил интернеты и таки разобрался. Решение было под носом.
Нужно было просто записать данные конкретно для канала 1.

Вот код решения, может другому новичку будет легче:

CODE

void gpiod_ini (void){

//------------------1 opredelim strukturu nastroek GPIO D & TIMER4-
GPIO_InitTypeDef GPIOD_init;
TIM_TimeBaseInitTypeDef TIMER_4_init;
TIM_OCInitTypeDef TIMER_4_def;

//------------------2 taktirovanie GPIO D & Timer_4--------------
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);


GPIOD_init.GPIO_Mode = GPIO_Mode_AF;
GPIOD_init.GPIO_OType = GPIO_OType_PP;
GPIOD_init.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
GPIOD_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIOD_init.GPIO_Speed = GPIO_Low_Speed;

GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
// Zapishem nastroiki
GPIO_Init(GPIOD, &GPIOD_init);

//------------------3 nastroim TIMER 4 osnovnie nastroiki ----------

TIMER_4_init.TIM_ClockDivision = TIM_CKD_DIV1;
TIMER_4_init.TIM_CounterMode = TIM_CounterMode_Up;
TIMER_4_init.TIM_Period = 499;
TIMER_4_init.TIM_Prescaler = 8399;
// Zapishem nastroiki
TIM_TimeBaseInit(TIM4, &TIMER_4_init);

//------------------4 nastroim TIMER 4 dlya PWM---------------------

TIMER_4_def.TIM_OCMode = TIM_OCMode_PWM1;
TIMER_4_def.TIM_OCPolarity = TIM_OCPolarity_High;
TIMER_4_def.TIM_OutputState = TIM_OutputState_Enable;
TIMER_4_def.TIM_Pulse = 0;

// Zapishem nastroiki kanalov 1,2,3,4 TIMER-a 4

TIM_OC1Init(TIM4, &TIMER_4_def);
TIM_OC2Init(TIM4, &TIMER_4_def);
TIM_OC3Init(TIM4, &TIMER_4_def);
TIM_OC4Init(TIM4, &TIMER_4_def);

//------------------------------------------------------------------------------------------
//Ну и само управление каналами в главной функции:
//------------------------------------------------------------------------------------------

int main(void){

gpiod_ini();

while(1){

TIM_SetCompare1(TIM4,100);
TIM_SetCompare2(TIM4,200);
TIM_SetCompare3(TIM4,300);
TIM_SetCompare4(TIM4,400);
}
}




Теперь у паука появился шанс http://electronix.ru/forum/style_images/1/...cons/icon10.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 13:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016