2016-07-23 7 views
1

私は10台のサーボモータを持っており、それらのすべてを派生したいと思います。各タイマー周波数で2つのタイマ割り込みを使用して、各ピンごとに異なるPWM周波数を生成しました。

編集:サーボに接続されたピンは、Iは各ピンと1つのサーボ由来、 【選択コードは、このされ生成されたPWMは、ポートAが、5本のピ​​ンが正常に動作
2タイマーのstm32で無限大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); 
    }  
    }  
} 

私はポート数を増やし、stm32はハングします。 どうすればピンを増やすことができますか?

答えて

2

PWMチャネル以外のマルチサーボモータを使用している場合は、TL594のようなPWM Genrator ICを使用することができます。

1

MCUの部品番号などの重要な詳細や、MCVEなどを省略しているので、ここでしか推測できません。

命令を追加するときに、次の命令が来る前にタイマ割り込みが終了しないことがあります。割り込み頻度を減らすことはできますが、ソフトウェア割り込みを放棄してハードウェアPWMジェネレータを使用する方が理にかなっています。

STM32汎用タイマは、最大4つのPWM出力を備えています。

編集:以前のポートでは、STM32F103RETを使用していると述べました。そのMCUには実際に24個のハードウェアPWM出力があります。

リファレンスマニュアルの汎用タイマの章、またはSTアプリケーションノートAN2403 012 2.のセクション2.5を参照してください。

+0

詳細を追加@berendi – Hamid

1

あなたは3つの選択肢があります!
1)エンコーダic
または
を使用してください。2)PWMジェネレータic
または
3)多腕皮質を使用してください!

+1

Tanx、私はそれをpwm generator icで解決しました – Hamid

関連する問題