1

我有 10 个伺服电机,我想把它们全部推导出来。我使用了 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 挂起。我怎样才能增加引脚?

4

3 回答 3

2

如果您有多个伺服电机而不是 PWM 通道,那么您可以使用 TL594 等 PWM 发生器 IC,在网上找到它!

于 2016-08-03T15:44:25.410 回答
1

由于您省略了一些重要的细节,例如 MCU 的部件号或所谓的MCVE,我只能在这里猜测。

当您向其添加更多指令时,您的定时器中断可能不会在下一个指令到来之前完成。您可以降低中断频率,但放弃软件中断并使用硬件 PWM 发生器会更有意义。

STM32 通用定时器最多有 4 个 PWM 输出。

编辑:在较早的端口中,您提到您正在使用 STM32F103RET。该 MCU 实际上有 24 个硬件 PWM 输出。

请参阅参考手册中有关通用定时器的章节,或 ST 应用笔记 AN2403 中的第 2.5 节STM32 cross-series timer overview,了解如何使用它们。

于 2016-07-24T07:07:59.753 回答
1

你有3个选择!
1) 使用编码器 ic

2) pwm 发生器 ic

3) 只使用多臂皮质!

于 2016-10-13T15:43:54.810 回答