Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 11:27:42

Нормально все dosikus расписюлил :beer: . Все стало на свои места. Я когда разбирался с таймерам смотрел на схему таймеров. Там написано, что таймер тактируется от Internal Clock. Я решил что это частота ядра (а по факту опять случайное совпадение по частоте), хотя там же подписано TIMx CLK from RCC.
Поглядите, шина работает на своей допустимой частоте, CLK таймера умножается на 2.

Re: фазоимпульсное управление на таймерах STM32

Ср июл 06, 2016 17:06:38

и когда уже начнут писать datasheet-ы на русском))))

запускаю в режме ШИМ все работает и сихронизируется от детектора нуля. только вот может запрыгивать в следующий полупериод
Код:
void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7200;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 100;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim2);

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_ETRF;
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 75;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);

}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
   
        if(HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3) != HAL_OK)
          printf("\r\nrror -> HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3)");

        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        printf("\r\nOK");

  while(1);
}
запускаю в режме одиночного запуска ничего не работает. может я что то не так делаю ткните носом
Код:
void MX_TIM2_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7200;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 100;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim2);

  HAL_TIM_OnePulse_Init(&htim2, TIM_OPMODE_SINGLE);

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  sSlaveConfig.InputTrigger = TIM_TS_ETRF;
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim2, &sSlaveConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 75;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);

}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM2_Init();
   
        if(HAL_TIM_OnePulse_Start(&htim2, TIM_CHANNEL_3) != HAL_OK)
          printf("\r\nerror -> HAL_TIM_OnePulse_Start(&htim2, TIM_CHANNEL_3)");

        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        printf("\r\nOK");

  while(1);
}

Re: фазоимпульсное управление на таймерах STM32

Чт июл 07, 2016 17:47:12

ночь в обнимку с осциллографом не прошла даром :)) :)) :)) . представляю инициализацию таймера для фазоимпульсного управления. используется только один таймер.
Код:
void MX_TIM1_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 360;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 1300;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  HAL_TIM_Base_Init(&htim1);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim1);

  HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE);

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
  sSlaveConfig.InputTrigger = TIM_TS_ETRF;
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_INVERTED;
  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  sSlaveConfig.TriggerFilter = 0;
  HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);

  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 1298;   // учитывается длинна импульса
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4);

}

Re: фазоимпульсное управление на таймерах STM32

Пт ноя 11, 2016 20:27:43

RusikOk писал(а):используется только один таймер.

Делал я недавно полууправляемый выпрямитель. СИФУ я реализовал на трёх таймерах. Один из таймеров - Systick, его я использовал для формирования угла открытия тиристоров. Второй таймер в режиме захвата по детектору нуля расчитывал период и направление вращение фаз, он же запускал СИФУ. Третий таймер в режиме ШИМ управлял тиристорами. Время открытия тиристоров регулировал регистрами CCP CCP1 (контроллер аля Миландр).

Re: фазоимпульсное управление на таймерах STM32

Пт ноя 11, 2016 21:43:58

Делал фазовый регулятор на PIC16. Измерял несколько периодов сетевого напряжения, высчитывал среднее значение. Это среднее делил на 2. Для хорошего регулирования ограничивал угол открытия симистора по 5% от полученного значения полупериода. В противном случае имело место быть перерегулирование (скачек в след. полупериод) и редкий пропуск полуволны.
Работа строилась на одном таймере. При синхронизации в таймер пишется сумма 5% + необходимый угол открытия. По прерыванию запускается этот же таймер на фиксированную длительность импульса. В след. прерывании таймера выполняется запуск на полупериод минус длительность открывающего импульса. Код довольно объемный, но работает красиво. Плюс - абсолютный пофигизм к частоте питающей сети.

Re: фазоимпульсное управление на таймерах STM32

Вт авг 08, 2017 16:24:00

Я делал управление симистором диммера на одном таймере. Симистор управлялся оптопарой 3052, Таймер 2 в режиме PWM и генерации одного импульса. Детектор ноля подавал на аппаратное прерывание. Функция обработчика прерывания запускала таймер каждый раз по переходу через ноль. Для изменения задержки менял регистр ССR.
Значением в ARR задавал немного меньше полпериода, для защиты от перескока на следующий. Выключаю нагрузку запретом/отключением прерывания.
Работает вполне нормально. Управление при 100 (почти 100 изза защитных интервалов) % получается не коротким импульсом, а в почти весь полупериод. Возможно это энергетически не оптимально, но вполне себе просто и работает.

Re: фазоимпульсное управление на таймерах STM32

Вт авг 08, 2017 16:43:46

Я в другом проекте сделал тоже от одного таймера. Только запускается таймер не от прерывания, а от внешнего события и если задержку поправлять не надо, то программа не участвует в формировании управляющего импульса совсем.

AVPD писал(а):Управление при 100 (почти 100 изза защитных интервалов) % получается не коротким импульсом, а в почти весь полупериод.
Не, смысла нет в этом. Но я так тоже делал, а потом посчитал и оказалось что до 20 градусов задержки открытия мощность практические не теряется, а 20 градусов это прилично.

Re: фазоимпульсное управление на таймерах STM32

Ср авг 09, 2017 08:47:56

Я в другом проекте сделал тоже от одного таймера. Только запускается таймер не от прерывания, а от внешнего события и если задержку поправлять не надо, то программа не участвует в формировании управляющего импульса совсем.



AVPD писал(а):Управление при 100 (почти 100 изза защитных интервалов) % получается не коротким импульсом, а в почти весь полупериод.
Не, смысла нет в этом. Но я так тоже делал, а потом посчитал и оказалось что до 20 градусов задержки открытия мощность практические не теряется, а 20 градусов это прилично.



Можно поподробнее, я только начал изучать контроллеры, и не понял что за "внешнее событие". Что это физически?

Да, обычно так и делают. У меня тоже получается около 1 мс съедается на защитные интервалы в начале и в конце полупериода.

Re: фазоимпульсное управление на таймерах STM32

Ср авг 09, 2017 15:14:08

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

Вот настройка таймера для моего "диммера", я ее неполную выкладываю, только то что должно Вас заинтересовать по данном вопросу.
Код:
//затактируем Таймер2 (36 МГц*2)
      RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;

          ...
               ...
      //----------

      //слайв мод регистр запуск от ETR
      TIM2->SMCR=
            //TIM_SMCR_ETP|   //ETR полярность, спад в данном случае
            TIM_SMCR_TS|   //ETR включен
            TIM_SMCR_SMS_2|TIM_SMCR_SMS_1|   //110: Trigger Mode - The counter starts at a rising edge of the trigger
                  0;
               ....
               ....


При событии фронт на лапе TIM2_CH1_ETR , таймер получает пинок старта аппаратно.

Re: фазоимпульсное управление на таймерах STM32

Чт авг 10, 2017 07:12:29

Например для таймера можно выбрать источник события и реакцию его на это событие
у меня тоже по этому принципу реализвано

Re: фазоимпульсное управление на таймерах STM32

Чт авг 10, 2017 22:00:22

Третий ответ в этой теме от vastani - имеет верное решение. dr.doc - аналогично.
Необходима синхронизация с частотой сети - для исключения помех из сети, и исключения генерации помех самим регулятором.

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 06:52:45

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

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 08:13:57

Третий ответ в этой теме от vastani - имеет верное решение. dr.doc - аналогично.
тоесть Вы считаете когда контроллер подвиснет то пропусков синхронизации не будет?
ИМХО аппаратно все же надежнее и проще

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 10:24:07

RusikOk писал(а): когда контроллер подвиснет
Если завис, нагрузку нужно выключить, что автоматически произойдет если таймер работает в режиме One Pulse с программным запуском.

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 10:45:02

Мурик писал(а):автоматически произойдет если таймер работает в режиме One Pulse с программным запуском.
Очень даже не факт. Зависнуть можно, например, в низко приоритетном прерывании и функция диммирования может остаться в работе. Так что, если думать о возможном зависании (и прочих нештатных ситуёвин), нужно реализовывать какой-то супервизор или не парится об этом совсем.

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 11:52:54

Для криво написанного кода придумали собаку.
Последний раз редактировалось Мурик Пт авг 11, 2017 11:54:41, всего редактировалось 2 раз(а).

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 11:54:19

нужно реализовывать какой-то супервизор или не парится об этом совсем.

stm может зависнуть при исправном коде - сбой на уровне периферии. В этом случае выручает сорвавшийся с цепи собака, которая кусает ресет. У st чипов есть целая псарня для таких случаев, не все собаки кусают насмерть - но всегда очень больно.
Две собаки wwdg и iwdg - только для ресета. Прерывания по ошибкам шины данных, защиты данных, сбой pll блоков, и по сбою линий связи. Кроме того на самой периферии есть собственные обработчики ошибок в огромном ассортименте.
Критическими считаются собака IWDG, и прерывание BusFault_IRQn - после них свет гаснет. Всё остальное можно дополнительно обработать перед выключением света. Это бывает полезным и необходимым, например переключение важных ног мк в нужное положение, и даже выдержка их в подобном состоянии.

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

Ошибки программной части исправить во время работы нельзя.
Например один дурик использовал ацп для перехода по абсолютным адресам (опрос кнопок). Такие пациенты уже неизлечимы.

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 11:59:10

Мурик писал(а):Для криво написанного кода придумали собаку.
"Чтобы забивать гнутные гвозди, нужен гнутый молоток"

Не понимаю почему тема по таймерам для диммера переходит в описание работы собак и при чем тут куб? :dont_know:

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 13:56:36

Третий ответ в этой теме от vastani - имеет верное решение. dr.doc - аналогично.
Необходима синхронизация с частотой сети - для исключения помех из сети, и исключения генерации помех самим регулятором.

Избавляйтесь от АВРовских привычек, как от вредных.
stm может зависнуть при исправном коде - сбой на уровне периферии.

Нонсенс! Это уже не исправный код, а кривой до не могу.

========
Самое правильное решение, ведь таймер по любому используется. Так почему его не задействовать как положено, а не с лишними извращениями?
Я в другом проекте сделал тоже от одного таймера. Только запускается таймер не от прерывания, а от внешнего события и если задержку поправлять не надо, то программа не участвует в формировании управляющего импульса совсем.

Re: фазоимпульсное управление на таймерах STM32

Пт авг 11, 2017 17:04:34

Избавляйтесь от АВРовских привычек, как от вредных.

Это не привычка, это алгоритм синхронизации с сетью. Он не зависит от используемого мк.
Например есть нагрузка, которой может резко стать плохо от стартового номинального напряжения. Это банальный коллекторный двигатель на пол киловатта с постоянными магнитами. Такие устанавливаются в тренажеры, в детские машинки и так далее. Везде где требуется динамическое торможение и малые габариты.
Если на такой двигатель сразу подать полное напряжение, его ток возрастёт примерно в 300 раз от номинала. Отчего его ресурс будет резко сокращаться.

У вас проскочила бяка по сети, и мк уверенно поймал ноль через помеху - в этом случае двигатель получит хороший пинок под зад. А если оный установлен на беговой дорожке - то человек с большой вероятностью упадёт. А потом суд, финансы...
Включение мощного трансформатора не стой ноги - бросок тока.
Переключение нагрузки с сети на ups без синхронизации - к красивому фейерверку.
Есть масса примеров кривых алгоритмов, лечится собственным рублём.

Чип st может зависнуть, так как он хоть чем-то но управляет. В этом случае импульсная помеха может исказить внешние данные, или даже нарушить его питание.
От прямого попадания молнии - защиты не существует. Но и оставлять линии вовсе без защиты - себе дороже. Баланс между маниакальностью и пофигизмом - ценность самого прибора и устройства в целом. Для каждого случая свой баланс, но не использовать ресурсы мк по прямому назначению - это просто глупо.
Ответить