roboforum.ru

Технический форум по робототехнике.

STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

Askar » 24 апр 2013, 14:49

Ребята, подскажите как управлять с помощью таймера 20 GPIO?
Мне нужно на эти 20 gpio слать ШИМ, а мой таймер(TIM4) может только
слать 4 каналам(PD12,PD13,PD14,PD15) ШИМ, а мне нужно 20.

Код: Выделить всёРазвернуть
     uint16_t Prescaler =  8; // PCLK1 = 168MHz/8 ~= 21MHz
     uint16_t Period = 60000; // 20000; // 20 ms
    
     // Инициализируем таймер 4
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
     TIM_TimeBaseStructInit (&TIM_TimeBaseStructure);
     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
     TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;
     TIM_TimeBaseStructure.TIM_Period = Period;
     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

     // Разрешаем таймеру обращаться к выходу PD12
     GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
     GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
     GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
     GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);
    
    
     //------------------------------------------------------------------------------------------
     // Инициализируем ШИМ
     TIM_OCInitTypeDef TIM_OCInitStructure;
     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
     TIM_OCInitStructure.TIM_Pulse = 0;
     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

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

     TIM_Cmd(TIM4, ENABLE);

Последний раз редактировалось Askar 24 апр 2013, 14:55, всего редактировалось 1 раз.

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 14:52

Askar писал(а):Ребята, подскажите как управлять с помощью таймера 20 GPIO?
Мне нужно на эти 20 gpio слать ШИМ, а мой таймер(TIM4) может только
слать 4 каналам(PD12,PD13,PD14,PD15) ШИМ, а мне нужно 20.

использовать несколько таймеров. Может и получится 20 ШИМов наскрести.

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

Askar » 24 апр 2013, 14:57

Не нужно с одного таймера управлять 20-ти ногами
Как тут:
http://easyelectronics.ru/upravlenie-mn ... hinok.html
http://habrahabr.ru/post/147940/
http://alex-exe.ru/radio/robotics/servo-pc/

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 15:16

А ты сам-то читал статьи, на которые ссылки даешь, а?

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

elmot » 24 апр 2013, 15:26

Дайте мне stm32, 8 кило RAM, 1 канал таймера и 1 канал DMA. И 32 канала как с куста :-D
Последний раз редактировалось elmot 24 апр 2013, 15:28, всего редактировалось 1 раз.

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 15:27

elmot писал(а):Дайте мне stm32, 4 кило памяти, 1 канал таймера и 1 канал DMA. И 32 канала как с куста :-D

С каким разрешением? :-)))

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

elmot » 24 апр 2013, 15:31

Блин, обсчитался
5кило - 2 мксек, 10 кило -1 мксек. Ну вы понели:)

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 16:28

да лана тебе - от разрешения память не зависит
две 32-битных переменных для состояния ног
32 переменных для каунтеров
32 переменных для отсечки

Но если делать с 1МГц, то ни на что времени больше не останется.

Добавлено спустя 5 минут 22 секунды:
Вообще я хрень написал
Вон на изиэлектроник все отлично описано как без гимора и не теряя разрешения все сделать

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

elmot » 24 апр 2013, 16:40

Я другое задумал:) Пишем по dma из памяти в out регистр порта GPIO. Тупо заполнили битовой картой 2.5мсек((32ноги = 4 байта)*2500 шагов)=10кб.
Зарядили таймер пересбрасываться каждые 20 мсек. и на частоте 1мгц переписываем блок памяти в порт:) Проц расслаблено курит ,32 ноги накачаны данными из dma.

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 16:54

А dma, кстати, не гарантирует тайминги-то

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

elmot » 24 апр 2013, 17:10

с каких пор? если dma по таймеру-то запущен? Есть там какой-то режим память-память, он может и не гарантирует.

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

Askar » 24 апр 2013, 17:16

если честно я нечего не понял =)))))))))))))))))

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 17:32

elmot писал(а):с каких пор? если dma по таймеру-то запущен? Есть там какой-то режим память-память, он может и не гарантирует.

ДМА запрос-то ты генеришь идеально по таймеру. А вот выполняется он в порядке живой очереди :-)

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

elmot » 24 апр 2013, 17:59

С точностью +- процессорный такт? Это, знаете ли, неплохая точность

Re: STM32F4DISCOVERY как подключить к таймеру-ШИМ 20 GPIO

dccharacter » 24 апр 2013, 18:11

elmot писал(а):С точностью +- процессорный такт? Это, знаете ли, неплохая точность

Не, кто-то тут докладывал, что может ощутимо тормознуть. Не помню кто.

Добавлено спустя 8 минут 6 секунд:
Кстати, таймер может генерить ДМА-запросы. Короче там можно офигенно все сделать практически полностью в автоматическом режиме. Прелоадишь таймер на компаре, генеришь апдейт ивент, прелоадишь следующее значение. Когда таймер дотикивает до компари, он генерит ДМА-запрос, дергает из буфера значение и кидает его на ноги, поинтер автоматически увеличивается (длина у буфера - по количеству каналов). Дальше в прерывании прелоадишь новое значение. И так по кругу. Процессора съедаешь - минимум. Все само крутится.
Сказка.


Rambler\'s Top100 Mail.ru counter