Ср июл 06, 2016 11:27:42
Ср июл 06, 2016 17:06:38
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);
}
Чт июл 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);
}
Пт ноя 11, 2016 20:27:43
RusikOk писал(а):используется только один таймер.
Пт ноя 11, 2016 21:43:58
Вт авг 08, 2017 16:24:00
Вт авг 08, 2017 16:43:46
Не, смысла нет в этом. Но я так тоже делал, а потом посчитал и оказалось что до 20 градусов задержки открытия мощность практические не теряется, а 20 градусов это прилично.AVPD писал(а):Управление при 100 (почти 100 изза защитных интервалов) % получается не коротким импульсом, а в почти весь полупериод.
Ср авг 09, 2017 08:47:56
Не, смысла нет в этом. Но я так тоже делал, а потом посчитал и оказалось что до 20 градусов задержки открытия мощность практические не теряется, а 20 градусов это прилично.AVPD писал(а):Управление при 100 (почти 100 изза защитных интервалов) % получается не коротким импульсом, а в почти весь полупериод.
Ср авг 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;
....
....
Чт авг 10, 2017 07:12:29
Чт авг 10, 2017 22:00:22
Пт авг 11, 2017 06:52:45
Пт авг 11, 2017 08:13:57
Пт авг 11, 2017 10:24:07
Если завис, нагрузку нужно выключить, что автоматически произойдет если таймер работает в режиме One Pulse с программным запуском.RusikOk писал(а): когда контроллер подвиснет
Пт авг 11, 2017 10:45:02
Очень даже не факт. Зависнуть можно, например, в низко приоритетном прерывании и функция диммирования может остаться в работе. Так что, если думать о возможном зависании (и прочих нештатных ситуёвин), нужно реализовывать какой-то супервизор или не парится об этом совсем.Мурик писал(а):автоматически произойдет если таймер работает в режиме One Pulse с программным запуском.
Пт авг 11, 2017 11:52:54
Пт авг 11, 2017 11:54:19
Пт авг 11, 2017 11:59:10
"Чтобы забивать гнутные гвозди, нужен гнутый молоток"Мурик писал(а):Для криво написанного кода придумали собаку.
Пт авг 11, 2017 13:56:36
Третий ответ в этой теме от vastani - имеет верное решение. dr.doc - аналогично.
Необходима синхронизация с частотой сети - для исключения помех из сети, и исключения генерации помех самим регулятором.
stm может зависнуть при исправном коде - сбой на уровне периферии.
Я в другом проекте сделал тоже от одного таймера. Только запускается таймер не от прерывания, а от внешнего события и если задержку поправлять не надо, то программа не участвует в формировании управляющего импульса совсем.
Пт авг 11, 2017 17:04:34