我试图弄清楚我在 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);
任何建议都会有很大帮助。
定时器周期为100,但OC脉冲设置为5000。定时器计数器永远不会达到该值。
调用
TIM_SetCompare3(SERVO_TIM, 5000);
将设置 SERVO_TIM 通道 3 上的脉冲长度。您已经使用 TIM_OC1Init
设置通道 1 上的脉冲长度。
如果您不喜欢 SPL,则恢复直接寄存器编程。这样你就能更好地了解 MCU。