Brise

타이머 prescale, period 찾는 프로그램 본문

프로그램/C,C++

타이머 prescale, period 찾는 프로그램

naudhizb 2024. 6. 6. 16:01
반응형

목표하는 실행 주기에 가장 가까운 prescale과 period를 찾는 코드 예제입니다.

prescale도 bsearch방식으로 찾으면 좀 더 빨리 찾을 수 있습니다만,
높은 실행주기를 target으로 하는 코드라 prescale이 커질일이 별로 없어 순차방식으로 사용했습니다.

/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>
#include <stdint.h>
#include <math.h>


uint16_t binary_search(uint16_t low_value, uint16_t high_value, float targetHz, uint16_t prescale, uint32_t clk) {
    uint16_t mid;
    while (low_value <= high_value) {
        mid = (low_value + high_value) / 2;
        float tmpHz = (float)clk / (prescale * mid);

        printf("%5d %5d %5d / %.1f : %.1f\n", low_value, mid, high_value, targetHz, tmpHz);
        if ((high_value - low_value) <= 1) {
            return mid;  // 정확히 일치하는 경우 반환
        } else if (tmpHz < targetHz) {
            high_value = mid - 1;
        } else {
            low_value = mid + 1;
        }
    }
    return mid;  // 가장 가까운 값을 반환
}

void find_prescale_period(float targetperiod, uint32_t clk, uint16_t *prescale, uint16_t *period)
{
    const float targetHz = 1.0f/targetperiod;
    const uint16_t low_value = 0x0;
    const uint16_t high_value = 0xffff;
    for(int i = 1; i < high_value; i++)
    {
        // Hz = clk/prescale/period
        float tmpHz = 1.0f*clk/i/high_value;
        printf("[%5d] target : %.3f, tmp : %.3f\n", i, targetHz, tmpHz);
        if(targetHz > tmpHz)
        {
            *prescale = i;
            break;
        }
    }

    *period = binary_search(low_value, high_value, targetHz, *prescale, clk);
}


int main() {
    double targetperiod = 1.0f/32/60;  // 목표 실행 주기
    double clk = 168000000.0;       // 클럭 주파수
    uint16_t prescale, period;

    find_prescale_period(targetperiod, clk, &prescale, &period);
    printf("Prescale: %u, Period: %u\n", prescale, period);

    find_prescale_period(1.0f/32/30, clk, &prescale, &period);
    printf("Prescale: %u, Period: %u\n", prescale, period);

    find_prescale_period(1.0f/32/70, clk, &prescale, &period);
    printf("Prescale: %u, Period: %u\n", prescale, period);

    find_prescale_period(5, clk, &prescale, &period);
    printf("Prescale: %u, Period: %u\n", prescale, period);

    return 0;
}
반응형

'프로그램 > C,C++' 카테고리의 다른 글

[C++ 기본 4] 2. 추상클래스  (0) 2022.05.17
[C++ 기본 4] 1. 가상소멸자  (0) 2022.05.17
[C++ 기본3] 8. mangling  (0) 2022.05.15
[C++ 기본3] 7. 가상함수  (0) 2022.05.15
[C++ 기본3] 6. Upcasting  (0) 2022.05.15
[C++ 기본3] 5. 상속  (0) 2022.05.15
[C++ 기본3] 4. 상수멤버함수  (0) 2022.05.15
Comments