Технический форум по робототехнике.
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 раз.
dccharacter » 24 апр 2013, 14:52
Askar писал(а):Ребята, подскажите как управлять с помощью таймера 20 GPIO?
Мне нужно на эти 20 gpio слать ШИМ, а мой таймер(TIM4) может только
слать 4 каналам(PD12,PD13,PD14,PD15) ШИМ, а мне нужно 20.
использовать несколько таймеров. Может и получится 20 ШИМов наскрести.
Askar » 24 апр 2013, 14:57
dccharacter » 24 апр 2013, 15:16
А ты сам-то читал статьи, на которые ссылки даешь, а?
elmot » 24 апр 2013, 15:26
Дайте мне stm32, 8 кило RAM, 1 канал таймера и 1 канал DMA. И 32 канала как с куста
Последний раз редактировалось
elmot 24 апр 2013, 15:28, всего редактировалось 1 раз.
dccharacter » 24 апр 2013, 15:27
elmot писал(а):Дайте мне stm32, 4 кило памяти, 1 канал таймера и 1 канал DMA. И 32 канала как с куста
С каким разрешением?
))
elmot » 24 апр 2013, 15:31
Блин, обсчитался
5кило - 2 мксек, 10 кило -1 мксек. Ну вы понели:)
dccharacter » 24 апр 2013, 16:28
да лана тебе - от разрешения память не зависит
две 32-битных переменных для состояния ног
32 переменных для каунтеров
32 переменных для отсечки
Но если делать с 1МГц, то ни на что времени больше не останется.
Добавлено спустя 5 минут 22 секунды:
Вообще я хрень написал
Вон на изиэлектроник все отлично описано как без гимора и не теряя разрешения все сделать
elmot » 24 апр 2013, 16:40
Я другое задумал:) Пишем по dma из памяти в out регистр порта GPIO. Тупо заполнили битовой картой 2.5мсек((32ноги = 4 байта)*2500 шагов)=10кб.
Зарядили таймер пересбрасываться каждые 20 мсек. и на частоте 1мгц переписываем блок памяти в порт:) Проц расслаблено курит ,32 ноги накачаны данными из dma.
dccharacter » 24 апр 2013, 16:54
А dma, кстати, не гарантирует тайминги-то
elmot » 24 апр 2013, 17:10
с каких пор? если dma по таймеру-то запущен? Есть там какой-то режим память-память, он может и не гарантирует.
Askar » 24 апр 2013, 17:16
если честно я нечего не понял =)))))))))))))))))
dccharacter » 24 апр 2013, 17:32
elmot писал(а):с каких пор? если dma по таймеру-то запущен? Есть там какой-то режим память-память, он может и не гарантирует.
ДМА запрос-то ты генеришь идеально по таймеру. А вот выполняется он в порядке живой очереди
elmot » 24 апр 2013, 17:59
С точностью +- процессорный такт? Это, знаете ли, неплохая точность
dccharacter » 24 апр 2013, 18:11
elmot писал(а):С точностью +- процессорный такт? Это, знаете ли, неплохая точность
Не, кто-то тут докладывал, что может ощутимо тормознуть. Не помню кто.
Добавлено спустя 8 минут 6 секунд:Кстати, таймер может генерить ДМА-запросы. Короче там можно офигенно все сделать практически полностью в автоматическом режиме. Прелоадишь таймер на компаре, генеришь апдейт ивент, прелоадишь следующее значение. Когда таймер дотикивает до компари, он генерит ДМА-запрос, дергает из буфера значение и кидает его на ноги, поинтер автоматически увеличивается (длина у буфера - по количеству каналов). Дальше в прерывании прелоадишь новое значение. И так по кругу. Процессора съедаешь - минимум. Все само крутится.
Сказка.