用STC官方的例程一试就好。 |
echowilson 发表于 2019-7-11 09:56 谢谢 |
能分享下编程么,小白学习下,谢谢 |
echowilson 发表于 2019-7-11 09:56 这等与开启ad电源,转换第一个端口ad值,然后再次开启电源,转换下一个端口ad值??? |
解决了! uint GetADCresults(uchar adcch) { ADC_RES = 0; ADC_RESL = 0; ADC_CONTR = ADC_POWER|ADC_START|adcch; Delay(10); while(!(ADC_CONTR & ADC_FLAG)); //等待ADC完成 ADC_CONTR &= ~ADC_FLAG; //清零ADC_FLAG ADC_CONTR &= ~ADC_START; //关闭ADC return (ADC_RES<<8 | ADC_RESL); } 最重要的是这一句。初始化的时候不要上电。在采样函数中每切换一次通道就上一次电就可以了。 ADC_CONTR = ADC_POWER|ADC_START|adcch; |
这个书上有(需要看原理图),但你不一定注意到。你的师傅也未必能讲透,师傅也未必注意到。 |
ADC采样时,为了防止“弹动”,会用一只电容采样输入的电压。 当你下达起动命令后,电容就与输入分离,这样电容上的电压就不再受输入影响了(弹动),再对电容上的电压进行对分处理。 这个电容在ADC内部。 多路采样时,多路切换开关在电容的前端,当你切换之后,需要保持一段时间,因为电容上的电压是不能跃变的!否则电容上的电压就与上一次的一样! 明白这个道理正确的做法如下: 1、起动本次采样,等待采样结束(这期间去做其它事,不要呆等浪费CPU时间)。 2、采样结束了,立即切换到下个通道(不要急于分析处理数据),这样最节省采样时间。 3、处理分析本次采样到的数据。 4、估计切换有了一段时间了(自己按实际情况评估这段时间的长短),再起动采样测量下个通道的电压,这时电压采样也OK了(采样电容有了足够的充电时间)。 这样你的问题就解决了,而且数据稳定! 不是高手注意不到这个细节,也不一定明白其中的道理。 |