2016-07-23 111 views
1

我有10个伺服电机,我想从它们中推导出所有这些。我使用了2个定时器中断,并使用不同的定时器频率为每个引脚产生不同的PWM频率。连接到伺服销,我导出的一个伺服与每个销, .the码是这样的:

被修改:
用2个定时器产生无限pwm与stm32

 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工作正常的5个引脚在端口A,但是当我增加了端口的数量,stm32挂起。 我怎样才能增加引脚?

回答

2

如果您的伺服电机多于PWM通道,那么您可以使用PWM Genrator IC(如TL594),在网上找到它!

1

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

随着您向其添加更多指令,您的计时器中断可能无法在下一次计时器中断之前完成。您可以降低中断频率,但放弃软件中断并使用硬件PWM发生器会更有意义。

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

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

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

+0

更多详细信息添加@berendi – Hamid

1

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

2)pwm发生器ic

3)只使用多臂皮层!

+1

Tanx,我通过pwm生成器ic解决了这个问题 – Hamid