こんにちは、別の問題があります。以前質問して解決しましたが、LDOKレジスタが間違っていました。
しかし、それを解決した後でも、私が求めていること、つまりCnVを更新してパルス幅を変更することはまだ実行されません。助けてください。これは私が取り組んでいたコードです。
#include "MKE02Z4.h"
#define FTM_MOD 24 // 25 ticks → 1.25us @ 20MHz
#define TICKS_0 7
#define TICKS_1 14
void FTM_Init(void)
{
SIM->SCGC |= SIM_SCGC_FTM2_MASK;
FTM2->MODE = FTM_MODE_WPDIS_MASK | FTM_MODE_FTMEN_MASK;
FTM2->CNTIN = 0;
FTM2->CNT = 0;
FTM2->MOD = FTM_MOD;
FTM2->CONTROLS[0].CnSC =
FTM_CnSC_MSB_MASK |
FTM_CnSC_ELSB_MASK;
FTM2->CONTROLS[0].CnV = TICKS_0;
/* ENABLE CHANNEL OUTPUT (CRITICAL) */
FTM2->OUTMASK &= ~(1 << 0);
/* Initial load */
*(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0201;
FTM2->SC = FTM_SC_CLKS(1) | FTM_SC_PS(0);
*(volatile __UINT32_TYPE__ *)0x4003A064 = 0x00;
}
static inline void wait_ftm_period(void)
{
while(!(FTM2->SC & FTM_SC_TOF_MASK));
FTM2->SC &= ~FTM_SC_TOF_MASK;
}
uint32_t word = 0x5555;
int main(void)
{
FTM_Init();
while (1)
{
for(int i = 0; i < 16; i++)
{
if (word & (1UL << i))
*(volatile __UINT32_TYPE__ *)0x4003A010 = TICKS_1;
else
*(volatile __UINT32_TYPE__ *)0x4003A010 = TICKS_0;
/* ARM reload for next PWM cycle */
*(volatile __UINT32_TYPE__ *)0x4003A098 = 0x0201;
/* WAIT ONE PWM PERIOD */
wait_ftm_period();
}
}
}こんにちは@Jana_muralidharan ]
こんにちは、私はこの記事の筆者です。WS2812Bで作業しているので、PWMを使用して信号を生成することを考えました。SO、デューティサイクルを変更することについて考えていますが、これでそれが可能でしょうか?
こんにちは@Jana_muralidharan
FTM_UpdatePwmDutycycle() API を使用してください。ftm_simple_pwmデモを参照してください。/*!
* brief アクティブな PWM 信号のデューティ サイクルを更新します。
*
*パラメータベース FTM ペリフェラル ベース アドレス
* param chnlNumber チャネル/チャネルペア番号。複合モードでは、これは
* チャネルペア番号
*パラメータcurrentPwmMode PWMセットアップ中に設定された現在のPWMモード
*パラメータdutyCyclePercent 新しいPWMパルス幅。値は0から100の間である必要があります。
* 0 = 非アクティブ信号 (デューティ サイクル 0%)...
* 100=アクティブ信号(100%デューティサイクル)
* PWM更新が成功した場合はkStatus_Successを返します
* 失敗時のkStatus_Error
*/
status_t FTM_UpdatePwmDutycycle ( FTM_Type *base,
ftm_chnl_t chnl番号、
ftm_pwm_mode_t現在のPwmモード、
uint8_tデューティサイクルパーセント)
こんにちは@Jana_muralidharan
BR
アリス
ハハ、私も似たような問題に遭遇して、試行錯誤の末にようやく解決しました。
S32K144では、スイッチング周波数とデューティサイクルを同時に変更してみたところ、周波数は任意に変更できるものの、同時に変更したデューティサイクルは変更できないことがわかりました。最終的に問題の原因を突き止めました。それはFTM_SC_CLKSというビットにありました。
FTMが初期化され起動したら、CnVの値を変更するには、まずFTM_SC_CLKS=0に設定する必要があります。これによりクロックソースがオフになり、FTMの動作が停止します。次にCnVを変更し、最後にFTM_SC_CLKSを再び1に設定してデューティサイクルを変更します。
MKE02Z4とS32K144は似たようなFTMを搭載していると思うので、動作原理も同じはずです。試してみてもいいかもしれません。
幸運を!