0

タイトルにあるように、STM32 で割り込みが 1 マイクロ秒続く場合、正しいデューティ サイクルを達成するために、カウンター サイクルで変換された 1 マイクロ秒で CCR を補正する必要がありますか?

たとえば、周期が 100Khz でオーバーフロー割り込みが 1 マイクロ秒の場合、CCR = 50Khz を使用して 50% のデューティ サイクルを達成する必要がありますか、それとも CCR = 50kHz - 割り込み遅延を使用する必要がありますか? 次の周期/デューティ サイクルの組み合わせを動的にプリロードするためにシャドウ レジスタを使用していることに注意してください。

オシロスコープの測定値は、秒を教えてくれます。

自動補正のフラグはありますか?

いくつかのコードスニペットの下

void MX_TIM9_Init(void){
    TIM_OC_InitTypeDef sConfigOC;
    htim9.Instance = TIM9;
    htim9.Init.Prescaler = PSC; // Get clock to <freq> Hz
    htim9.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim9.Init.Period = 250;
    htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    HAL_TIM_PWM_Init(&htim9);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 125;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1);

    __HAL_TIM_ENABLE_IT(&htim9, TIM_IT_UPDATE);
    TIM9->CR1 |= TIM_CR1_ARPE;
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm){
    GPIO_InitTypeDef GPIO_InitStruct;
    if(htim_pwm->Instance==TIM9){    
         __TIM9_CLK_ENABLE();
         /* Peripheral interrupt init*/
        HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 1, 1);
        HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
        GPIO_InitStruct.Pin = GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF3_TIM9;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
    }
}

void TIM1_BRK_TIM9_IRQHandler(void){
    if(__HAL_TIM_GET_FLAG(&htim9, TIM_FLAG_UPDATE) != RESET){
        if(__HAL_TIM_GET_IT_SOURCE(&htim9, TIM_IT_UPDATE) !=RESET){
            __HAL_TIM_CLEAR_IT(&htim9, TIM_IT_UPDATE);
            myFunction(void);
        }
    }
}

void myFunction(){
    //perform logics with if
    tim9->ARR = r; // r is a value coming from the logics above
    tim9->CCR1 = r / 2;
}
4

1 に答える 1