2017-09-06 01:27 PM
hi everyone,
I'm trying to generate a square wave / quadrature signal ( 2 square wave with 90 degrees offset). The board is a STM32F103C8
The goal of the project will be to send an exact number of pulse. Frequency will stay the same. I will have to be able to switch the direction of the signal such as a quadrature encoder.
Right now, I just want to have a clean quadrature signal. My code is not complicated at the moment and here are the 2 mains functions in order to initialize the timer:void init_SW()
{ GPIO_InitTypeDef GPIO_InitStruct; // Step 1: Initialize GPIO as input for rotary encoder // PB7 (TIM4_CH2) (encoder pin A), PB6 (TIM4_CH1) (encoder pin B) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); // Step 2: Setup TIM4 for encoder inputRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit (&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 3; TIM_TimeBaseStructure.TIM_Prescaler = 0; // TIM_Cmd(TIM4, ENABLE); TIM_TimeBaseInit (TIM4, &TIM_TimeBaseStructure); TIM4->CCER;}void timer_ccr_init (void){ TIM_OCInitTypeDef TIM_OCInitStructure; /* always initialise local variables before use */ TIM_OCStructInit (&TIM_OCInitStructure); /* Common settings for all channels */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /* Channel1 */ TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC1Init (TIM4, &TIM_OCInitStructure); /* Channel2 - 90 degres after*/ TIM_OCInitStructure.TIM_Pulse = 1; TIM_OC2Init (TIM4, &TIM_OCInitStructure); TIM4->CCER; TIM_Cmd(TIM4, ENABLE);}Right now, my signal is absolutely not square. This is the first time I'm using a timer to generate a signal.
I tried to take what I needed from here
http://www.micromouseonline.com/2016/02/05/clock-pulses-with-variable-phase-stm32/
and adapt but without success right nowThank you for your help
2017-09-07 05:08 AM
I made few changes but my signal is still awful ;(
void init_SW()
{ GPIO_InitTypeDef GPIO_InitStruct; // Step 1: Initialize GPIO // PB7 (TIM4_CH2) (encoder pin A), PB6 (TIM4_CH1) (encoder pin B) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructInit (&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 3; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseInit (TIM4, &TIM_TimeBaseStructure); }void timer_ccr_init (void){ TIM_OCInitTypeDef TIM_OCInitStructure; /* always initialise local variables before use */ TIM_OCStructInit (&TIM_OCInitStructure); /* Common settings for all channels */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; /* Channel1 */ TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC1Init (TIM4, &TIM_OCInitStructure); /* Channel2 - 90 degres after*/ TIM_OCInitStructure.TIM_Pulse = 2; TIM_OC2Init (TIM4, &TIM_OCInitStructure); TIM_Cmd(TIM4, ENABLE);}Any idea?