#define ADC_TIMES 30 #define ADCLOST 7 unsigned int GetADC(unsigned char ch) { unsigned int i, j; unsigned int buf[ADC_TIMES]; unsigned long int sum; long int temp; static long int XQ = 0; ADC_Set(ch); for(i=0; i < ADC_TIMES; i++) { buf[i] = ADC_GetConversionValue(ADC1);; delay_us(100); } for(i = 0; i < ADC_TIMES - 1; i++) { for(j = i + 1; j < ADC_TIMES; j++) { if(buf[i] > buf[j]) { temp = buf[i]; buf[i] = buf[j]; buf[j] = temp; } } } sum = 0; for(i = ADCLOST; i < ADC_TIMES - ADCLOST; i++) { sum += buf[i]; } temp = sum / (ADC_TIMES - 2 * ADCLOST); if( (XQ>=temp && (XQ-temp)<=1 ) || (XQ<temp && (temp-XQ)<=1)) { temp = XQ; } else { XQ = temp; } return (unsigned int)(temp); }
时间: 2023-06-16 14:04:37 浏览: 77
这是一个获取ADC值的函数,其中包含了一些滤波和去抖动的操作。函数的主要流程如下:
1. 设置ADC通道
2. 获取ADC值,并将其存储到buf数组中
3. 对buf数组进行排序,去掉最小值和最大值
4. 计算buf数组的平均值,作为最终ADC值
5. 进行去抖动处理,如果当前ADC值与上一次的值相差不超过1,则将其认为是同一个值,否则更新XQ和当前ADC值
其中,ADC_TIMES表示获取ADC值的次数,ADCLOST表示去掉最小值和最大值的个数,可以根据需要进行调整。
阅读全文