完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本方法实测有效,可以提高转换精度。数据采集滤波求平均值的方法也可以用于其他专业AD转换芯片。如果转换要求高精度,必须注意REF参考源电压的稳定性。
uint32_t ADC_Single_Convert(void) { HAL_GPIO_WritePin(ADC_GPIO_Port,ADC_Pin, GPIO_PIN_RESET); //打开ADC开关 HAL_Delay(10);//等待电压稳定 HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 50); uint8_t i=255; while (!HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) { i--; if (i ==0) { break; //防止AD死循环 } } uint32_t ad_Temp = HAL_ADC_GetValue(&hadc1); HAL_GPIO_WritePin(ADC_GPIO_Port,ADC_Pin, GPIO_PIN_SET); //关闭ADC开关 return ad_Temp; } /*电压采样14次,去掉2个最大值,2个最小值,剩余10个值求平均数*/ void ADC_Dxpd(void) { int i, j, temp, isSorted; //优化算法:最多进行 n-1 轮比较 for(i=0; i<14-1; i++) { isSorted = 1; //假设剩下的元素已经排序好了 for(j=0; j<14-1-i; j++) { if(adc_nums[j] > adc_nums[j+1]) { temp = adc_nums[j]; adc_nums[j] = adc_nums[j+1]; adc_nums[j+1] = temp; isSorted = 0; //一旦需要交换数组元素,就说明剩下的元素没有排序好 } } if(isSorted) break; //如果没有发生交换,说明剩下的元素已经排序好了 } } /*求10个数的平均值*/ uint16_t ADC_Average(void) { uint16_t sum = 0; for(uint8_t i=2; i<12; i++) { sum = sum + adc_nums; } return sum/10; } void Get_Batvotage(void) { uint16_t Value_average; HAL_ADC_MspInit(&hadc1); HAL_Delay(1); HAL_ADCEx_Calibration_Start(&hadc1);//自校准 HAL_Delay(10); for(uint8_t i=0; i<14; i++) { adc_nums = ADC_Single_Convert(); HAL_Delay(10); } HAL_ADC_Stop(&hadc1); HAL_ADC_MspDeInit(&hadc1); ADC_Dxpd(); Value_average = ADC_Average(); } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2812 浏览 0 评论
3352 浏览 9 评论
3030 浏览 16 评论
3526 浏览 1 评论
9135 浏览 16 评论
1258浏览 3评论
650浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
638浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2387浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1951浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 06:08 , Processed in 1.004300 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号