⌨️
MCXA153シリーズ eFlexPWMサンプル
!!!注意!!!
- 個人的なメモです
- eFlexPWMの機能全てについて理解して利用していません
- 本格的な利用前にはマニュアルを確認しましょう
MCXA15のEnhanced Flex Pulse Width Modulator (eFlexPWM)を使ってみる
サンプルのインポート
-
File→New→Import SDK Example(s)を選択する
-
ボードに合わせてSDKを選択(ここではfrdmmcxa153)
-
Import projectsウィンドウが開くので、driver_example/pwmを選択してインポート
-
ウィンドウ右上のアイコンをクリックして出力ピンを設定する。デフォルトではPWM A0, A1, A2がそれぞれPin44(GPIO3_6), Pin42(GPIO3_8), Pin40(GPIO3_10)に割り当てられている。
6. ビルドして実行
結果
PWM A0, A1の出力
PWM A0,B0の出力設定
PWM0から2つの出力を行うための設定(Fault Controlは利用しない)
/* Freescale includes. */
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"
#include "fsl_lpuart.h"
#include "fsl_pwm.h"
#define PWM_CHANNEL kPWM_PwmA // PWMチャンネルを設定(チャンネルAを使用)
#define PWM_FREQUENCY 50U // PWM周波数を設定(50Hz)
// PWMの初期化関数
static void PWM_DRV_Init(void)
{
// FLEXPWM0のクロックを有効化
CLOCK_EnableClock(kCLOCK_GateFLEXPWM0);
// PWMの設定構造体
pwm_config_t pwmConfig;
pwm_fault_param_t faultConfig;
uint32_t pwmVal = 4;
// PWMのデフォルト設定を取得
PWM_GetDefaultConfig(&pwmConfig);
// 分周比を128に設定
pwmConfig.prescale = kPWM_Prescale_Divide_128;
// フルサイクルリロードモードを使用
pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle;
// PWM AとPWM Bを補完モードで動作させる
pwmConfig.pairOperation = kPWM_ComplementaryPwmA;
pwmConfig.enableDebugMode = true; // デバッグモードを有効化
// サブモジュール0を初期化
if (PWM_Init(FLEXPWM0, kPWM_Module_0, &pwmConfig) == kStatus_Fail)
{
PRINTF("PWMの初期化に失敗しました\n");
return 1; // エラーコードを返す
}
// フォルト(異常)設定のデフォルト値を取得
PWM_FaultDefaultConfig(&faultConfig);
faultConfig.faultLevel = 1; // フォルト時のレベルを1に設定
// PWMのフォルト保護を設定
PWM_SetupFaults(FLEXPWM0, kPWM_Fault_0, &faultConfig);
// サブモジュール0でPWM A/Bのフォルト無効マッピングを設定
PWM_SetupFaultDisableMap(FLEXPWM0, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0);
PWM_SetupFaultDisableMap(FLEXPWM0, kPWM_Module_0, kPWM_PwmB, kPWM_faultchannel_0, kPWM_FaultDisable_0);
// デッドタイムや信号の設定
uint16_t deadTimeVal;
pwm_signal_param_t pwmSignal[2];
uint32_t pwmSourceClockInHz;
uint32_t pwmFrequencyInHz = 50 * 4; // PWM周波数を計算
// ソースクロックを取得
pwmSourceClockInHz = (CLOCK_GetFreq(kCLOCK_BusClk));
// デッドタイムを約650nsに設定
deadTimeVal = ((uint64_t)pwmSourceClockInHz * 650) / 1000000000;
// PWM Aの設定
pwmSignal[0].pwmChannel = kPWM_PwmA;
pwmSignal[0].level = kPWM_HighTrue;
pwmSignal[0].deadtimeValue = deadTimeVal;
pwmSignal[0].faultState = kPWM_PwmFaultState0;
pwmSignal[0].pwmchannelenable = true;
// PWM Bの設定
pwmSignal[1].pwmChannel = kPWM_PwmB;
pwmSignal[1].level = kPWM_HighTrue;
pwmSignal[1].deadtimeValue = deadTimeVal;
pwmSignal[1].faultState = kPWM_PwmFaultState0;
pwmSignal[1].pwmchannelenable = true;
// PWM設定をサブモジュール0に適用
PWM_SetupPwm(FLEXPWM0, kPWM_Module_0, pwmSignal, 2, kPWM_SignedCenterAligned, pwmFrequencyInHz, pwmSourceClockInHz);
// バッファからレジスタに設定をロード
PWM_SetPwmLdok(FLEXPWM0, kPWM_Control_Module_0 , true);
// サブモジュール0でPWM生成を開始
PWM_StartTimer(FLEXPWM0, kPWM_Control_Module_0);
// PWM A/Bのデューティ比を設定
PWM_UpdatePwmDutycycle(FLEXPWM0, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, 50);
PWM_UpdatePwmDutycycle(FLEXPWM0, kPWM_Module_0, kPWM_PwmB, kPWM_SignedCenterAligned, 25);
}
// メイン関数
int main(void) {
// ハードウェアの初期化
BOARD_InitHardware();
// PWMの初期化
PWM_DRV_Init();
// 無限ループ
for(;;) {
;
}
return 0;
}
Discussion