具有 SPL 设置的 STM32F100 PWM

问题描述 投票:0回答:1

我试图弄清楚我在 PC6 上使用 STM32F100 MCU、TIM3 通道 1 进行 PWM 设置时出了什么问题。

这是一个旧项目,只剩下一个引脚,我正在尝试扩展一点。

我当前的设置是这样的:

void SERVO_Init(void) 
{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APBxPeriph_SERVO_PWM_TIM, ENABLE);
    
    /* configure Projector fan PWM timer */
    TIM_TimeBaseStructure.TIM_Prescaler = 65535;    /* 24 MHz divided by this gives pwm input clock */
    TIM_TimeBaseStructure.TIM_Period = 100-1; /* 100 0..99     */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;
    TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5000;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC3Init(SERVO_TIM, &TIM_OCInitStructure);
    
    /* turning on PROJ_FAN_TIM PWM output */
    TIM_Cmd(SERVO_TIM, ENABLE);
    TIM_CtrlPWMOutputs(SERVO_TIM, ENABLE);

我知道我需要将其设置为备用功能引脚分配,但我似乎可以获得引脚的任何输出。 在我的主循环中我有

TIM_SetCompare3(SERVO_TIM, 5000);
}

由于我无法将当前代码更改为 HAL,所以我只能遗憾地使用 SPL。

我还在网上找到了以下内容,但遇到了很多错误:

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA, GPIOB and GPIOE Clocks enable */
RCC_APB1PeriphClockCmd( RCC_APBxPeriph_SERVO_PWM_TIM, ENABLE);

// Set to Alt function
  GPIO_InitStructure.GPIO_Pin = SERVO_PWM_Pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStructure.OutputType = GPIO_OUTPUT_PUSHPULL;
  GPIO_Init(SERVO_PWM_GPIO_Port, &GPIO_InitStruct);

  GPIO_AF_EnableRemap_TIM3();

// setup timer scales
    TIM_TimeBaseStructure.TIM_Prescaler = 65535;    /* 24 MHz divided by this gives pwm input clock */
    TIM_TimeBaseStructure.TIM_Period = 100-1; /* 100 0..99     */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;
    TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5000;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

// enable settings
TIM_OC1Init(SERVO_TIM, &TIM_OCInitStructure);

/* turning on SERVO PWM output */
TIM_Cmd(SERVO_TIM, ENABLE);
TIM_CtrlPWMOutputs(SERVO_TIM, ENABLE);

任何建议都会有很大帮助。

stm32 stm32f1
1个回答
0
投票

定时器周期为100,但OC脉冲设置为5000。定时器计数器永远不会达到该值。

调用

TIM_SetCompare3(SERVO_TIM, 5000);
将设置 SERVO_TIM 通道 3 上的脉冲长度。您已经使用
TIM_OC1Init
设置通道 1 上的脉冲长度。

如果您不喜欢 SPL,则恢复直接寄存器编程。这样你就能更好地了解 MCU。

© www.soinside.com 2019 - 2024. All rights reserved.