2021-08-24 07:07 AM
i am trying to switch a relay via the stm8s001 processor synchronously in the 0 pass. how could I realize that.
i have an imput signal of 50 Hz. I can also start the timer, but I don't know how to switch the relay on exactly in the 0 cycle.
(i watch the action on the oscilloscope).
The Code.:
main.c .:
(only the most important areas)
##################################################################
void main(void)
{
CONFIG_UNUSED_PINS_STM8S001;
//STARTUP_SWIM_DELAY_5S;
GPIO_Config();
CLK_Config();
TIMER_Config();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_RISE_ONLY);
enableInterrupts();
while(1)
{
if (flagfortimer == 1 )
{
GPIO_WriteReverse(GPIOA, GPIO_PIN_3);
flagfortimer = 0;
}
}
}
static void TIMER_Config(void)
{
TIM1_DeInit();
TIM1_TimeBaseInit(1, TIM1_COUNTERMODE_UP,1,0); how is the dimensioning here ???
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
TIM1_Cmd(ENABLE);
}
#############################################################
interrupt_vector :
{0x82, EXTI_PORTD_IRQHandler}, /* irq6 */
.........
{0x82, TIM1_UPD_OVF_TRG_BRK_IRQHandler}, /* irq11 */
#############################################################
interrupt routine
##############################################################
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) // here is my input of 50 Hz on Pin D6
{
if(GPIO_ReadInputPin(GPIOD , GPIO_PIN_6))
{
timer1start = 1;
}
}
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
if (timer1start == 1)
{
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
flagfortimer = 1;
timer1start = 0;
}
}
###############################################################
2021-08-25 06:47 AM
Here you need to know your setup. Do you use an external zero crossing detector, or a pin through a R-C directly? What's your signal? What's the relay's switch time?
You need to figure out these things first, some basic theory, than you'll see things get quite simple...