前言
由于STM32F1ADC的精度最高位12位,在一些精度要求高的场景明显不足,因此需要提高ADC的精度,这里采用过采样发来提高ADC精度
一、软件实现部分
我是基于正点原子战舰V3的板子来实现的,主要就是对输入信号设置好相应的采样率,满住奈奎斯特的至少两倍原则。然后根据要提高多少位精度对多少个ADC采集数据进行相加,然后进行移位来确定精度(不是简单的取平均)。
下面展示一些 内联代码片。
- // A code block
- /*ADC_OVSR:过采样率,取值2,4,8,16,32,64,128,256*/
- #define ADC_OVSR 256
- /*ADC_shif:ADC结果右移,0~8/
- #define ADC_shift 4
复制代码- //在freemodbus下我只能实现15位精度,因为他的保持寄存器是u16的,还不知道怎么改底层函数
- void adc_20bit_value(void)
- {
- static u32 adc_buff=0,adc_sum = 0;
- static float adc_volt=0;
- if(adc_500ms_flag == 1)
- {
- adc_500ms_flag=0;
- printf("\r\n The current AD value = %d \r\n", ADCConvertedValue);
- printf("The acurate AD value = %d \r\n", ADC_ACCURATE_DAT);
- printf("The acurate AD value = %.8f \r\n", adc_volt);
- }
-
- if(adc_10ms_flag == 1) //¹ý²ÉÑùµÃµ½16λadcÖµ
- {
- adc_10ms_flag = 0;
-
- for(adc_buff=1;adc_buff<=ADC_OVSR;adc_buff++)
- {
- adc_sum = adc_sum+ADCConvertedValue;
- if(adc_buff==ADC_OVSR)
- {
- ADC_ACCURATE_DAT = adc_sum>>ADC_shift;
- adc_sum = 0;
- }
- }
- adc_volt= (float)ADC_ACCURATE_DAT/1048576*3.3;
- }
-
- }
复制代码
————————————————
版权声明:qq_44637112
如有侵权请联系删除
|