サンプルプログラム 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 について説明していきます。
サンプルプログラムの構成
STM32CubeIDEの画面左側、Project Explorerの
N446RE_PWM_RGBを展開した画面は以下のようになります。
サンプルプログラム 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 にあります。
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 が点灯している様子
以下に、点灯している様子を示します。
あまり、きれいな写真じゃありませんが、肉眼ではとてもきれいです。
このサンプルプログラムは、
えがおのでんし製の試験用基板 Base-N446RE-V1 を使用して動作を確認しています。
動作試験用基板 Base-N446RE の説明
基板については、
Base-N446RE基板 の説明 をご覧ください。
動作試験用基板 IF-N446RE-RGB の説明
基板については、
IF-N446RE-RGB基板 の説明 をご覧ください。
A+-2C (ええ加減にC) のページに戻る
メールアドレス: apm2c.sumi@gmail.com
なんでも、気軽に ご相談ください。
担当:おの
えがおのでんし 案内