cancel
Showing results for 
Search instead for 
Did you mean: 

Square wave generation with STM32 and timer

paul sauv
Associate III
Posted on September 06, 2017 at 22:27

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 input

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_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 now

Thank you for your help

1 REPLY 1
paul sauv
Associate III
Posted on September 07, 2017 at 14:08

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?