历史上的今天
今天是:2024年11月06日(星期三)
2019年11月06日 | 怎样用stm32(F103系列是12位ADC)…
2019-11-06 来源:eefocus
重点在最后一段(看懂就行了)
可采用过采样技术。过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。如果STM32的12位AD,每秒采集10个数据,即采样率为:10/秒。根据过采样技术,每提高1位ADC分辨率,需要增加4倍的采样率。从12位AD提高到14位AD,一共提高了2位,所以需要把采样率提高2 * 2 * 2 * 2 = 16倍。原来在100mS之内只采集一个数据,现在需要在100mS之内采集16个数据了。然后,我们把这16个数据累加,再把累加值右移2位,这样就得到STM32过采样之后的14位ADC。
需要注意的是,过采样技术会限制输入信号的频率。根据采样定律,采样率最少是输入信号的2倍才能将信号还原。当需要提高n位的ADC分辨率时,采样率又得提高4*n倍。STM32的12位ADC的最高采样率为1MHz,如果要达到14位的ADC分辨率,那么输入信号的频率就不能超过:1M/2/15 = 31.25KHz。
最后提醒:分辨率的提升到14位并不是精度也能提升14位。我自己试过提升到16位的分辨率,但是精度大概只有13、14位的样子。
STM32的精度不可能提高的太多,要提高只能在分辨率上想办法,提高分辨率间接提高精度,但是这是由一个度的,跟你的要采样的外部信号的频率、CPU的处理速度等等都是有关系的。
过采样只能提高分辨率,精度不是随便可以提高的。要不然0832不就能替代所有的AD芯片了。
精度通常是指准确度。指测量值与实际值的差异性。影响精度的因素很多。如分辨力,线性度等。
分辨率可以通过分辨力来理解。8bit的分辨力为1/256,10bit时为1/1024,但实际还要通过量程转换成具体的值,不能没有量纲或单位(量纲与单位是不同的概念)。
分辨率通常用百分比来表示,而分辨力则用绝对值来表示。“5/256 =0.01953125V”指的是分辨力而不是分辨率。而这样的分辨能力仅仅是指理论能力而不是实际能力。因为实际能力还要包括非线性因素引起“干扰”。
总结:分辨率容易提升到24位,但是精度能到24位的要求就很高了。市面上的16、24位AD转换芯片一般指的是分辨率,而不是精度。
STM32的adc如果要使用在精度要求高的地方,如3级电子称、精准计量仪表的话,stm32就比较勉强了。建议换外置的ADC。
到底怎样使用过采样法来提高AD采样精度?
以下的思路使用于任何单片机:
比如设个定时器每个10us触发下STM32的ADC的采用,采到256个后将256个数据累加求和,如果当12位ADC用就除以256,13位用除以128,14位用除以64,15位用除以32,16位用除以16。得到结果后存放缓冲区中,再增加一段软件滤波程序就OK了!
例如下面这段程序:
#define VccTmpAdcVal 16384//14位ADC
VREF_VAL=VccVal*ADC_FilterChannel[inrefv]/VccTmpAdcVal ; //内部参考电压对应的电压值 VREF_VAL=3.3*内部基准电压的十六进制ADC值/16384
void FileterADC(void)
{
u8 i,j,k;
u32 sum;
u16 temp;
vu16 AD_Value_T[N][M];
for(i=0; i
for(j=0; j
{
AD_Value_T[j][i]=AD_Value[j][i];
}
for(k=0; k
for(i=N; i>0; i--)//博客不显示出来 一定要显示出来这句
for(j=0; j<=i; j++)
{
if(AD_Value_T[j][k] > AD_Value_T[j+1][k] )
{
temp=AD_Value_T[j][k] ;
AD_Value_T[j][k] =AD_Value_T[j+1][k];
AD_Value_T[j+1][k]=temp;
}
}
for(i=0; i
{
for(j=30,sum=0; j<70; j++)
{
sum+=AD_Value_T[j][i] ; //把第一列的数据从第30位到第69位共40位 求和
}
ADC_FilterChannel[i]=sum/10; //取平均//当14位ADC使用时,累加和要除以(采样个数右移两位)//sum/(40>>2)
}
}
注:上文来源于:http://www.openedv.com/posts/list/5815.htm 的magicoctoy。后面我自己加了一段实例,方便理解。
史海拾趣
|
许多人参加工作以后,总是感到怀才不遇,不被人重视,觉得有劲无处使,憋闷得慌。其实,关键还在自身,在于自己怎么做,做得怎样。因为你的努力决定了你的价值。 I994年初进微软的唐骏,他本想去市场部,结果却成了微软软件开发部的程序员。那 ...… 查看全部问答> |
|
我写了不用操作系统的程序。把图像信息考到缓冲区后,只能显示一般的图像不知道为什么? 我的屏幕是320*240的 U8 ScreenBitmap[] = { 0X00,0X10,0X40,0X01,0XF0,0X00,0X01,0X1B,…………………………}; #define IMAGE_FRAMEBUFFER_DMA_BASE&nbs ...… 查看全部问答> |
|
MSP430单片机中, 当只用AD4一个端口的时候, 为什么跳不到中断中去? 每次中断标志都是显示 #include static unsigned int ADCResult; //功能函数 void Coulometry() { P6SEL |= BIT4 ; // Only Enable A/D channel A4 ADC12CTL0 &= ~ENC ; & ...… 查看全部问答> |
|
由于公司购买的部分红外设备仅支持原始红外,所以请问 多普大公司的PPC手机现在是否还支持 原始红外 这种通讯方式 多普大客服回复说 仅支持标准红外(就是IrComm) 怕他们说得不对,所以向大家征询一下 是否多普大的PPC手机还 ...… 查看全部问答> |
|
向大家请教 有关判断串口接收数据 以及使用AT COMMAND 控制手机收发短信的问题。 几个问题。 1:我从另外一端利用串口收到2个感应器的开关信息,分别是DOOROPEN & DOORCLOSE, DOORFREE & DOORBLOCK,问题是这些信息都是储存在一个data(从另一端接收到的)里面的,如果我让这个data显示在textbox,就会出现overwrite得问题。所以我 ...… 查看全部问答> |
|
电路如图所示,市电经C5、R7、R8降压、VD7~VDl0整流和VD11稳压后为,电路提供工作电压。当电熨斗水平放置时,水银开关S向下倾斜15o 左右,处于断开状态。这时,IC1-a输出低电平,C1通过R2充电,ICl-c输出低电平,ICl-d也输出低电平,VD3、VD4、IC1 ...… 查看全部问答> |
|
刚开始接触stm32f103vdt6然后写了一个程序,请大神指教一下怎么样可以将频率调好,怎么计算频率啊? 部分程序如下: void DAC_Configuration(void) { DAC_InitTypeDef DAC_InitStructure; & ...… 查看全部问答> |




