STM32f4 board 5V pulse 40kHz frequency

Status
Not open for further replies.

victorrr

Newbie level 4
Joined
Feb 11, 2015
Messages
6
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
42
Hello, I modified the following program to get a 5V pulse at a frequency of 40kHz. I tried it in an oscilloscope and I get a 4 V pulse and 12,8 kHz of frequency. Can you help me?

Code:
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_tim.h"

void TM_LEDS_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;

    /* Clock for GPIOA */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    */
    /* Alternating functions for pins */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM13);

    /* Set pins */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void TM_TIMER_Init(void) {
    TIM_TimeBaseInitTypeDef TIM_BaseStruct;

    /* Enable clock for TIM13 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);

/*
    Set timer prescaler
    Timer count frequency is set with

    timer_tick_frequency = Timer_default_frequency / (prescaller_set + 1)

    In our case, we want a max frequency for timer, so we set prescaller to 0
    And our timer will have tick frequency

    timer_tick_frequency = 84000000 / (0 + 1) = 84000000
*/
    TIM_BaseStruct.TIM_Prescaler = 0; 
    /* Count up */
    TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
/*
    Set timer period when it have reset
    First you have to know max value for timer
    In our case it is 16bit = 65535
    To get your frequency for PWM, equation is simple

    PWM_frequency = timer_tick_frequency / (TIM_Period + 1)

    If you know your PWM frequency you want to have timer period set correct

    TIM_Period = timer_tick_frequency / PWM_frequency - 1

    In our case, for 40Khz PWM_frequency, set Period to

    TIM_Period = 84000000 / 40000 - 1 = 2099

    If you get TIM_Period larger than max timer value (in our case 65535),
    you have to choose larger prescaler and slow down timer tick frequency
*/
    TIM_BaseStruct.TIM_Period = 2099; /* 10kHz PWM */
    TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_BaseStruct.TIM_RepetitionCounter = 0;
    /* Initialize TIM13 */
    TIM_TimeBaseInit(TIM13, &TIM_BaseStruct);
    /* Start count on TIM13 */
    TIM_Cmd(TIM13, ENABLE);
}

void TM_PWM_Init(void) {
    TIM_OCInitTypeDef TIM_OCStruct;

    /* Common settings */

    /* PWM mode 2 = Clear on compare match */
    /* PWM mode 1 = Set on compare match */
    TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;

/*
    To get proper duty cycle, you have simple equation

    pulse_length = ((TIM_Period + 1) * DutyCycle) / 100 - 1

    where DutyCycle is in percent, between 0 and 100%

    50% duty cycle:     pulse_length = ((2099 + 1) * 50) / 100 - 1 = 1049


    Remember: if pulse_length is larger than TIM_Period, you will have output HIGH all the time
*/
    TIM_OCStruct.TIM_Pulse = 1049; /* 50% duty cycle */
    TIM_OC1Init(TIM13, &TIM_OCStruct);
    TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
}

int main(void) {
    /* Initialize system */
    SystemInit();
    /* Init leds */
    TM_LEDS_Init();
    /* Init timer */
    TM_TIMER_Init();
    /* Init PWM */
    TM_PWM_Init();

    while (1) {

    }
}
 

well, without seeing the board, or even some data about it, I think the 4v could be a very common drop from a 5V USB+protection diode supply... (that if the waveform is square), also if you are driving some low impedance circuit (led? drive?) you can expect some voltage drop. (disconnect everything except the oscilloscope form the pin and check again) but aren this microcontroller in 3.3 or lower voltages?

for the frequency... it seems you code expect a system clock of 84MHz, sooo, how are you getting 84MHz? does it have a visible 84MHz crystal? dos it have another crystal value? do you need yo setup some internal PLL to get those 84MHz, try to post more information... meanwhile try changing the TIM_BaseStruct.TIM_Period value to something smaller, something like 672 and check the results...
 
Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…