2016-07-23 81 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