PWMキャプチャのプリスケーラ設定に関する問題 タコの外部周波数をキャプチャするために PWM 入力を使用しています。 標準設定ではすべて正常に動作しますが、初期化中にプリスケーラを適用すると pwmConfig.プリスケール= kPWM_Prescale_Divide_64 ; または設定することで void PWM_SetClockMode CVAL2とCVAL3の値は常に0x00であり、カウンタはカウントしていない 私の信号の周波数は200Hzです Re: Problems Setting Prescaler for PWM capture こんにちは、 私も同じ問題に遭遇しました。 4 つの PWM ペリフェラルのいずれかのクロック パースケーラを kPWM_Prescale_Divide_1 以外の値で設定すると、選択した PWM ペリフェラルのカウンターはまったく動作しません。 私はimxrt1062プロセッサとMCUXpresso IDE v11.9.1を使用しています。 できるだけ早くサポートしていただければ幸いです。 以下は、PWM ペリフェラルを設定および初期化するコードの一部です。 静的void pwm_init ( void ) { pwm_config_t pwmConfig; pwm_input_capture_param_tキャプチャ設定; pwm_fault_param_t障害構成; /* PWMのデフォルト設定を読み取る */ PWM_GetDefaultConfig(&pwmConfig); pwmConfig.clockSource = kPWM_BusClock ; pwmConfig.prescale = kPWM_Prescale_Divide_2 ; pwmConfig.pairOperation = kPWM_Independent ; pwmConfig.initializationControl = kPWM_Initialize_LocalSync ; pwmConfig. reloadLogic = kPWM_ReloadImmediate ; pwmConfig. reloadSelect = kPWM_LocalReload ; pwmConfig. reloadFrequency = kPWM_LoadEveryOportunity ; pwmConfig.forceTrigger = kPWM_Force_LocalSync ; pwmConfig.enableDebugMode = true; PWM_Init(PWM1_BASEADDR、 kPWM_Module_3 、&pwmConfig); PWM_Init(PWM2_BASEADDR、 kPWM_Module_3 、&pwmConfig); PWM_Init(PWM3_BASEADDR、 kPWM_Module_1 、&pwmConfig); PWM_Init(PWM4_BASEADDR、 kPWM_Module_1 、&pwmConfig); // 障害構成 PWM_FaultDefaultConfig(&faultConfig); /* PWM障害保護を設定します */ PWM_SetupFaults(PWM1_BASEADDR、 kPWM_Fault_0 、&faultConfig); PWM_SetupFaults(PWM1_BASEADDR、 kPWM_Fault_1 、&faultConfig); PWM_SetupFaults(PWM1_BASEADDR、 kPWM_Fault_2 、&faultConfig); PWM_SetupFaults(PWM1_BASEADDR、 kPWM_Fault_3 、&faultConfig); /* サブモジュール0/1/2のPWM障害無効化マッピングを設定する */ PWM_SetupFaultDisableMap(PWM1_BASEADDR、 kPWM_Module_0 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM1_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM1_BASEADDR、 kPWM_Module_2 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM1_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); /* PWM障害保護を設定します */ PWM_SetupFaults(PWM2_BASEADDR、 kPWM_Fault_0 、&faultConfig); PWM_SetupFaults(PWM2_BASEADDR、 kPWM_Fault_1 、&faultConfig); PWM_SetupFaults(PWM2_BASEADDR、 kPWM_Fault_2 、&faultConfig); PWM_SetupFaults(PWM2_BASEADDR、 kPWM_Fault_3 、&faultConfig); /* サブモジュール0/1/2のPWM障害無効化マッピングを設定する */ PWM_SetupFaultDisableMap(PWM2_BASEADDR、 kPWM_Module_0 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM2_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM2_BASEADDR、 kPWM_Module_2 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM2_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); /* PWM障害保護を設定します */ PWM_SetupFaults(PWM3_BASEADDR、 kPWM_Fault_0 、&faultConfig); PWM_SetupFaults(PWM3_BASEADDR、 kPWM_Fault_1 、&faultConfig); PWM_SetupFaults(PWM3_BASEADDR、 kPWM_Fault_2 、&faultConfig); PWM_SetupFaults(PWM3_BASEADDR、 kPWM_Fault_3 、&faultConfig); /* サブモジュール0/1/2のPWM障害無効化マッピングを設定する */ PWM_SetupFaultDisableMap(PWM3_BASEADDR、 kPWM_Module_0 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM3_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM3_BASEADDR、 kPWM_Module_2 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM3_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); /* PWM障害保護を設定します */ PWM_SetupFaults(PWM4_BASEADDR、 kPWM_Fault_0 、&faultConfig); PWM_SetupFaults(PWM4_BASEADDR、 kPWM_Fault_1 、&faultConfig); PWM_SetupFaults(PWM4_BASEADDR、 kPWM_Fault_2 、&faultConfig); PWM_SetupFaults(PWM4_BASEADDR、 kPWM_Fault_3 、&faultConfig); /* サブモジュール0/1/2のPWM障害無効化マッピングを設定する */ PWM_SetupFaultDisableMap(PWM4_BASEADDR、 kPWM_Module_0 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM4_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM4_BASEADDR、 kPWM_Module_2 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); PWM_SetupFaultDisableMap(PWM4_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、 kPWM_faultchannel_0 、 kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3 ); /* ワンショットポーリング用のPWMのキャプチャ入力を設定します */ キャプチャConfig.captureInputSel = true; キャプチャ構成。エッジ0 = kPWM_RiseAndFallEdge ; キャプチャーConfig.edge1 = kPWM_Disable ; キャプチャ設定。enableOneShotCapture = false; キャプチャ構成。edgeCompareValue = 1; PWM_SetupInputCapture(PWM1_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、&captureConfig); PWM_SetupInputCapture(PWM2_BASEADDR、 kPWM_Module_3 、 kPWM_PwmA 、&captureConfig); PWM_SetupInputCapture(PWM3_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、&captureConfig); PWM_SetupInputCapture(PWM4_BASEADDR、 kPWM_Module_1 、 kPWM_PwmA 、&captureConfig); PWM_SetPwmLdok(PWM1_BASEADDR、 kPWM_Control_Module_3 、true); PWM_SetPwmLdok(PWM2_BASEADDR、 kPWM_Control_Module_3 、true); PWM_SetPwmLdok(PWM3_BASEADDR、 kPWM_Control_Module_1 、true); PWM_SetPwmLdok(PWM4_BASEADDR、 kPWM_Control_Module_1 、true); PWM_StartTimer(PWM1_BASEADDR、 kPWM_Control_Module_3 ); PWM_StartTimer(PWM2_BASEADDR、 kPWM_Control_Module_3 ); PWM_StartTimer(PWM3_BASEADDR、 kPWM_Control_Module_1 ); PWM_StartTimer(PWM4_BASEADDR、 kPWM_Control_Module_1 ); } Problems Setting the Prescaler for PWM capture こんにちは。元の投稿者と同じ問題が発生しました。仕切りコードを削除したり、仕切り1に設定したりするとカウンターは正常に動作しますが、仕切り2以上に設定するとカウンターが停止します。原因は何でしょうか? void Capture_config(void)
{
pwm_input_capture_param_t pwm_input_capture;
gpio_pin_config_t PWM_pin_config;
//初始化输入捕获管脚
IOMUXC_SetPinMux(PWM2_PWMA03_IOMUXC, 0U); //设置外部引脚的复用功能
IOMUXC_SetPinConfig(PWM2_PWMA03_IOMUXC, PWMC_INPUT_PAD_CONFIG_DATA); //设置引脚的 pad 属性
PWM_pin_config.direction = kGPIO_DigitalInput;
PWM_pin_config.interruptMode = kGPIO_NoIntmode;
GPIO_PinInit(PWM2_PWMA03_GPIO, PWM2_PWMA03_GPIO_PIN, &PWM_pin_config);
//初始化输入捕获配置参数
pwm_input_capture.captureInputSel = false;
pwm_input_capture.edge0 = kPWM_RisingEdge;
//pwm_input_capture.edge1 = kPWM_FallingEdge;
pwm_input_capture.enableOneShotCapture = false;
//pwm_input_capture.edgeCompareValue = 10; //当captureInputSel为FALSE时,此处设值无意义
pwm_input_capture.fifoWatermark = 0;
PWM_SetupInputCapture(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_PwmA, &pwm_input_capture);
//开启捕获中断
//set_IRQn_Priority(PWM2_3_IRQn,Group4_PreemptPriority_0, Group4_SubPriority_0);//设置中断优先级
//PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable| kPWM_CaptureA1InterruptEnable );
PWM_EnableInterrupts(PI_PWM_BASEADDR, kPWM_Module_3, kPWM_CaptureA0InterruptEnable );
EnableIRQ(PWM2_3_IRQn);
}
/**
* @brief 初始化 PWM 配置参数
* @retval 无
*/
void PWM_config(void)
{
pwm_config_t pwmConfig;//定义pwm 配置结构体
PWM_Deinit(PI_PWM_BASEADDR, kPWM_Module_3);
/*设置AHB总线时钟和IP总线时钟*/
CLOCK_SetDiv(kCLOCK_IpgDiv, 0x3); /* Set IPG PODF to 3, divede by 4 */
/*设置pwm 错误输入为高电平,表示没有错误,只有当pwm 没有错误输入或者禁止错误检测才能正常输出pwm波*/
XBARA_Init(XBARA1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault0);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1Fault1);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault2);
XBARA_SetSignalsConnection(XBARA1, kXBARA1_InputLogicHigh, kXBARA1_OutputFlexpwm1234Fault3);
PWM_GetDefaultConfig(&pwmConfig);
pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle; //新值在上一个pwm周期输出结束之后加载到缓冲寄存器中
pwmConfig.pairOperation = kPWM_Independent; // 工作在独立模式
pwmConfig.clockSource = kPWM_BusClock;
pwmConfig.enableDebugMode = true; // 使能DebugMode
pwmConfig.prescale = kPWM_Prescale_Divide_128; //1320000000/128/65535=16Hz=PWM最小频率
//初始化 PWM 并且判断初始化是否成功
if (PWM_Init(PI_PWM_BASEADDR, kPWM_Module_3, &pwmConfig) == kStatus_Fail)
{
PRINTF("PWM initialization failed\n");
}
Capture_config();
PWM_SetPwmLdok(PI_PWM_BASEADDR,kPWM_Control_Module_3 , true);
PWM_StartTimer(PI_PWM_BASEADDR, kPWM_Control_Module_3 );
} Re: Problems Setting Prescaler for PWM capture こんにちは@mexp2さん、
まず初めに、ご返答が遅くなりましたことをお詫び申し上げます。
念のため確認ですが、 kPWM_Prescale_Divide_128をどこに配置しているか教えてください。pwmConfig.prescale=kPWM_Prescale_Divide_128;と記述すると良いかもしれません。pwmConfig.pairOperation=kPWM_Independent の後;PWM_Init()の前。また、どのクロック ソースを使用していますか?
最後に、プリスケーラの値を 64 未満にしてみませんか?
よろしくお願いいたします、ラウル。 Re: Problems Setting Prescaler for PWM capture imxRT1062をSDK v2.13.0で使用します。 /* Read the PWM default configuration */
PWM_GetDefaultConfig(&pwmConfig);
pwmConfig.reloadLogic = kPWM_ReloadImmediate;
pwmConfig.pairOperation = kPWM_Independent;
pwmConfig.enableDebugMode = true;
/* Init the pwm */
if( PWM_Init(TACHOPUMP_PERIPHERAL, TACHOPUMP_CHANNEL, &pwmConfig) == kStatus_Fail)
{
PRINTF("Can't initialize PWM\n");
return;
}
/* Configure the capture input of the PWM for one shot polling */
pwm_input_capture_param_t captureConfig;
captureConfig.captureInputSel = false;
captureConfig.edge0 = kPWM_RisingEdge;
captureConfig.edge1 = kPWM_RisingEdge;
captureConfig.enableOneShotCapture = true;
PWM_SetupInputCapture(TACHOPUMP_PERIPHERAL, TACHOPUMP_CHANNEL, TACHOPUMP_SIGNAL, &captureConfig);
PWM_SetPwmLdok(TACHOPUMP_PERIPHERAL, timerBitmask, true);
PWM_StartTimer(TACHOPUMP_PERIPHERAL, timerBitmask); このコードではすべて期待通りに動作しますが、設定にプリスケーラを追加すると pwmConfig.prescale = kPWM_Prescale_Divide_128; カウンターはもうカウントしていない Re: Problems Setting Prescaler for PWM capture こんにちは@mexp2さん、
お元気でお過ごしでしょうか。
さらにデバッグするために使用する i.MX プロセッサを指定してください。
ありがとう、よろしく。 サンケト・パレック
記事全体を表示