这里做了个简单的滤波提高使用fr8000系列芯片时电池电压采样的精度,供大家参考
主要是采集了几十次,然后排序去头去尾再取平均值:
__attribute__((section("ram_code"))) void change_adc_data(uint16_t *data,uint32_t len)
{
uint16_t n, m, i, j, temp;
n= len;
m = n; //因为每进行一次第一轮循环,需要排序的数据都要“--”,因此定义变量m=n;
for (i = 0; i < n; i++) {
int exchange = 0; //记录这一轮会不会有数据的交换;
for (j = 0; j < m-1; j++) {
if (data[j] > data[j + 1]) {
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
exchange = 1;
}
}
m--;
if (!exchange) //若没有数据的交换,则数据已经排列完毕,跳出循环;
break;
}
}
void vbat_adc_enable(void)
{
GPIO_InitTypeDef GPIO_Handle;
adc_InitParameter_t ADC_InitParam;
__SYSTEM_ADC_CLK_ENABLE();
__SYSTEM_GPIO_CLK_ENABLE();
pmu_set_pin_to_CPU(GPIO_PORT_D,BIT(GPIO_BIT_6));
GPIO_Handle.Pin = GPIO_PIN_6;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pull = GPIO_NOPULL;
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
gpio_init(GPIO_D, &GPIO_Handle);
ADC_InitParam.ADC_CLK_DIV = 5;
ADC_InitParam.ADC_SetupDelay = 80;
ADC_InitParam.ADC_Reference = ADC_REF_1P2V;
ADC_InitParam.FIFO_Enable = FIFO_DISABLE;
// ADC_InitParam.FIFO_AlmostFullLevel = 0;
adc_init(ADC_InitParam);
adc_Channel_ConvertConfig(ADC_CHANNEL_1);
adc_convert_enable();
//co_printf("ENTER ADC enable \r\n");
return;
}
//这里获取了50个值 去头10个去尾10个,再取平均。实际也可以根据自己需求修改
void vbat_adc_get(void)
{
uint16_t adc_data[50] = {0};
uint32_t result_temp = 0;
for(uint8_t i = 0;i<50;i++)
{
while(adc_DataValid_status() == 0){};
adc_data[i] = adc_get_data_FT();
}
change_adc_data(adc_data,50) ;
for(uint8_t i = 10;i<40;i++)
{
result_temp += adc_data[i];
}
result_temp = result_temp/30;
co_printf("ADC = %d\r\n",result_temp );
}
如上参考代码就完成了。我们直接用result_temp的值来计算自己的采集电压就可以了。