MM32F0163项目,新建一个查表法的表单,以下是我相关程序#define WADC_0MM 2589
#define WADC_1MM 2542
#define WADC_2MM 2495
#define WADC_16MM 1851
#define WADC_17MM 1795
#define WADC_18MM 1731
#define MIN_ADC WADC_18MM
#define MAX_ADC WADC_0MM
const uint16_t W_seg_points[SEGMENTS+1][2]= //jerry多点标定
{
{WADC_0MM,50}, //x1,y1(5%占空比) 0mm
{WADC_1MM,95}, //x2,y2(9.5%占空比) 1mm
{WADC_2MM,140}, //x3,y3(14.0%占空比) 2mm
{WADC_16MM,770}, //x4,y4(77.0%占空比) 16mm
{WADC_17MM,815}, //x5,y5(81.5%占空比) 17mm
{WADC_18MM,860}, //x6,y6(86.0%占空比) 18mm
};
uint16_t W_pwm_lookup_table[MAX_ADC-MIN_ADC+1];
void InitLookupTable_W()
{
for(uint8_t seg=0; seg<SEGMENTS; seg++)
{
uint16_t x_start = W_seg_points[seg][0];
uint16_t x_end = W_seg_points[seg+1][0];
uint16_t y_start = W_seg_points[seg][1];
uint16_t y_end = W_seg_points[seg+1][1];
int32_t delta_x = (int32_t)x_end - x_start;
int32_t step = (delta_x > 0) ? 1 : -1;
uint32_t iterations = abs(delta_x);
for(uint32_t i=0; i<=iterations; i++)
{
uint32_t x = x_start + i*step;
// 带符号的精确计算
int32_t numerator = (int32_t)(x - x_start) * (y_end - y_start);
int32_t denominator = delta_x;
int32_t rounded = (numerator + (denominator / 2)) / denominator; // 正负通用
uint16_t y = y_start + (uint16_t)rounded;
// 计算数组偏移量
uint32_t idx = x - MIN_ADC;
if(idx <= (MAX_ADC - MIN_ADC))
{
W_pwm_lookup_table[idx] = y;
}
printf("x=%d, y_calc=%d, y_expected=%.1f\r\n",
x, y, y_start + (x - x_start)*(float)(y_end - y_start)/((int32_t)x_end - (int32_t)x_start));
}
}
}这是相关函数,然后是主函数初始化,然后调用相关语句如下
InitLookupTable_W();// 初始化查找表
WcompareValue=W_pwm_lookup_table[ch7_median];程序的问题是:当我变量ch7_median值为WADC_XMM跟WADC_(X+1)MM中间的一个值时,W_pwm_lookup_table[]输出的不是这中间的一个值,而是定义的端点值,通过打印串口数据,数据如下:
x=2589, y_calc=50, y_expected=50.0
x=2588, y_calc=51, y_expected=-4112202752.0
x=2587, y_calc=52, y_expected=-4112202752.0
x=2586, y_calc=53, y_expected=-4112202752.0
x=2585, y_calc=54, y_expected=-4112202752.0
x=2584, y_calc=55, y_expected=-4112202752.0
x=2583, y_calc=56, y_expected=-4112202752.0
…
x=2542, y_calc=95, y_expected=-4112202752.0
x=2542, y_calc=95, y_expected=95.0
x=2541, y_calc=96, y_expected=-4112202752.0
…
x=2495, y_calc=140, y_expected=-4112202752.0
x=2495, y_calc=140, y_expected=140.0
x=2494, y_calc=141, y_expected=-4201598208.0
…
x=1851, y_calc=770, y_expected=-4201597440.0
x=1851, y_calc=770, y_expected=770.0
x=1850, y_calc=771, y_expected=-3451312128.0
…
x=1795, y_calc=815, y_expected=-3451312128.0
x=1795, y_calc=815, y_expected=815.0
x=1794, y_calc=816, y_expected=-3019898112.0
…
最新发布