サンプルプログラム N446RE_PWM_RGB の説明
マスコット
  RGB 3色LED の点灯制御を
 PWMにより行うサンプルプログラムです。

  RGB をそれぞれ独立に制御することができます。

  STMicroelectronics社製の
 評価用基板、NUCLEO-F446RE と
 freeの開発環境、STM32CubeIDE
 使用しています。

目次

サンプルプログラム N446RE_PWM_RGB のソース

サンプルプログラム N446RE_PWM_RGB の説明
 N446RE_PWM_RGB の構成
 N446RE_PWM_RGB の動作パラメータの定義
 ユーザープログラムの実行開始位置
 N446RE_PWM_RGB の main() の説明
  1) 初期化の部分
  2) LED点滅 と RGBフルカラーLED点灯制御 の部分

 RGB LEDシーケンス Seq_PWM_RGB の説明
  1) RGB LEDシーケンスのソース
  2) RGB LEDシーケンスのパラメータ構造体
  3) RGB LEDシーケンスの動作

 PWM RGB LED点灯処理 Transact_PWM_RGB の説明
  1) Transact_PWM_RGBのソース
  2) Transact_PWM_RGBの動作

 RGB LED が点灯している様子



  このサンプルプログラムは、えがおのでんし製の試験用基板
  Base-N446RE-V1 と IF-N446RE-RGB-V1 を使用して動作を確認しています。

動作試験用基板 Base_N446RE の説明

動作試験用基板 IF_N446RE_RGB の説明



サンプルプログラム N446RE_PWM_RGB のソース
 STMicroelectronics社製のfreeの開発環境 STM32CubeIDE 1.7.0 を使用して作成しました。

 ここからサンプルプログラム R_N446RE_PWM_RGB.zip をダウンロードしてください。



サンプルプログラム N446RE_PWM_RGB の説明
  PWMを使用してRGB 3色LEDの点灯制御を行うプログラムです。
  RGBそれぞれの点灯制御を独立に行うことができます。

 プロジェクトを最初に開いた画面は以下のようになります。

N446RE_PWM_RGB_Scrn_First

 以下、サンプルプログラム N446RE_PWM_RGB について説明していきます。



サンプルプログラムの構成
  STM32CubeIDEの画面左側、Project Explorerの
 N446RE_PWM_RGBを展開した画面は以下のようになります。

N446RE_PWM_RGB_Tree

  サンプルプログラム N446RE_PWM_RGB の構成を以下に示します。

N446RE_PWM_RGB
  |
  |- Includes
  |
  |- Blink_LED_Stat : Status LED点滅処理
  |     |- Blink_LED_Stat.c
  |     |- Blink_LED_Stat.h
  |
  |- Core
  |     |- Inc
  |     |  |- main.h
  |     |  |- stm32f4xx_hal_conf.h
  |     |  |- stm32f4xx_it.h
  |     |
  |     |- Src
  |     |  |- main.c
  |     |  |- stm32f4xx_hal_msp.c
  |     |  |- stm32f4xx_it.c
  |     |  |- syscalls.c
  |     |  |- system.c
  |     |  |- system_stm32f4xx.c
  |     |
  |     |- Startup
  |
  |- Drivers
  |
  |- N446RE_PWM_RGB : PWM RGB制御
  |     |- N446RE_PWM_RGB.c
  |     |- N446RE_PWM_RGB.h
  |
  |- N446RE_PWM_RGB_Config : 動作パラメータの定義
  |     |- Dev_Conf.h
  |
  |- Periph_F4 : 周辺インターフェース処理
  |     |- H_F4_GPIO.c
  |     |- H_F4_GPIO.h
  |     |- H_F4_PWM.c
  |     |- H_F4_PWM.h
  |
  |- Trn_N446RE_PWM_RGB : PWM RGB LED処理
  |     |- Trn_N446RE_PWM_RGB.c
  |     |- Trn_N446RE_PWM_RGB.h
  |
  |- Wait_Itvl : 時間待ち処理
  |     |- Wait_Itvl.c
  |     |- Wait_Itvl.h
  |
  |- N446RE_PWM_RGB.launch
  |- STM32F446RETX_FLASH.ld
  |- STM32F446RETX_RAM.ld



 N446RE_PWM_RGB の動作パラメータの定義
  サンプルプログラム N446RE_PWM_RGB の動作パラメータの定義を
 N446RE_PWM_RGB_Config/Dev_Conf.h に記述しています。

  使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、動作パラメータの定義、
 などを記述しています。



 ユーザープログラムの実行開始位置
  プログラムは、int main(void) から実行開始します。

  int main(void) は、フォルダ Core/Src/main.c にあります。

N446RE_PWM_RGB_main

  STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
 行った後、int main(void) を呼び出します。

  ユーザーコード(記述したプログラム)は、
 int main(void) の先頭から実行されます。



 N446RE_PWM_RGB の main() の説明
  サンプルプログラム N446RE_PWM_RGB の main() の記述は、
 以下のとおりです。


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  uint8_t uint8_JobNum_LED = 0;
  uint8_t uint8_JobNum_RGB = 0;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */

  //------------------------------------------------
  // Status LED(緑) : 点灯1000mSec / 消灯2000mSec
  //------------------------------------------------
  GLB_uint16_Time_LED_Stat_ON = (uint16_t)1000;
  GLB_uint16_Time_LED_Stat_OFF = (uint16_t)2000;
  //------------------------------------------------

  //------------------------------------------------
  // Status LEDのGPIO初期化
  //------------------------------------------------
  Init_LED_Stat();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // Status LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
    // uint16_t uint16_Time_ON  : 点灯時間
    // uint16_t uint16_Time_OFF : 消灯時間

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blk_LED_Stat(&uint8_JobNum_LED,
                 GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);


    //----------------------------------------------------
    // RGBフルカラーLED点灯制御
    //----------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //----------------------------------------------------
    Execute_PWM_RGB(&uint8_JobNum_RGB);
  }
  /* USER CODE END 3 */
}


 1) 初期化の部分

  a) CPUとPeripheral初期化
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
   により、CPUとPeripheralなどの基本的な初期化を行います。
  PeripheralとはCPUの周辺インターフェースなどのことを言います。

   HAL_Init はプロジェクト構築時に自動的に組み込まれる、
  HAL Drivers(フォルダ Drivers/STM32F4xx_HAL_Drivers) 内に記述されています。


  b) CPU動作クロックの設定
  /* Configure the system clock */
  SystemClock_Config();

   CPUの動作クロックとPeripheralの動作クロックを設定します。

   SystemClock_Config(); の設定内容は、

int main(void)
{
     .
     .
     .
}
 の、すぐ下に記述されています。


  c) Status LEDの初期化
   初期の点滅時間をセットした後、Init_LED_Stat(); を呼び出して
  LEDが接続されているピンを出力に設定しています。

  //------------------------------------------------
  // Status LED(緑) : 点灯1000mSec / 消灯2000mSec
  //------------------------------------------------
  GLB_uint16_Time_LED_Stat_ON = (uint16_t)1000;
  GLB_uint16_Time_LED_Stat_OFF = (uint16_t)2000;
  //------------------------------------------------

  //------------------------------------------------
  // Status LEDのGPIO初期化
  //------------------------------------------------
  Init_LED_Stat();



 2) LED点滅 と RGBフルカラーLED点灯制御 の部分
   永久ループ部分の記述を以下に示します。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // Status LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
    // uint16_t uint16_Time_ON  : 点灯時間
    // uint16_t uint16_Time_OFF : 消灯時間

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blk_LED_Stat(&uint8_JobNum_LED,
                 GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);


    //----------------------------------------------------
    // RGBフルカラーLED点灯制御
    //----------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //----------------------------------------------------
    Execute_PWM_RGB(&uint8_JobNum_RGB);
  }
  /* USER CODE END 3 */

  Status LED点滅処理 Blk_LED_Stat と
  RGBフルカラーLED点灯制御 Execute_PWM_RGB を呼び出しています。

  Execute_PWM_RGB では、RGBをそれぞれ独立に点灯制御します。
  Execute_PWM_RGB は Trn_N446RE_PWM_RGB/Trn_N446RE_PWM_RGB.c 内に記述されています。

  モジュール Execute_PWM_RGB から PWM RGB LED点灯処理 Transact_PWM_RGB が呼び出され、
 そのモジュール Transact_PWM_RGB から RGB LEDシーケンスの処理を行う
 Seq_PWM_RGB が呼び出されます。



 RGB LEDシーケンス Seq_PWM_RGB の説明


  1) RGB LEDシーケンスのソース
  モジュール Seq_PWM_RGB は
 N446RE_PWM_RGB/N446RE_PWM_RGB.c 内に記述されています。

  モジュール Seq_PWM_RGB のソースを以下に示します。

//------------------------------------------------------------------
// PWM RGB LEDシーケンス
//------------------------------------------------------------------
// 動作パラメータにしたがって、出力の増減、インターバルを制御する。
//------------------------------------------------------------------
// 引数:
// struct s_Seq_Param_PWM_RGB *ps_Seq_P : PWM RGB LED処理のための動作パラメータ構造体のポインタ

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG
//------------------------------------------------------------------
int16_t Seq_PWM_RGB(struct s_Seq_Param_PWM_RGB *ps_Seq_P)
{
  int16_t int16_Return;


  // 出力シーケンスの処理番号
  switch(ps_Seq_P->uint8_JobNum_RGB)
  {
  case 0:
    // ON/OFF判定
    if(ps_Seq_P->int16_OnOff == 0){
      // OFFなら抜ける。
      int16_Return = 0;
      break;
    }


    // 初期出力
    //---------------------------------------------------------------------
    // PWMパルス出力設定
    //---------------------------------------------------------------------
    // 引数:
    // TIM_HandleTypeDef *pHandle_TIMx : Time Base Handle構造体のポインタ
    // TIM_TypeDef *TIMx : TIM選択
    // uint32_t uint32_TIM_CHANNEL_x : Channel選択
    // uint32_t uint32_Pulse : Pulse出力値
    //---------------------------------------------------------------------
    Configure_PWM(&ps_Seq_P->struct_TIM_Handle_PWM,
                  ps_Seq_P->pstruct_TIMx_PWM,
                  ps_Seq_P->uint32_TIM_CHANNEL,
                  (uint32_t)ps_Seq_P->int16_Value);


    ps_Seq_P->uint8_JobNum_Wait = 0;  // 時間待ち処理番号初期化


    ps_Seq_P->uint8_JobNum_RGB++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 1:
    int16_Return = -1;  // 処理中
    break;

  case 1:
    // LED制御間隔 : ps_Seq_P->uint32_Interval[ps_Seq_P->int16_Pos] の時間待ち
    //------------------------------------------------------
    // mSec待ちシーケンス : 処理番号使用 : 複数呼び出し用
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値 :
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_mSec_Seq_Multi(&ps_Seq_P->uint8_JobNum_Wait,
                                       &ps_Seq_P->uint32_tikstart,
                                       ps_Seq_P->uint32_Interval[ps_Seq_P->int16_Pos]);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : case 1: をループ
    }

    //-------------------------------------------------------------------
    // PWM_RGB の出力値を更新
    //-------------------------------------------------------------------
    // 値の更新 : 出力値に出力増減値を加算する。
    ps_Seq_P->int16_Value += ps_Seq_P->int16_IncDec[ps_Seq_P->int16_Pos];

    // 値の増減を判定
    if(ps_Seq_P->int16_IncDec[ps_Seq_P->int16_Pos] < 0){
      // 減の場合
      if(ps_Seq_P->int16_Value <= (int16_t)def_MIN_Value_RGB){
        // 最小値判定
        // 最小値以下の場合、最小値をセットする。
        ps_Seq_P->int16_Value = (int16_t)def_MIN_Value_RGB;
      }
    }
    else if(ps_Seq_P->int16_IncDec[ps_Seq_P->int16_Pos] > 0){
      // 増の場合
      if(ps_Seq_P->int16_Value >= (int16_t)def_MAX_Value_RGB){
        // 最大値判定
        // 最大値以上の場合、最大値をセットする。
        ps_Seq_P->int16_Value = (int16_t)def_MAX_Value_RGB;
      }
    }


    // 更新値出力
    //---------------------------------------------------------------------
    // PWMパルス出力設定
    //---------------------------------------------------------------------
    // 引数:
    // TIM_HandleTypeDef *pHandle_TIMx : Time Base Handle構造体のポインタ
    // TIM_TypeDef *TIMx : TIM選択
    // uint32_t uint32_TIM_CHANNEL_x : Channel選択
    // uint32_t uint32_Pulse : Pulse出力値
    //---------------------------------------------------------------------
    Configure_PWM(&ps_Seq_P->struct_TIM_Handle_PWM,
                  ps_Seq_P->pstruct_TIMx_PWM,
                  ps_Seq_P->uint32_TIM_CHANNEL,
                  (uint32_t)ps_Seq_P->int16_Value);


    ps_Seq_P->uint32_Count++;  // 出力回数カウント値インクリメント
    // 出力回数カウント値 と 出力回数 を比較
    if(ps_Seq_P->uint32_Count >= ps_Seq_P->uint32_Intvl_Cnt[ps_Seq_P->int16_Pos]){
      // 出力回数に達した場合
      ps_Seq_P->uint32_Count = 0;  // 出力回数カウント値初期化
      ps_Seq_P->int16_Pos++;  // 実行位置をインクリメント
      // 次の実行位置の出力インターバルを判定
      if(ps_Seq_P->uint32_Interval[ps_Seq_P->int16_Pos] <= 0){
        // 実行位置の出力インターバルが 0 の場合、それ以降の実行はないと判定する。
        ps_Seq_P->int16_Pos = 0;  // 実行位置初期化 : 先頭に戻る
      }
    }


    ps_Seq_P->uint8_JobNum_Wait = 0;  // 時間待ち処理番号初期化


    // 処理番号維持 : case 1: をループ
    int16_Return = -1;  // 処理継続
    break;

  default:
    ps_Seq_P->uint8_JobNum_RGB = 0;  // 処理番号初期化
    int16_Return = 1;  // NG
    break;
  }

  return(int16_Return);
}

  引数の 構造体 struct s_Seq_Param_PWM_RGB *ps_Seq_P の内容にしたがって処理を行います。



  2) RGB LEDシーケンスのパラメータ構造体
   構造体 struct s_Seq_Param_PWM_RGB の内容は以下の通りです。

//----------------------------------------------
// PWM RGB LED処理のための動作パラメータ構造体
//----------------------------------------------
struct s_Seq_Param_PWM_RGB{
  TIM_HandleTypeDef struct_TIM_Handle_PWM;  // TIM Time Base Handle
  TIM_TypeDef *pstruct_TIMx_PWM;  // TIMx
  uint32_t uint32_TIM_CHANNEL;  // PWM CH
  uint8_t uint8_JobNum_RGB;  // 出力シーケンスの処理番号
  uint8_t uint8_JobNum_Wait;  // 時間待ちの処理番号
  int16_t int16_OnOff;  // 動作ON/OFF : 0 = OFF : 1 = ON
  int16_t int16_Pos;  // 実行位置
  int16_t int16_Value;  // 出力値
  int16_t int16_IncDec[def_Size_Seq_PWM_RGB];  // 出力増減値
  uint32_t uint32_Interval[def_Size_Seq_PWM_RGB];  // 出力インターバル
  uint32_t uint32_tikstart;  // 時間待ち開始時の1mSecカウント値
  uint32_t uint32_Intvl_Cnt[def_Size_Seq_PWM_RGB];  // 出力回数
  uint32_t uint32_Count;  // 出力回数カウント値
};


 3) RGB LEDシーケンス Seq_PWM_RGB の動作
  RGB LEDシーケンスのパラメータ構造体の
  TIM_HandleTypeDef struct_TIM_Handle_PWM;  // TIM Time Base Handle
  TIM_TypeDef *pstruct_TIMx_PWM;  // TIMx
  uint32_t uint32_TIM_CHANNEL;  // PWM CH
 に指定した、PWMチャンネルの単独の動作です。

  呼び出し側で、複数のチャンネルを指定して呼び出すことにより、
 複数のチャンネルが独立に動作します。

  Trn_N446RE_PWM_RGB/Trn_N446RE_PWM_RGB.c 内の モジュール Transact_PWM_RGB に
 複数呼び出しの記述があります。


  a) case 0:
   動作パラメータにセットされた 出力値 : int16_Vlue (初期値)を出力します。

  b) case 1:

   i) 出力インターバルの時間待ち
    実行位置にセットされている 出力インターバル ( uint32_Interval[int16_Pos] ) の
   時間待ちをします。

   ii) 出力値の更新
    時間が経過したら、実行位置の出力値の増減 (int16_IncDec[int16_Pos]) を判定して
   出力値を更新します。

   iii) 出力回数の判定
    出力回数カウント値 (uint32_Count) をインクリメントします。

    実行位置にセットされている 出力回数 (uint32_Intvl_Cnt[int16_Pos]) と
   出力回数カウント値 (uint32_Count) を比較して、出力回数に達したら、
   実行位置をインクリメントします。

    そして、次の実行位置の出力インターバルを判定して、値が 0 なら
   それ以降の実行はないと判定して、実行位置を 0 に初期化します。

    RGB LEDシーケンスは再び実行位置 0 から動作します。


    出力回数に達していなければ、そのまま case 1: をループします。



 PWM RGB LED点灯処理 Transact_PWM_RGB の説明


  1) Transact_PWM_RGB のソース
  モジュール Transact_PWM_RGB は
  Trn_N446RE_PWM_RGB/Trn_N446RE_PWM_RGB.c 内に記述されています。

  モジュール Trn_PWM_RGB のソースを以下に示します。

//----------------------------------------------------
// PWM RGB LED点灯処理
//----------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG
//----------------------------------------------------
int16_t Transact_PWM_RGB(uint8_t *puint8_JobNum)
{
  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    //----------------------------------------------------------
    // PWM_RGBのPeripheral初期化
    //----------------------------------------------------------
    Init_PWM_RGB();


    //------------------------------------
    // PWM_RGBシーケンス動作パラメータ構造体初期化
    //------------------------------------
    Init_Seq_Param_PWM_RGB();


    //------------------------------------
    // PWM_RGBシーケンス動作パラメータ構造体設定
    //------------------------------------
    Set_Seq_Param_PWM_RGB();


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に進む。
    int16_Return = -1;   // 処理中
    break;

  case 1:
    //--------------------------------------------
    // PWM_RGB_1
    //--------------------------------------------
    //------------------------------------------------------------------
    // RGB LEDシーケンス
    //------------------------------------------------------------------
    // 引数:
    // struct s_Seq_Param_PWM_RGB *ps_Seq_P : PWM RGB LED処理のための動作パラメータ構造体のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------------------
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_R_1);
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_G_1);
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_B_1);


    //--------------------------------------------
    // PWM_RGB_2
    //--------------------------------------------
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_R_2);
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_G_2);
    Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_B_2);


    // 処理番号維持 : case 1: をループ
    int16_Return = -1;  // 処理継続
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}


 2) Transact_PWM_RGB の動作

  a) case 0:

   i) PWM_RGBのPeripheral初期化
    モジュール Init_PWM_RGB を呼びだして、使用する TIM と 各CH を初期化します。

   ii) PWM_RGBシーケンス動作パラメータ構造体初期化
    モジュール Init_Seq_Param_PWM_RGB を呼び出して、
   PWM_RGBシーケンスの動作パラメータ構造体を初期化します。

   iii) PWM_RGBシーケンス動作パラメータ構造体設定
    モジュール Set_Seq_Param_PWM_RGB を呼び出して、
   PWM_RGBシーケンスの動作パラメータ構造体に動作内容を設定します。

    この動作パラメータに、それぞれ値を設定することにより、
   LEDの色を時間とともにさまざまに変化させることができます。

    モジュール Set_Seq_Param_PWM_RGB の内容を以下に示します。
//------------------------------------
// PWM_RGBシーケンス動作パラメータ構造体設定
//------------------------------------
void Set_Seq_Param_PWM_RGB(void)
{
  //--------------------------------------
  // PWM_RGB_1 : PWM_R_1
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_R_1.int16_Value = 0;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_R_1.int16_IncDec[0] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_R_1.uint32_Interval[0] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_1.uint32_Intvl_Cnt[0] = 200;  // 出力回数 : 50mSec x 200 = 10秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_R_1.int16_IncDec[1] = -10;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_R_1.uint32_Interval[1] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_1.uint32_Intvl_Cnt[1] = 300;  // 出力回数 : 50mSec x 300 = 15秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_R_1.int16_IncDec[2] = 10;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_R_1.uint32_Interval[2] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_1.uint32_Intvl_Cnt[2] = 100;  // 出力回数 : 50mSec x 100 = 5秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_R_1.int16_IncDec[3] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_R_1.uint32_Interval[3] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_1.uint32_Intvl_Cnt[3] = 400;  // 出力回数 : 50mSec x 400 = 20秒


  //--------------------------------------
  // PWM_RGB_1 : PWM_G_1
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_G_1.int16_Value = 500;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_G_1.int16_IncDec[0] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_G_1.uint32_Interval[0] = 120;  // 出力インターバル : 120mSec
  GLB_struct_Seq_Param_PWM_G_1.uint32_Intvl_Cnt[0] = 100;  // 出力回数 : 100mSec x 100 = 12秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_G_1.int16_IncDec[1] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_G_1.uint32_Interval[1] = 100;  // 出力インターバル : 100mSec
  GLB_struct_Seq_Param_PWM_G_1.uint32_Intvl_Cnt[1] = 190;  // 出力回数 : 100mSec x 190 = 19秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_G_1.int16_IncDec[2] = 10;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_G_1.uint32_Interval[2] = 110;  // 出力インターバル : 110mSec
  GLB_struct_Seq_Param_PWM_G_1.uint32_Intvl_Cnt[2] = 100;  // 出力回数 : 100mSec x 100 = 11秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_G_1.int16_IncDec[3] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_G_1.uint32_Interval[3] = 90;  // 出力インターバル : 90mSec
  GLB_struct_Seq_Param_PWM_G_1.uint32_Intvl_Cnt[3] = 190;  // 出力回数 : 90mSec x 190 = 17.1秒

  // 実行位置 4
  GLB_struct_Seq_Param_PWM_G_1.int16_IncDec[4] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_G_1.uint32_Interval[4] = 100;  // 出力インターバル : 100mSec
  GLB_struct_Seq_Param_PWM_G_1.uint32_Intvl_Cnt[4] = 90;  // 出力回数 : 100mSec x 90 = 9秒


  //--------------------------------------
  // PWM_RGB_1 : PWM_B_1
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_B_1.int16_Value = 1000;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_B_1.int16_IncDec[0] = -2;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_B_1.uint32_Interval[0] = 40;  // 出力インターバル : 40mSec
  GLB_struct_Seq_Param_PWM_B_1.uint32_Intvl_Cnt[0] = 500;  // 出力回数 : 40mSec x 500 = 20秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_B_1.int16_IncDec[1] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_B_1.uint32_Interval[1] = 40;  // 出力インターバル : 40mSec
  GLB_struct_Seq_Param_PWM_B_1.uint32_Intvl_Cnt[1] = 200;  // 出力回数 : 40mSec x 200 = 8秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_B_1.int16_IncDec[2] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_B_1.uint32_Interval[2] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_B_1.uint32_Intvl_Cnt[2] = 240;  // 出力回数 : 50mSec x 240 = 12秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_B_1.int16_IncDec[3] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_B_1.uint32_Interval[3] = 65;  // 出力インターバル : 65mSec
  GLB_struct_Seq_Param_PWM_B_1.uint32_Intvl_Cnt[3] = 200;  // 出力回数 : 65mSec x 200 = 13秒



  //--------------------------------------
  // PWM_RGB_2 : PWM_R_2
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_R_2.int16_Value = 0;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_R_2.int16_IncDec[0] = 10;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_R_2.uint32_Interval[0] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_2.uint32_Intvl_Cnt[0] = 100;  // 出力回数 : 50mSec x 100 = 5秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_R_2.int16_IncDec[1] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_R_2.uint32_Interval[1] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_2.uint32_Intvl_Cnt[1] = 300;  // 出力回数 : 50mSec x 300 = 15秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_R_2.int16_IncDec[2] = 2;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_R_2.uint32_Interval[2] = 50;  // 出力インターバル : 50mSec
  GLB_struct_Seq_Param_PWM_R_2.uint32_Intvl_Cnt[2] = 250;  // 出力回数 : 50mSec x 250 = 12.5秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_R_2.int16_IncDec[1] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_R_2.uint32_Interval[1] = 170;  // 出力インターバル : 170mSec
  GLB_struct_Seq_Param_PWM_R_2.uint32_Intvl_Cnt[1] = 100;  // 出力回数 : 170mSec x 100 = 17秒


  //--------------------------------------
  // PWM_RGB_2 : PWM_G_2
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_G_2.int16_Value = 0;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_G_2.int16_IncDec[0] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_G_2.uint32_Interval[0] = 120;  // 出力インターバル : 120mSec
  GLB_struct_Seq_Param_PWM_G_2.uint32_Intvl_Cnt[0] = 200;  // 出力回数 : 100mSec x 200 = 24秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_G_2.int16_IncDec[1] = -2;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_G_2.uint32_Interval[1] = 45;  // 出力インターバル : 45mSec
  GLB_struct_Seq_Param_PWM_G_2.uint32_Intvl_Cnt[1] = 500;  // 出力回数 : 45mSec x 500 = 22.5秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_G_2.int16_IncDec[2] = 5;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_G_2.uint32_Interval[2] = 83;  // 出力インターバル : 83mSec
  GLB_struct_Seq_Param_PWM_G_2.uint32_Intvl_Cnt[2] = 200;  // 出力回数 : 83mSec x 200 = 16.6秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_G_2.int16_IncDec[3] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_G_2.uint32_Interval[3] = 74;  // 出力インターバル : 74mSec
  GLB_struct_Seq_Param_PWM_G_2.uint32_Intvl_Cnt[3] = 200;  // 出力回数 : 74mSec x 200 = 14.8秒


  //--------------------------------------
  // PWM_RGB_2 : PWM_B_2
  //--------------------------------------
  GLB_struct_Seq_Param_PWM_B_2.int16_Value = 0;  // 初期出力値セット

  // 実行位置 0
  GLB_struct_Seq_Param_PWM_B_2.int16_IncDec[0] = 2;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_B_2.uint32_Interval[0] = 37;  // 出力インターバル : 37mSec
  GLB_struct_Seq_Param_PWM_B_2.uint32_Intvl_Cnt[0] = 500;  // 出力回数 : 37mSec x 500 = 18.5秒

  // 実行位置 1
  GLB_struct_Seq_Param_PWM_B_2.int16_IncDec[1] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_B_2.uint32_Interval[1] = 87;  // 出力インターバル : 87mSec
  GLB_struct_Seq_Param_PWM_B_2.uint32_Intvl_Cnt[1] = 200;  // 出力回数 : 87mSec x 200 = 17.4秒

  // 実行位置 2
  GLB_struct_Seq_Param_PWM_B_2.int16_IncDec[2] = 2;  // 増減値 : 増
  GLB_struct_Seq_Param_PWM_B_2.uint32_Interval[2] = 33;  // 出力インターバル : 33mSec
  GLB_struct_Seq_Param_PWM_B_2.uint32_Intvl_Cnt[2] = 550;  // 出力回数 : 33mSec x 550 = 18.15秒

  // 実行位置 3
  GLB_struct_Seq_Param_PWM_B_2.int16_IncDec[3] = -5;  // 増減値 : 減
  GLB_struct_Seq_Param_PWM_B_2.uint32_Interval[3] = 87;  // 出力インターバル : 87mSec
  GLB_struct_Seq_Param_PWM_B_2.uint32_Intvl_Cnt[3] = 250;  // 出力回数 : 87mSec x 250 = 21.75秒
}
    RGB LED 2個のそれぞれの 3色 に対して設定しています。

    出力値の増減、出力インターバル、出力回数を設定します。

    増減値 x 出力回数 = 出力値の増減の合計
    出力インターバル x 出力回数 = 出力時間の合計
   になります。

    一色につき、実行位置 0 - 実行位置 255 で、256パターンを設定できます。
    実行位置 0 から順番に動作していきます。
    出力回数カウント値が、1個の実行位置の出力回数に達すると、
   実行位置がインクリメントされて、次の実行位置に移ります。

    実行位置の出力インターバルが 0 の場合、それ以降の出力はないと判断して、
   実行位置を 0 に戻します。
    こうして、動作パラメータを繰り返し実行します。


  b) case 1:
    モジュール Seq_PWM_RGB を複数呼びだして、各TIMの各CHの
   RGB LEDシーケンス を実行します。


    case 1: の部分の記述を以下に示します。
  case 1:
  //--------------------------------------------
  // PWM_RGB_1
  //--------------------------------------------
  //------------------------------------------------------------------
  // RGB LEDシーケンス
  //------------------------------------------------------------------
  // 引数:
  // struct s_Seq_Param_PWM_RGB *ps_Seq_P : PWM RGB LED処理のための動作パラメータ構造体のポインタ

  // 戻り値:
  //   -1 : 処理中
  //    0 : OK終了
  //    1 : NG
  //------------------------------------------------------------------
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_R_1);
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_G_1);
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_B_1);


  //--------------------------------------------
  // PWM_RGB_2
  //--------------------------------------------
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_R_2);
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_G_2);
  Seq_PWM_RGB(&GLB_struct_Seq_Param_PWM_B_2);


  // 処理番号維持 : case 1: をループ
  int16_Return = -1;  // 処理継続
  break;
    PWM_RGB_1 の RGB 3CH と PWM_RGB_2 の RGB 3CH は、それぞれ独立に動作します。



RGB LED が点灯している様子
  以下に、点灯している様子を示します。
  あまり、きれいな写真じゃありませんが、肉眼ではとてもきれいです。

IF-N446RE-RGB-L1 IF-N446RE-RGB-L2



  このサンプルプログラムは、
  えがおのでんし製の試験用基板 Base-N446RE-V1 を使用して動作を確認しています。



動作試験用基板 Base-N446RE の説明

Base-N446RE-V1_Dim

  基板については、
 Base-N446RE基板 の説明 をご覧ください。



動作試験用基板 IF-N446RE-RGB の説明

IF-N446RE-RGB-V1_Dim

  基板については、
 IF-N446RE-RGB基板 の説明 をご覧ください。



A+-2C (ええ加減にC) のページに戻る




 メールアドレス: apm2c.sumi@gmail.com

 なんでも、気軽に ご相談ください。
 担当:おの

マスコット
  えがおのでんし 案内