프로그램/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;
}
반응형