Перейти к содержанию
    

Stm32f4 дрыгание ножкой с помощью таймера без прерываний

Спасибо всем за помощь.

Наверняка есть что то лишнее, не совсем правильное и не нужное, но решить задачу в итоге мне помогла вот такая функция инициализации:

Spoiler
void timer_1_init() // функция инициализации
    {
    TIM_BDTRInitTypeDef TIM_BDTRInitStruct1;
    TIM_TimeBaseInitTypeDef TIMER_InitStructure1;
    TIM_OCInitTypeDef TIMER_OCInitStructure1;
    TIM_ICInitTypeDef TIMER_ICInitStructure1;
    GPIO_InitTypeDef GPIO_init_tim1;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    TIM_TimeBaseStructInit(&TIMER_InitStructure1);
 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
 
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1);
    GPIO_init_tim1.GPIO_Mode = GPIO_Mode_AF;
    GPIO_init_tim1.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_init_tim1.GPIO_OType = GPIO_OType_PP;
    GPIO_init_tim1.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_init_tim1.GPIO_Pin = GPIO_Pin_13;    
    GPIO_Init(GPIOE, &GPIO_init_tim1);
 
    TIMER_InitStructure1.TIM_CounterMode = TIM_CounterMode_Up; // считает вверх
    TIMER_InitStructure1.TIM_Period = 65534;// 65535
    TIMER_InitStructure1.TIM_Prescaler = 0; // делитель частоты тактирования МК
    TIMER_InitStructure1.TIM_ClockDivision=TIM_CKD_DIV1;
 
    TIM_TimeBaseInit(TIM1, &TIMER_InitStructure1);
 
    TIMER_OCInitStructure1.TIM_OCMode =TIM_OCMode_Toggle;//TIM_OCMode_Toggle
    TIMER_OCInitStructure1.TIM_OutputState = TIM_OutputState_Enable;
    TIMER_OCInitStructure1.TIM_OutputNState = TIM_OutputNState_Disable;
    TIMER_OCInitStructure1.TIM_Pulse = 0;//TIM1->CCR3 = TIM1->ARR/ 2;  ставил разные значения на заполнение не влияет,     
// длит имп всегда примерно равна длительности паузы , оставил 0
    TIMER_OCInitStructure1.TIM_OCPolarity =TIM_OCPolarity_High;
    TIMER_OCInitStructure1.TIM_OCNPolarity = TIM_OCPolarity_High;
    TIMER_OCInitStructure1.TIM_OCIdleState =TIM_OCIdleState_Reset;
    TIMER_OCInitStructure1.TIM_OCNIdleState = TIM_OCIdleState_Reset;
 
    TIM_OC3Init(TIM1, &TIMER_OCInitStructure1);//Initializes the TIMx Channel3 according to the specified parameters in     
//the TIM_OCInitStruct.

    TIM_BDTRInitStruct1.TIM_OSSRState = TIM_OSSRState_Disable;
    TIM_BDTRInitStruct1.TIM_OSSIState = TIM_OSSIState_Disable;
    TIM_BDTRInitStruct1.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    TIM_BDTRInitStruct1.TIM_DeadTime = 0x00;
    TIM_BDTRInitStruct1.TIM_Break = TIM_Break_Disable;
    TIM_BDTRInitStruct1.TIM_BreakPolarity = TIM_BreakPolarity_Low;
    TIM_BDTRInitStruct1.TIM_AutomaticOutput= TIM_AutomaticOutput_Enable;//TIM_AutomaticOutput_Disable

    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct1);

    TIM_ARRPreloadConfig(TIM1, ENABLE);//TIM1->CR1 |= TIM_CR1_ARPE

    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
    TIM_Cmd(TIM1, ENABLE);//TIM1->CR1 |= TIM_CR1_CEN 
    }

 

 

Изменено пользователем haker_fox
Длинный код нужно прятать под спойлер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спрошу здесь чтобы не плодить подобных тем. Хотелось бы задавать значение периода и чтобы с заданным периодом формировались импульсы (нужной одной и той же длительности) чтобы транзисторами полу-моста управлять (как на рисунке) естественно аппаратно. Можно это как то реализовать на таймерах STM  ?

er.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, aske1 сказал:

Можно это как то реализовать на таймерах STM  ?

У STM есть специальные таймеры - Advanced-control timers, которые могут аппаратно формировать мёртвое время, чтоб оба транзистора не были открыты одновременно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dOb сказал:

У STM есть специальные таймеры - Advanced-control timers, которые могут аппаратно формировать мёртвое время, чтоб оба транзистора не были открыты одновременно.

К сожалению исходя из  требуемого шага и максимального времени счета похоже мне требуются 32-х битные счетчики. Да и я не понял можно ли у продвинутых это мертвое время регулировать, мне же потребуется для каждого периода его новое рассчитывать и задавать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, aske1 сказал:

можно ли у продвинутых это мертвое время регулировать

Конечно можно.

 

27 минут назад, aske1 сказал:

мне требуются 32-х битные счетчики

Некоторые STM32 (например STM32H7xx) имеют HRTIM с бОльшими возможностями

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, aske1 сказал:

 можно ли у продвинутых это мертвое время регулировать, мне же потребуется для каждого периода его новое рассчитывать и задавать.

Зачем??? Неужто думаете, что параметры ваших силовых транзисторов будут меняться по ходу работы устройства???  :shok:

1 час назад, EdgeAligned сказал:

Некоторые STM32 (например STM32H7xx) имеют HRTIM с бОльшими возможностями

А некоторые не-STM имеют нормальные 32-битные таймеры. Хотя... разве кто-то догадывается, что существует что-то кроме STM?  :wink:

ЗЫ: И интересно - что задача такая, что ШИМ с разрешением 16 бит - мало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, aske1 said:

чтобы транзисторами полу-моста управлять (как на рисунке) естественно аппаратно. Можно это как то реализовать на таймерах STM  ?

Скорее всего нет. Там мертвое время только для комплементарных выходов работающих в противофазе. Для полумоста, вам нужна задержка между верхним и нижним транзистором. Это если без HRTIM, у последних обычно есть специальные задержки для этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 часов назад, jcxz сказал:

Зачем??? Неужто думаете, что параметры ваших силовых транзисторов будут меняться по ходу работы устройства???  :shok:

По мере изменения величины выходного напряжения будет меняться интервал протекания  тока через транзистор. Если оставлять импульсы запуска длиннее чем длительность протекания полуволны тока через транзистор возможно ничего плохого не произойдет,но появятся условия для возникновения  авто-колебаний, возможно они не прекратятся до включения следующего транзистора.    

 

18 часов назад, jcxz сказал:

 Хотя... разве кто-то догадывается, что существует что-то кроме STM?  :wink:

из меня такой себе программист, по каким чипам инфу можно найти с примерами с теми и дружба 

 

18 часов назад, jcxz сказал:

И интересно - что задача такая, что ШИМ с разрешением 16 бит - мало?

У нас чим. Надо регулировать мощность с определенным шагом и в определенных пределах , мощность нелинейная ф-я от частоты работы преобразователя. Чтобы обеспечить нужный шаг изменения мощности дискрета по времени д.б. порядка 50нс. Чтобы обеспечить изменение мощности в заданных пределах  частота должна изменяться от 100Гц до нескольких 10-ков кГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, aske1 сказал:

По мере изменения величины выходного напряжения будет меняться интервал протекания  тока через транзистор. Если оставлять импульсы запуска длиннее чем длительность протекания полуволны тока через транзистор возможно ничего плохого не произойдет,но появятся условия для возникновения  авто-колебаний, возможно они не прекратятся до включения следующего транзистора.

Какая-то каша у вас.... какие автоколебания? какая связь между протеканием тока нагрузки через транзистор и dead-time??

Dead-time нужен чтобы два ключа (верхний и нижний) не были открыты одновременно. Чтобы они не замкнули накоротко источник питания. Поэтому - величина dead-time зависит от характеристик ключевых транзисторов (от макс. длительности их включения + выключения), а не от токов нагрузки или каких-то "автоколебаний".

Подтяните теорию управления силовыми ключами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Какая-то каша у вас.... какие автоколебания? какая связь между протеканием тока нагрузки через транзистор и dead-time??

Dead-time нужен чтобы два ключа (верхний и нижний) не были открыты одновременно. Чтобы они не замкнули накоротко источник питания. Поэтому - величина dead-time зависит от характеристик ключевых транзисторов (от макс. длительности их включения + выключения), а не от токов нагрузки или каких-то "автоколебаний".

Подтяните теорию управления силовыми ключами.

Я наверно плохо выразился. Я говорю, что мы обычно в силу присутствия в силовой схеме реактивных элементов, чтобы не возникало колебаний снимаем импульс запуска с транзистора значительно раньше чем того бы требовал параметр dead-time, обеспечивающий отсутствие сквозного тока через оба транзистора полумоста. После того как ток через 0 перешел или немного до этого или близко к этому. Соответственно приходится паузу менять между включенным состоянием транзистора довольно в широких пределах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, aske1 сказал:

снимаем импульс запуска с транзистора значительно раньше чем того бы требовал параметр dead-time, обеспечивающий отсутствие сквозного тока через оба транзистора полумоста. После того как ток через 0 перешел или немного до этого или близко к этому. Соответственно приходится паузу менять между включенным состоянием транзистора довольно в широких пределах.

Так и не понял - зачем его менять-то??? dead-time. Динамически. Установили const значение, вычисленное из характеристик транзистора и забыли. Характеристики транзистора ведь постоянные.

Да - время переключения транзистора несколько зависит ещё и от напряжения питания, но оно ведь вам тоже известно заранее? А значит тоже можно считать константой. Максимальное напряжение питания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 час назад, jcxz сказал:

Так и не понял - зачем его менять-то??? dead-time. Динамически. Установили const значение, вычисленное из характеристик транзистора и забыли. Характеристики транзистора ведь постоянные.

Да - время переключения транзистора несколько зависит ещё и от напряжения питания, но оно ведь вам тоже известно заранее? А значит тоже можно считать константой. Максимальное напряжение питания.

Я понял что вы имеете ввиду, предложение хорошее использовать комплиментарные выхода с dead-time. Но не прокатывает в данном случае не зависимо от того прав я или нет насчет того, что надо или не надо менять это время потому что не нашел я у 32-битных счетчиков комплиментарных выходов с dead-time. HRTIM на сколько я понял тоже только на 16 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...