2267521_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2267521_ja-JP

2267521_ja-JP

FTM CnV更新問題2

こんにちは、別の問題があります。以前質問して解決しましたが、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();
        }
    }
}
Re: FTM CnV Update Problem 2

こんにちは@Jana_muralidharan ]

すみません、ちょっと混乱してしまいました。PWM のデューティ サイクルを変更する方法を尋ねているのでしょうか、それともデューティ サイクルが変更された理由を尋ねているのでしょうか。
 
よろしくお願いします。
 
BR
アリス
Re: FTM CnV Update Problem 2

こんにちは、私はこの記事の筆者です。WS2812Bで作業しているので、PWMを使用して信号を生成することを考えました。SO、デューティサイクルを変更することについて考えていますが、これでそれが可能でしょうか?


Re: FTM CnV Update Problem 2

こんにちは@Jana_muralidharan

PWM デューティ サイクルを更新するには、 FTM_UpdatePwmDutycycle() API を使用してください。
詳細については、PWM デューティ サイクルが定期的に更新される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デューティサイクルパーセント)

 

BR
アリス


Re: FTM CnV Update Problem 2こんにちは@Alice_Yang
はい、私はPWMデューティサイクルを毎サイクル変更しようとしています。例えば、第1周期は30%デューティサイクル、第2周期は70%デューティサイクルなどです。

PWMデューティを変更する手順はありますか?

ここでの問題は、最初に設定された値で止まってしまうことです
Re: FTM CnV Update Problem 2しかし、PWMがどのくらいの周期で更新されるのか教えていただけますか?Re: FTM CnV Update Problem 2

こんにちは@Jana_muralidharan

これはアプリケーションによって異なります。要件設計を参照できます。
この SDKs デモでは、タイマーオーバーフロー割り込みを使用して PWM デューティサイクルを更新します。
Alice_Yang_0-1766732600601.png

BR

アリス


Re: FTM CnV Update Problem 2

ハハ、私も似たような問題に遭遇して、試行錯誤の末にようやく解決しました。

S32K144では、スイッチング周波数とデューティサイクルを同時に変更してみたところ、周波数は任意に変更できるものの、同時に変更したデューティサイクルは変更できないことがわかりました。最終的に問題の原因を突き止めました。それはFTM_SC_CLKSというビットにありました。

FTMが初期化され起動したら、CnVの値を変更するには、まずFTM_SC_CLKS=0に設定する必要があります。これによりクロックソースがオフになり、FTMの動作が停止します。次にCnVを変更し、最後にFTM_SC_CLKSを再び1に設定してデューティサイクルを変更します。

MKE02Z4とS32K144は似たようなFTMを搭載していると思うので、動作原理も同じはずです。試してみてもいいかもしれません。

幸運を!

Tags (1)
No ratings
Version history
Last update:
Saturday
Updated by: