使用带有 2 个定时器的 stm32 生成无限 pwm
generate infinity pwm with stm32 with 2 timers
我有 10 个伺服电机,我想推导出所有 them.I 使用 2 个定时器中断的不同定时器频率来为每个引脚生成不同的 PWM 频率。连接到舵机的引脚,我用每个引脚派生了一个舵机,
.代码是这样的:
已编辑:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
GPIO_ResetBits(SERVO_PORT , FUEL_PIN);
GPIO_ResetBits(SERVO_PORT , SPEED_PIN);
GPIO_ResetBits(SERVO_PORT , RPM_PIN);
GPIO_ResetBits(SERVO_PORT , AIR_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
GPIO_ResetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
//GPIO_ResetBits(GPIOD,GPIO_Pin_3);
CurrentDegree = 0;
}
}
void TIM4_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
CurrentDegree++;
if(CurrentDegree < Desired)
{
GPIO_SetBits(GPIOD , GPIO_Pin_3);
}
else
{
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
}
if(CurrentDegree < GetSpeed())
{
GPIO_SetBits(SERVO_PORT , SPEED_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , SPEED_PIN);
}
if(CurrentDegree < GetRpm())
{
GPIO_SetBits(SERVO_PORT , RPM_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , RPM_PIN);
}
if(CurrentDegree < GetFuel())
{
GPIO_SetBits(SERVO_PORT , FUEL_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , FUEL_PIN);
}
if(CurrentDegree < GetAirPresure())
{
GPIO_SetBits(SERVO_PORT , AIR_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , AIR_PRESURE_PIN);
}
if(CurrentDegree < GetOilEnginePresure())
{
GPIO_SetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
}
if(CurrentDegree < GetOilGearboxPresure())
{
GPIO_SetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
}
if(CurrentDegree < GetOilTemperature())
{
GPIO_SetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
}
if(CurrentDegree < GetCoolerWaterTemperature())
{
GPIO_SetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
}
}
}
生成的 pwm 对于端口 A 中的 5 个引脚工作正常。但是当我增加端口数量时,stm32 挂起。
我怎样才能增加引脚?
因为你省略了一些重要的细节,比如你的MCU的部件号,或者所谓的MCVE,我只能在这里猜测。
随着您向其中添加更多指令,您的定时器中断可能无法在下一个指令到来之前完成。您可以降低中断频率,但放弃软件中断并使用硬件 PWM 发生器会更有意义。
STM32通用定时器最多有4路PWM输出
编辑:在较早的端口中,您提到您正在使用 STM32F103RET。那个MCU实际上有24个硬件PWM输出。
请参阅参考手册中有关通用定时器的章节,或 ST 应用笔记 AN2403 中的第 2.5 节STM32 cross-series timer overview
了解如何使用它们。
如果你的伺服电机多于PWM通道,可以使用TL594之类的PWM Genrator IC,网上找!
你有3个选择!
1)使用编码器ic
or
2) pwm generator ic
or
3)just使用多臂皮质!
我有 10 个伺服电机,我想推导出所有 them.I 使用 2 个定时器中断的不同定时器频率来为每个引脚生成不同的 PWM 频率。连接到舵机的引脚,我用每个引脚派生了一个舵机,
.代码是这样的:
已编辑:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
GPIO_ResetBits(SERVO_PORT , FUEL_PIN);
GPIO_ResetBits(SERVO_PORT , SPEED_PIN);
GPIO_ResetBits(SERVO_PORT , RPM_PIN);
GPIO_ResetBits(SERVO_PORT , AIR_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
GPIO_ResetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
GPIO_ResetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
//GPIO_ResetBits(GPIOD,GPIO_Pin_3);
CurrentDegree = 0;
}
}
void TIM4_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
CurrentDegree++;
if(CurrentDegree < Desired)
{
GPIO_SetBits(GPIOD , GPIO_Pin_3);
}
else
{
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
}
if(CurrentDegree < GetSpeed())
{
GPIO_SetBits(SERVO_PORT , SPEED_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , SPEED_PIN);
}
if(CurrentDegree < GetRpm())
{
GPIO_SetBits(SERVO_PORT , RPM_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , RPM_PIN);
}
if(CurrentDegree < GetFuel())
{
GPIO_SetBits(SERVO_PORT , FUEL_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , FUEL_PIN);
}
if(CurrentDegree < GetAirPresure())
{
GPIO_SetBits(SERVO_PORT , AIR_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , AIR_PRESURE_PIN);
}
if(CurrentDegree < GetOilEnginePresure())
{
GPIO_SetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_ENGINE_PRESURE_PIN);
}
if(CurrentDegree < GetOilGearboxPresure())
{
GPIO_SetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_GEARBOX_PRESURE_PIN);
}
if(CurrentDegree < GetOilTemperature())
{
GPIO_SetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , OIL_TEMPERATURE_PIN);
}
if(CurrentDegree < GetCoolerWaterTemperature())
{
GPIO_SetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
}
else
{
GPIO_ResetBits(SERVO_PORT , COOLER_WATER_TEMPERATURE_PIN);
}
}
}
生成的 pwm 对于端口 A 中的 5 个引脚工作正常。但是当我增加端口数量时,stm32 挂起。 我怎样才能增加引脚?
因为你省略了一些重要的细节,比如你的MCU的部件号,或者所谓的MCVE,我只能在这里猜测。
随着您向其中添加更多指令,您的定时器中断可能无法在下一个指令到来之前完成。您可以降低中断频率,但放弃软件中断并使用硬件 PWM 发生器会更有意义。
STM32通用定时器最多有4路PWM输出
编辑:在较早的端口中,您提到您正在使用 STM32F103RET。那个MCU实际上有24个硬件PWM输出。
请参阅参考手册中有关通用定时器的章节,或 ST 应用笔记 AN2403 中的第 2.5 节STM32 cross-series timer overview
了解如何使用它们。
如果你的伺服电机多于PWM通道,可以使用TL594之类的PWM Genrator IC,网上找!
你有3个选择!
1)使用编码器ic
or
2) pwm generator ic
or
3)just使用多臂皮质!