aske1 0 29 ноября, 2023 Опубликовано 29 ноября, 2023 (изменено) · Жалоба Спасибо всем за помощь. Наверняка есть что то лишнее, не совсем правильное и не нужное, но решить задачу в итоге мне помогла вот такая функция инициализации: 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 } Изменено 30 ноября, 2023 пользователем haker_fox Длинный код нужно прятать под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба Спрошу здесь чтобы не плодить подобных тем. Хотелось бы задавать значение периода и чтобы с заданным периодом формировались импульсы (нужной одной и той же длительности) чтобы транзисторами полу-моста управлять (как на рисунке) естественно аппаратно. Можно это как то реализовать на таймерах STM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dOb 10 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба 3 минуты назад, aske1 сказал: Можно это как то реализовать на таймерах STM ? У STM есть специальные таймеры - Advanced-control timers, которые могут аппаратно формировать мёртвое время, чтоб оба транзистора не были открыты одновременно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба 1 час назад, dOb сказал: У STM есть специальные таймеры - Advanced-control timers, которые могут аппаратно формировать мёртвое время, чтоб оба транзистора не были открыты одновременно. К сожалению исходя из требуемого шага и максимального времени счета похоже мне требуются 32-х битные счетчики. Да и я не понял можно ли у продвинутых это мертвое время регулировать, мне же потребуется для каждого периода его новое рассчитывать и задавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 83 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба 27 минут назад, aske1 сказал: можно ли у продвинутых это мертвое время регулировать Конечно можно. 27 минут назад, aske1 сказал: мне требуются 32-х битные счетчики Некоторые STM32 (например STM32H7xx) имеют HRTIM с бОльшими возможностями 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба 2 часа назад, aske1 сказал: можно ли у продвинутых это мертвое время регулировать, мне же потребуется для каждого периода его новое рассчитывать и задавать. Зачем??? Неужто думаете, что параметры ваших силовых транзисторов будут меняться по ходу работы устройства??? 1 час назад, EdgeAligned сказал: Некоторые STM32 (например STM32H7xx) имеют HRTIM с бОльшими возможностями А некоторые не-STM имеют нормальные 32-битные таймеры. Хотя... разве кто-то догадывается, что существует что-то кроме STM? ЗЫ: И интересно - что задача такая, что ШИМ с разрешением 16 бит - мало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex-lab 6 25 декабря, 2023 Опубликовано 25 декабря, 2023 · Жалоба 5 hours ago, aske1 said: чтобы транзисторами полу-моста управлять (как на рисунке) естественно аппаратно. Можно это как то реализовать на таймерах STM ? Скорее всего нет. Там мертвое время только для комплементарных выходов работающих в противофазе. Для полумоста, вам нужна задержка между верхним и нижним транзистором. Это если без HRTIM, у последних обычно есть специальные задержки для этого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 26 декабря, 2023 Опубликовано 26 декабря, 2023 · Жалоба 17 часов назад, jcxz сказал: Зачем??? Неужто думаете, что параметры ваших силовых транзисторов будут меняться по ходу работы устройства??? По мере изменения величины выходного напряжения будет меняться интервал протекания тока через транзистор. Если оставлять импульсы запуска длиннее чем длительность протекания полуволны тока через транзистор возможно ничего плохого не произойдет,но появятся условия для возникновения авто-колебаний, возможно они не прекратятся до включения следующего транзистора. 18 часов назад, jcxz сказал: Хотя... разве кто-то догадывается, что существует что-то кроме STM? из меня такой себе программист, по каким чипам инфу можно найти с примерами с теми и дружба 18 часов назад, jcxz сказал: И интересно - что задача такая, что ШИМ с разрешением 16 бит - мало? У нас чим. Надо регулировать мощность с определенным шагом и в определенных пределах , мощность нелинейная ф-я от частоты работы преобразователя. Чтобы обеспечить нужный шаг изменения мощности дискрета по времени д.б. порядка 50нс. Чтобы обеспечить изменение мощности в заданных пределах частота должна изменяться от 100Гц до нескольких 10-ков кГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 26 декабря, 2023 Опубликовано 26 декабря, 2023 · Жалоба 37 минут назад, aske1 сказал: По мере изменения величины выходного напряжения будет меняться интервал протекания тока через транзистор. Если оставлять импульсы запуска длиннее чем длительность протекания полуволны тока через транзистор возможно ничего плохого не произойдет,но появятся условия для возникновения авто-колебаний, возможно они не прекратятся до включения следующего транзистора. Какая-то каша у вас.... какие автоколебания? какая связь между протеканием тока нагрузки через транзистор и dead-time?? Dead-time нужен чтобы два ключа (верхний и нижний) не были открыты одновременно. Чтобы они не замкнули накоротко источник питания. Поэтому - величина dead-time зависит от характеристик ключевых транзисторов (от макс. длительности их включения + выключения), а не от токов нагрузки или каких-то "автоколебаний". Подтяните теорию управления силовыми ключами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 26 декабря, 2023 Опубликовано 26 декабря, 2023 · Жалоба 1 час назад, jcxz сказал: Какая-то каша у вас.... какие автоколебания? какая связь между протеканием тока нагрузки через транзистор и dead-time?? Dead-time нужен чтобы два ключа (верхний и нижний) не были открыты одновременно. Чтобы они не замкнули накоротко источник питания. Поэтому - величина dead-time зависит от характеристик ключевых транзисторов (от макс. длительности их включения + выключения), а не от токов нагрузки или каких-то "автоколебаний". Подтяните теорию управления силовыми ключами. Я наверно плохо выразился. Я говорю, что мы обычно в силу присутствия в силовой схеме реактивных элементов, чтобы не возникало колебаний снимаем импульс запуска с транзистора значительно раньше чем того бы требовал параметр dead-time, обеспечивающий отсутствие сквозного тока через оба транзистора полумоста. После того как ток через 0 перешел или немного до этого или близко к этому. Соответственно приходится паузу менять между включенным состоянием транзистора довольно в широких пределах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 26 декабря, 2023 Опубликовано 26 декабря, 2023 · Жалоба 2 часа назад, aske1 сказал: снимаем импульс запуска с транзистора значительно раньше чем того бы требовал параметр dead-time, обеспечивающий отсутствие сквозного тока через оба транзистора полумоста. После того как ток через 0 перешел или немного до этого или близко к этому. Соответственно приходится паузу менять между включенным состоянием транзистора довольно в широких пределах. Так и не понял - зачем его менять-то??? dead-time. Динамически. Установили const значение, вычисленное из характеристик транзистора и забыли. Характеристики транзистора ведь постоянные. Да - время переключения транзистора несколько зависит ещё и от напряжения питания, но оно ведь вам тоже известно заранее? А значит тоже можно считать константой. Максимальное напряжение питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aske1 0 27 декабря, 2023 Опубликовано 27 декабря, 2023 · Жалоба 21 час назад, jcxz сказал: Так и не понял - зачем его менять-то??? dead-time. Динамически. Установили const значение, вычисленное из характеристик транзистора и забыли. Характеристики транзистора ведь постоянные. Да - время переключения транзистора несколько зависит ещё и от напряжения питания, но оно ведь вам тоже известно заранее? А значит тоже можно считать константой. Максимальное напряжение питания. Я понял что вы имеете ввиду, предложение хорошее использовать комплиментарные выхода с dead-time. Но не прокатывает в данном случае не зависимо от того прав я или нет насчет того, что надо или не надо менять это время потому что не нашел я у 32-битных счетчиков комплиментарных выходов с dead-time. HRTIM на сколько я понял тоже только на 16 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться