1. 问题描述
我使用rtt4.1.1版本,其中adc采样直接采用cubemx生成的库函数,用DMA读取方式读取AD的值。并在DMA中断内回调AD值计算函数。
结果在做滑动平均值滤波的时候出现了问题。一个未初始化的全局变量在第二次进入中断的时候被意外赋值了。这造成了计算结果的不正确。如果用sta
tic修饰这个变量后,则不会出现这个状况。下面是问题描述。
2. 变量声明
int32_t voltage_rms_sum_a;
int32_t voltage_rms_sum_b;
int32_t voltage_rms_sum_c;
3.滑动平均值滤波
if (adc_convert_full == 1)
{
voltage_rms_a = (int)(sqrtf(voltage_square_add_a/20)*10);
voltage_rms_b = (int)(sqrtf(voltage_square_add_b/20)*10);
voltage_rms_c = (int)(sqrtf(voltage_square_add_c/20)*10);
voltage_square_add_a = voltage_square_add_a-voltage_square_a[adc_convert_cnt];
voltage_square_add_b = voltage_square_add_b-voltage_square_b[adc_convert_cnt];
voltage_square_add_c = voltage_square_add_c-voltage_square_c[adc_convert_cnt];
voltage_rms_buf_a[rms_average_calc_cnt]= voltage_rms_a;
voltage_rms_sum_a=voltage_rms_sum_a+voltage_rms_buf_a[rms_average_calc_cnt];
voltage_rms_buf_b[rms_average_calc_cnt]= voltage_rms_b;
voltage_rms_sum_b=voltage_rms_sum_b+voltage_rms_buf_b[rms_average_calc_cnt];
voltage_rms_buf_c[rms_average_calc_cnt]= voltage_rms_c;
voltage_rms_sum_c=voltage_rms_sum_c+voltage_rms_buf_c[rms_average_calc_cnt];
rms_average_calc_cnt++;
}
4. 问题
adc_convert_full这个变量被设计为20次中断后开始滤波,意味着20次循环后,才会进入if语句。但是如果用断点调试后发现,第一次进入时。
第20行,voltage_rms_sum_c变量为0,但是第二次进入中断后,voltage_rms_sum_c变量为0被赋值为一个意外的值。我看了内存的分配,也没有发现内存重复的情况。
5. 临时解决办法
将voltage_rms_sum_a、voltage_rms_sum_b、voltage_rms_sum_c增加static修饰,可以解决问题,但是我不明白为什么会这样。