STC8单片机ADC采样注意事项
STC8单片机ADC采样注意事项
最近在做一个模块,使用宏晶公司的STC8单片机开发,模块主要使用了单片机的ADC采样功能,因为需要10个以上的通道,而且模块要经常震动,所以希望使用一种耐操一点的芯片, 于是我使用了STC8系列的单片机,有16路通道的ADC,采样精度是12位,可以比较好的满足我的要求。 一开始模块做的还不错,半年之后有一次要进行改进,在程序上我加大了单片机通道切换之间的时间,然而最后却出现了采样出错的现象。
因为我要轮询所有的ADC通道,出于设计方面,我采用了特别的采样顺序,采样出错的结果不知道是怎么回事,在改了程序之后便出现了问题, 我一直认为是程序的问题,搞到最后怀疑人生了,,感觉难道这又是STC的一个bug?
不过,最后我终于在网上找到了一个线索,并且尝试按照那个方法改了一下程序,ojbk了。 贴一下那个线索的原话:
如果输入信号内阻很大(超过1K就算大了,如果10K就很大了),ADC输入端对地接一个0.01~0.1uF的电容。
切换通道后,第一次转换值丢弃。为什么会有这些要求?为什么外挂专门的ADC也一样的有这种要求?
对于没有输入缓冲的ADC(STC的ADC输入就是没有缓冲的),采样时ADC输入端通过一个电阻(r,通常是几K欧姆)给采样电容C充电(采样电容一般是10~30PF,STC的可以按30PF计算),假设信号源内阻为R0,则采样充电就是((R0+r)*C),采样时间t一般是很短的,比如STC最快时采样就是几个时钟,时间很短。
贴一下我的ADC采集函数(更改之前的):
/*** [ADCRead description]* @Author 叶鹏程* @DateTime 2019-08-01T20:24:46+0800* @discrption : ADC采样函数,* * @param n [要采样的通道]* @param value_point [采样值存放地址]*/
void ADCRead(uint8_t n,unsigned int xdata *value_point){unsigned int adc_value = 0;ADC_SET_CHANEL(n); //设置当前待转换的ADC通道ADC_START_ENABLE();while(ADC_STATE()); //等待转换ADC_FLAG_CLEAR(); adc_value = (int)ADC_RES << 8; //读取ADC结果adc_value |= (int)ADC_RESL;adc_value = adc_value>>4;*value_point = adc_value;
}
这是按照线索,更改之后的:
/*** [ADCRead description]* @Author 叶鹏程* @DateTime 2019-08-01T20:24:46+0800* @discrption : ADC采样函数,* * @param n [要采样的通道]* @param value_point [采样值存放地址]*/
void ADCRead(uint8_t n,unsigned int xdata *value_point){unsigned int adc_value = 0;ADC_SET_CHANEL(n); //设置当前待转换的ADC通道ADC_START_ENABLE();while(ADC_STATE()); //等待转换ADC_FLAG_CLEAR(); /* 这是清除了第一次转换的值,采用第二次采样,这样在切换通道时更加稳定*/ADC_START_ENABLE();while(ADC_STATE()); //等待转换ADC_FLAG_CLEAR(); adc_value = (int)ADC_RES << 8; //读取ADC结果adc_value |= (int)ADC_RESL;adc_value = adc_value>>4;*value_point = adc_value;
}
总结,这是ADC电路的问题, 以后一定要注意这些东西, 看来还是自己的知识没有学扎实。 加油!
转载于:https://www.cnblogs.com/Gentleaves/p/11285243.html
STC8单片机ADC采样注意事项相关推荐
- 单片机ADC采样算法----递推平均值采样法
在上一篇文章单片机ADC采样算法---平均值采样法中分析了平均值采样法的使用,上篇文章中的平均值采样法是连续采样100个数据,然后求平均值,这种方法存在一个问题,就是采集100个值之后,下一次又重新采 ...
- c语言adc采集取平均值,单片机ADC采样算法----递推平均值采样法
在上一篇文章单片机ADC采样算法---平均值采样法中分析了平均值采样法的使用,上篇文章中的平均值采样法是连续采样100个数据,然后求平均值,这种方法存在一个问题,就是采集100个值之后,下一次又重新采 ...
- 关于单片机ADC采样参考电压应注意事项
问题描述: 工程和品质部反应现场安装的水表有水量跳变的情况,就是基表上显示0吨,远程抄读水量的时候电子读数是4400.4000.4440等错误的数字,在排除了传感器板本身晶圆损坏的情况下,发现还有几只 ...
- 单片机ADC采样算法----一阶低通滤波
关于低通滤波,先看一下百度百科上的定义. 算法实现的公式如下: y(n) = q*x(n) + (1-q)*y(n-1) 其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中 ...
- 单片机ADC采样算法----平均值采样法
单片机在模拟电路中使用的时候,经常需要用到AD功能,而通过单片机ADC采集回来的数据往往不能直接使用,在不同场合下需要对采集到的数据要通过不同的算法对数据进行处理,先来看看最简单的平均值采样法. 平均 ...
- 单片机ADC采样算法----有效值采样法
在使用单片机ADC功能采样数据时,通常情况下用平均值计算就够了,但是在计算功率时就需要用有效值来计算真正做功的情况.如果是标准的正弦波的话,正弦波的峰值是有效值得1.414倍,可以通过峰值来计算有效值 ...
- STM8单片机ADC采样功能通过定时器触发
在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束. 有时候采样ADC数据 ...
- STM32F4单片机ADC采样及ARM-DSP库的FFT
模拟信号经过ADC采样后变成数字信号,数字信号可以进行FFT运算,在频域中更容易分析信号的特征.本文将介绍如何用STM32F4的进行ADC采样,并利用ARMDSP库里的FFT算法对ADC采样值进行快速 ...
- 单片机ADC采样算法----卡尔曼滤波
关于卡尔曼滤波,看看百度百科上的定义 算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 "预测量" 和 "误差",计算得到当前的最优量 ...
最新文章
- 迁移学习 迁移参数_迁移学习简介
- Java基本语法(15)--while循环结构do-while循环结构
- H5唤醒app,不完全兼容
- Exchange Server 2016管理系列课件22.通讯组概述
- android:videoView
- 讲讲我理解的XLNet
- 数据库表格数据导出到excel方法总结
- RHEL6.1 去掉开机总是提示注册啊,去掉rhsm-compliance-icon小图标
- 集成 push kit 签名配置报6003/收不到华为推送
- html闹钟设置,闹钟设置页.html
- 陈强教授《机器学习及R应用》课程 第六章作业
- 网管实战(4):网关地址与子网掩码
- 万物互联之边缘计算简述-背景
- 马尔科夫链细致平衡条件
- PyCharm下载和安装
- comsol如何定义狄利克雷边界_有限元分析(FEA)是个什么东东
- 架构师之路工作量化与细化
- Android之vold进程启动源码分析
- 面向对象设计的六大原则
- 推荐《怪诞行为学:可预测的非理性》