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

aske1

Участник
  • Постов

    60
  • Зарегистрирован

  • Посещение

Весь контент aske1


  1. прошу прощения за мою тупизну, но я всё-таки уточню:т.е. получается, что по дефолту LDO тоже включен? Т.е. учитывая, что в nucleo по умолчанию подключена первая схема : на Vcap(выход LDO) и на вход LDO подаётся питание с выхода SMPS и LDO, который на новом контроллере изначально включен, от этого не страдает?
  2. А как Вы поступили с тремя выводами Vcap - объединили их? На плате STM32H745 Nucleo я смотрел они соединены вместе. Если их не объединять, то не до конца понятно как два конденсатора 2,2мкФ распределить между 3-мя пинами Vcap.
  3. Здравствуйте! Хочу сделать плату с контроллером STM32H745, запутался в схемах подключения питания. В документации 6 или больше схем как можно подать питание на Vcore используя SMPS или LDO. Решил для себя, что мне нужно максимально просто без всяких SMPS и чтобы не было на плате питаний ниже 3,3В и чтобы частоту можно было максимальной сделать(вроде бы она максимальна только при включенном LDO). Значит получается надо через LDO. Нашел схему и мануал на плату STM32H745 Nucleo на том же контроллере. Там по дефолту почему то схема питания Direct SMPS и сказано, что чтобы поменять одно на другое надо сделать следующие настройки: в main.c в SystemClock_Config прописать для случая “Direct SMPS” (Default): HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);, а для случая “LDO”: HAL_PWREx_ConfigSupply (PWR_LDO_SUPPLY); Ниже привел схемы питания Direct SMPS и LDO. Вопрос не получится ли так, что я сделаю плату для случая питания Vcore от LDO, а у меня потом контроллер не получится прошить, т.к. допустим по умолчанию в новом мк включен SMPS, а LDO выключен? И что делать в таком случае, как подавать питание на Vcore - просто снаружи на конденсатор ножки Vcap (не забыв отключить Vdd =3,3В от Vddldo) ?
  4. Заработало, не понял только почему 1-й импульс Tim1 длительностью меньше, чем все остальные..
  5. Я пытаюсь это через внешний вход сделать TI2FP2 у TIM1 , но т.к. на рисунке написано тоже пробовал и тоже не получилось
  6. Переписал, если я правильно понял принцип то оно должно выглядеть так: static void MX_SLAVE_TIM1_INIT(void) { //Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика). /* set the Timer prescaler to get 1MHz as counter clock */ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /* configure the Timer prescaler */ TIM1->PSC = 9; /* configure the period */ TIM1->ARR = 500-1; /* configure the repetition counter */ // TIM1->RCR = 1; /* configure pulse width */ TIM1->CCR1 = 250 ; /* Select the Clock Division to 1*/ // TIM1->CR1 |= TIM_CLOCKDIVISION; /* Reset clock Division bit field */ TIM1->CR1 &= ~ TIM_CR1_CKD; //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1 TIM1->CCMR1 |=TIM_CCMR1_CC2S_0; //TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5 TIM1->CCMR1 &=~(TIM_CCER_CC2P|TIM_CCER_CC2NP); //Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR //TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера). TIM1->SMCR |=(TIM_SMCR_TS_2|TIM_SMCR_TS_1|TIM_SMCR_SMS_2|TIM_SMCR_SMS_1); //разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1 TIM1->CCMR1 |=(TIM_CCMR1_OC1M_2|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_0); //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0. TIM1->CR1 &=~(TIM_CR1_DIR|TIM_CR1_CMS); // Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode) TIM1->CR1 &=~(TIM_CR1_OPM); /* * Если пользователь хочет вывести сигнал с минимальной задержкой, * то должен быть установлен бит OCxFE в регистре TIMx_CCMRx. * Тогда OCxRef (и OCx) принудительно будут установлены в ответ * на сигнал стимула, без обращения внимания на сравнение. * Новый уровень такой же, как если бы произошло совпадение сравнения. * OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2. * */ TIM1->CCMR1 |=TIM_CCMR1_OC1FE; }
  7. Честно говоря я так и не догнал где во вкладке SFRs брать названия отдельных битов, группы битов там видел например CC2S. Как записать например вот эти строчки с помощью того, что есть в той вкладке? //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1. TIM1->CCMR1 &=~(0x3UL << (8U)); TIM1->CCMR1 |=(0x1UL << (8U));
  8. Здравствуйте! Пытаюсь сделать так, чтобы один таймер STM32f407 TIM2 периодически запускал другой TIM1 и чтобы тот другой на лапке мк формировал импульс заданной длительности. Соответственно у таймера TIM2 взял настроил на выход канал CH1 и соединил его с каналом таймера TIM1 СH2, который настроил на вход, у TIM1 так же канал СH1 настроил на выход. С таймером TIM2 проблем нет. На его CH1 вижу периодически меняющийся сигнал. Проблемы с таймером TIM1 на его канале CH1 импульсов нет, хотя в отладчике вижу, что он считает хотя и как то странно (мне нужен 1 импульс, а он переполняется несколько раз) за время переполнения TIM2. Инициализацию TIM1 приложил. Подскажите пожалуйста что я делаю не так? Вроде всё должно быть просто, а уже столько времени потратил.. static void MX_SLAVE_TIM1_INIT(void) { //Форма импульса OPM определяется записью в регистры сравнения (с учетом тактовой частоты и прескалера счетчика). /* set the Timer prescaler to get 1MHz as counter clock */ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; /* configure the Timer prescaler */ TIM1->PSC = 9; /* configure the period */ TIM1->ARR = 500-1; /* configure the repetition counter */ // TIM1->RCR = 1; /* configure pulse width */ TIM1->CCR1 = 250 ; /* Select the Clock Division to 1*/ // TIM1->CR1 |= TIM_CLOCKDIVISION; /* Reset clock Division bit field */ TIM1->CR1 &= ~ TIM_CR1_CKD; //Отобразите TI2FP2 на TI2 записью CC2S=01 в регистре TIMx_CCMR1. TIM1->CCMR1 &=~(0x3UL << (8U)); TIM1->CCMR1 |=(0x1UL << (8U)); //TI2FP2 должен детектировать положительный перепад, для этого запишите CC2P=0 и CC2NP=0 в регистре TIMx_CCER 7?5 TIM1->CCER &=~(0x1UL << (5U)); TIM1->CCER &=~(0x1UL << (7U)); //Сконфигурируйте TI2FP2 в качестве триггера для контроллера подчиненного режима (TRGI) записью TS=110 в регистре TIMx_SMCR TIM1->SMCR &=~(0x7UL << (4U)); TIM1->SMCR |=(0x6UL << (4U)); //TI2FP2 используется для запуска счетчика путем записи SMS=110 в регистре TIMx_SMCR (режим триггера). TIM1->SMCR &=~(0x7UL << (0U)); TIM1->SMCR |=(0x6UL << (0U)); //разрешите PWM mode 2 записью OC1M=111 в регистре TIMx_CCMR1 TIM1->CCMR1 &=~(0x7UL << (4U)); TIM1->CCMR1 |=(0x7UL << (4U)); //Пользователь может опционально разрешить регистры предзагрузки записью OC1PE=1 в регистре TIMx_CCMR1 и ARPE в регистре TIMx_CR1 //В нашем примере биты DIR и CMS регистра TIMx_CR1 должны быть в лог. 0. TIM1->CR1 &=~(0x1UL << (4U)); TIM1->CR1 &=~(0x3UL << (5U)); // Когда бит OPM в регистре TIMx_CR1 установлен в 0, выбирается режим повторения (Repetitive Mode) TIM1->CR1 &=~(0x1UL << (3U)); /* * Если пользователь хочет вывести сигнал с минимальной задержкой, * то должен быть установлен бит OCxFE в регистре TIMx_CCMRx. * Тогда OCxRef (и OCx) принудительно будут установлены в ответ * на сигнал стимула, без обращения внимания на сравнение. * Новый уровень такой же, как если бы произошло совпадение сравнения. * OCxFE действует только если канал сконфигурирован в режиме PWM1 или PWM2. * */ TIM1->CCMR1 &=~(0x1UL << (2U)); TIM1->CCMR1 |=(0x1UL << (2U));//Output compare 1 fast enable /* Enable the TIM Counter */ // TIM1->CR1 |= TIM_CR1_CEN; } while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ ch1=TIM1->CNT ;//тот что slave ch2= TIM2->CNT ; // мастер ch5=TIM1->SMCR; if(ch1==251){ ch3=ch3+1;//сколько раз slave } if(ch2==999){ ch4=ch4+1;//сколько раз master } }
  9. в errate нашел следующие строки про one pulse mode: One-pulse mode trigger not detected in master-slave reset + trigger configuration Description The failure occurs when several timers configured in one-pulse mode are cascaded, and the master timer is configured in combined reset + trigger mode with the MSM bit set: OPM = 1 in TIMx_CR1, SMS[3:0] = 1000 and MSM = 1 in TIMx_SMCR. The MSM delays the reaction of the master timer to the trigger event, so as to have the slave timers cycleaccurately synchronized. If the trigger arrives when the counter value is equal to the period value set in the TIMx_ARR register, the onepulse mode of the master timer does not work and no pulse is generated on the output. Workaround None. However, unless a cycle-level synchronization is mandatory, it is advised to keep the MSM bit reset, in which case the problem is not правда так и не понял при сочетании каких то особенных обстоятельств не работает этот режим, входит ли мой случай в эти обстоятельства и что за бит msm и как его сбросить и вообще даст ли это что либо..
  10. утилитой Cube programmer или как то так она называется удалось оживить тот мк
  11. Огромное "спасибо", код очень помог в диагностике. После следующей поездки выяснилось, что сброс проходил только от NRST. Соответственно после обрезания лишнего от ножки всё решилось. Теперь при пробоях разрядника наш источник работает как надо, а всё другое оборудование (осциллографы, мониторы и прочее) тухнет и выключаются. Пришли к выводу, что у них заземление в помещении сделано не правильно.
  12. one pulse mod stm32H7 не запускается

    Доброго дня! Есть внешний сигнал, хочу по его фронту формировать импульсы заданной длительности (10мкс - 30мкс). Нарыл в нете, что мне поможет OPM, нашёл похожий пример. Пытаюсь в cube ide сделать это, скрины настроек приложил. Ничего не получается (TIM8_CH1 - не меняется). Внешний сигнал подаю на ножку TIM8_CH2 через резистор 1кОм, Сажусь прямо на неё осц-фом, вижу на ней сигнал очень мелкой амплитуды (как будто она настроена как выход, а не на вход - что тоже странно). Cube ide генерит следующий код инициализации: static void MX_TIM8_Init(void) { /* USER CODE BEGIN TIM8_Init 0 */ /* USER CODE END TIM8_Init 0 */ TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; /* USER CODE BEGIN TIM8_Init 1 */ /* USER CODE END TIM8_Init 1 */ htim8.Instance = TIM8; htim8.Init.Prescaler = 9; htim8.Init.CounterMode = TIM_COUNTERMODE_UP; htim8.Init.Period = 200-1; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.RepetitionCounter = 0; htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim8) != HAL_OK) { Error_Handler(); } if (HAL_TIM_OC_Init(&htim8) != HAL_OK) { Error_Handler(); } if (HAL_TIM_OnePulse_Init(&htim8, TIM_OPMODE_SINGLE) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_TI2FP2; sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; sSlaveConfig.TriggerFilter = 0; if (HAL_TIM_SlaveConfigSynchro(&htim8, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM2;//поменял, так было в примере sConfigOC.Pulse = 5; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_OC_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.BreakFilter = 0; sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; sBreakDeadTimeConfig.Break2Filter = 0; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM8_Init 2 */ /* USER CODE END TIM8_Init 2 */ HAL_TIM_MspPostInit(&htim8); } //запускаю так HAL_TIM_OnePulse_Start(&htim8, TIM_CHANNEL_1); Если кто сталкивался, прошу подсказать что я делаю не так?
  13. Я понял что вы имеете ввиду, предложение хорошее использовать комплиментарные выхода с dead-time. Но не прокатывает в данном случае не зависимо от того прав я или нет насчет того, что надо или не надо менять это время потому что не нашел я у 32-битных счетчиков комплиментарных выходов с dead-time. HRTIM на сколько я понял тоже только на 16 бит.
  14. Я наверно плохо выразился. Я говорю, что мы обычно в силу присутствия в силовой схеме реактивных элементов, чтобы не возникало колебаний снимаем импульс запуска с транзистора значительно раньше чем того бы требовал параметр dead-time, обеспечивающий отсутствие сквозного тока через оба транзистора полумоста. После того как ток через 0 перешел или немного до этого или близко к этому. Соответственно приходится паузу менять между включенным состоянием транзистора довольно в широких пределах.
  15. По мере изменения величины выходного напряжения будет меняться интервал протекания тока через транзистор. Если оставлять импульсы запуска длиннее чем длительность протекания полуволны тока через транзистор возможно ничего плохого не произойдет,но появятся условия для возникновения авто-колебаний, возможно они не прекратятся до включения следующего транзистора. из меня такой себе программист, по каким чипам инфу можно найти с примерами с теми и дружба У нас чим. Надо регулировать мощность с определенным шагом и в определенных пределах , мощность нелинейная ф-я от частоты работы преобразователя. Чтобы обеспечить нужный шаг изменения мощности дискрета по времени д.б. порядка 50нс. Чтобы обеспечить изменение мощности в заданных пределах частота должна изменяться от 100Гц до нескольких 10-ков кГц.
  16. К сожалению исходя из требуемого шага и максимального времени счета похоже мне требуются 32-х битные счетчики. Да и я не понял можно ли у продвинутых это мертвое время регулировать, мне же потребуется для каждого периода его новое рассчитывать и задавать.
  17. Спрошу здесь чтобы не плодить подобных тем. Хотелось бы задавать значение периода и чтобы с заданным периодом формировались импульсы (нужной одной и той же длительности) чтобы транзисторами полу-моста управлять (как на рисунке) естественно аппаратно. Можно это как то реализовать на таймерах STM ?
  18. Вам тоже хорошего настроения! У кого я спрошу вопросы по разработанной Вами схеме: у фрезеровщика дяди Васи? Так он не ответит, да и скорее всего бухает или спит сейчас. Встречал подобную схему на одной из страниц даташитов отдельных источников. Но всё несколько лет работало и без этих компонентов. Я не утверждаю, что они не нужны, просто до определенного момента всё прекрасно работало и без них. Вы меня с кем то путаете. Удачного дня!
  19. Да о тех изделиях. Примерно такой ответ и хотел услышать, видео по трассировке так же понравилось. Ограничители - это в смысле диоды, притянутые к питанию, супрессоры и прочее или что? Не знаю что на это ответить, если бы знал давно бы ответил, наши единичные устройства.., в общем с нас только один раз требовали сертификацию и в протоколе испытаний было написано следующее, не знаю что это даст (не разбираюсь в этом): Источник питания ... соответствует требованиям технического регламента таможенного союза ТР ТС 020/2011: ГОСТ 30804.3.2-2013, ГОСТ 30804.3.3-2013, ГОСТ Р 51317.6.2-2013, ГОСТ Р 51317.6.4-2013 и БИГЮ.4.36237.601ТУ: ГОСТ 30804.4.2-2013, ГОСТ 30804.4.3-2013, ГОСТ 30804.4.4-2013, ГОСТ Р 51317.4.5-99, ГОСТ Р 51317.4.6-99, ГОСТ 30804.4.11-2013, ГОСТ Р 50648-94. Источник питания ... соответствует требованиям технического регламента таможенного союза ТР ТС 020/2011: ГОСТ 30805.22-2013, кроме отдельной частоты 30 МГц, превышение составляет 10 дБ мкВ. А конденсаторы C3, C4 какую функцию выполняют?
  20. Здравствуйте! Делаем высоковольтные источники питания, система управления которых построена на микроконтроллере. Для борьбы с наводками микроконтроллер гальванически отвязан от силовой части (транзисторного преобразователя) оптронами, выходящие из источника медленные входа/выхода отвязаны с помощью реле. Стоит куча dc/dc-преобразователей, питающих все эти отвязанные друг от друга цепи, общие точки dc/dc-преобразователей всех этих цепей висят в воздухе ( не заземлены). В общем схема системы управления похожа на схему на рисунке. Недавно открыли похожий китайский источник: у них гальванических развязок похоже нет или практически нет и dc/dc-преобразователей соответственно тоже не видно. Отсюда вопрос: а так ли они нужны? (оптроны и dc/dc стоят кучу денег, к тому же из за проходной емкости оптроны не всегда спасают от наводок). Прошу поделиться кто как делает?
  21. Спасибо всем за помощь. Наверняка есть что то лишнее, не совсем правильное и не нужное, но решить задачу в итоге мне помогла вот такая функция инициализации:
  22. Т.е. инициализация как то так должна выглядеть?: void timer_1_init() { GPIO_InitTypeDef GPIO_init_time1; RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //тактирование таймера RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//тактирование лапы TIM1_CH3 44-я нога PE13 GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1); GPIO_init_time1.GPIO_Mode = GPIO_Mode_AF; GPIO_init_time1.GPIO_Speed = GPIO_Speed_50MHz; GPIO_init_time1.GPIO_OType = GPIO_OType_PP; GPIO_init_time1.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_init_time1.GPIO_Pin = GPIO_Pin_13; GPIO_Init(GPIOE, &GPIO_init_time1); TIM1->PSC = 0; //делитель-1 TIM1->ARR = 65534; // период -1 TIM1->CCR3 = TIM1->ARR/ 2; //TIM capture/compare register 3 TIM1->CR1 |= TIM_CR1_CEN; //Старт счетчика таймера } И после, когда надо , я просто меняю TIM1->ARR = нужное значение; ? И нигде не надо настраивать чтобы период менялся в моменты окончания счета, а не в произвольные моменты времени?
  23. на HAL примеров много, а на SPL, который используется в моём проекте пока не нашел..
×
×
  • Создать...