没人さ腁DC还是ADC吗

影响ADC总精度至关重要的因素,原来是这个! - AC-DC 转换器 - LED社区
后使用快捷导航没有帐号?
查看: 408|回复: 1
影响ADC总精度至关重要的因素,原来是这个!
主题帖子积分
论坛元老, 积分 56277, 距离下一级还需 9943722 积分
论坛元老, 积分 56277, 距离下一级还需 9943722 积分
前面我们确定了模数转换器 (ADC) 的分辨率和精度间的差异。现在我们深入研究一下对ADC总精度产生影响的因素,通常是指总不可调整误差 (TUE)。曾经想到过ADC的TUE技术规格中的“总”代表什么吗?它是不是简单到将ADC数据表的所有DC误差技术规格(即偏移电压,增益误差,INL)相加,还是要更复杂一些?事实上,TUE是总系统误差相对于ADC工作输入范围的比率。
更确切地说,TUE是单位为最低有效位 (LSB) 的DC误差技术规格。最低有效位 (LSB) 代表ADC的实际和理想传递函数之间的最大偏离。这个技术规格假定未执行系统级校准。在概念上,TUE是ADC运行方式中以下非理想类型数值的组合:
● 偏移误差 (VOS):如图1所示,ADC实际和理想传递曲线间的恒定差异。这个值是测得的将ADC输入短接至地而获得的数字输出。
图1. ADC偏移误差与输入电压之间的关系
● 增益误差:ADC输出的实际和理想斜率之间的差异。他通常表示为满量程输出码上的ADC范围或最大误差的比率。如图2中所示,增益误差的绝对值在模拟输入接近满量程值时增加。
图2. ADC增益误差与输入电压之间的关系
● 积分非线性 (INL):实际ADC传递曲线到理想直线运行方式的最大非线性偏离。ADC的INL响应没有一定的形状,并且取决于内部电路架构,以及由前端信号调节电路导致的失真。
图3. ADC INL误差与输入电压之间的关系
大多数ADC数据表指定所有上述DC误差的典型值和最大值,但是未指定TUE这方面的数值。计算TUE的最大值可不像将所有单独的DC误差最大值加在一起那么简单。这是因为所有这些误差是不相关的,并且在出现最差偏移的情况下,增益和线性误差也许不全都出现在ADC传递函数的同一个输入电压上。因此,误差的简单求和也许使系统精度看起来未必那么差。这在应用的动态范围被限制在传递函数的中间时更是如此。
在这典型数据采集系统中,与ADC在一起的还有一个输入驱动器和一个电压基准,他们也会影响总体偏移和增益误差。因此,在大多数没有校准的系统中,偏移和增益误差决定了计算TUE最大值时用到的INL。计算特定模拟输入电压上的最大TUE的推荐方法是,那一点上所有单个误差最大值的和方根,(方程式1)。将所有这些误差转换为同样的单位很重要,通常转换为LSB。
方程式1生成一个针对TUE的典型“蝴蝶结”形状的误差图。对于具有较高偏移误差的系统,“蝴蝶结”图有一个更厚的结(图4A)。相反,对于增益误差较高的系统,“蝴蝶结”的结变薄,而弓形变厚(图4B)。
图4.“蝴蝶结”形状的ADC TUE与输入电压间的关系
总的来说,由于误差取决于ADC工作时的输入电压范围,所以没有计算ADC最大TUE的确定公式。如果系统不要求采用整个ADC输入范围,你可以通过使ADC远离其传递函数的端点运行来大大减少TUE。
主题帖子积分
论坛元老, 积分 4546, 距离下一级还需 9995453 积分
论坛元老, 积分 4546, 距离下一级还需 9995453 积分
总不可调整误差 (TUE),哈哈
站长推荐 /1
今天,你学习了吗?天气越来越热,但是我相信肯定抵挡不住小伙伴们熊熊的学习热情~~~管理君提供给大伙一个学习机会,并给大伙儿准备颈椎按摩仪,酸奶机等丰厚的奖品,机不可失失不再来。
Tel: 3-8070
备案号: 苏ICP备号-2
Powered by扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
高中数学题·· 立体几何方面的 百度无人吗?其真无人耶如图,四棱锥P-ABCD的底面ABCD是直角梯形,且PA⊥平面ABCD,且AD//BC,AD⊥DC,△ADC和△ABC均为等腰直角三角形,且PA=AD=DC=a,点E为侧棱PB上一点,且BE=2EP求证:直线PD//平面EAC
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
连接BD,交AC于点O,连接EO∵△ADC和△ABC均为等腰直角三角形,且PA=AD=DC=a∴AC=AD=√2a (勾股定理)BC=2a又因为AD∥BC,所以△ADO∽△CBO,BC=2a,AD=a,∴ BO=2OD因为BE=2EP所以在△PBD中,E和O分别是边BP和BD的三等分点EO∥PD所以直线PD//平面EAC
为您推荐:
其他类似问题
扫描下载二维码播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
视频:【DC解说】Nv.cn vs LGD 再现Zhou神水人ADC精灵解说
发送到手机 / 微信 / 朋友圈
请扫描下列二维码
嵌入代码:
*通用代码支持手机播放哦
方式一:扫一扫
支持各类二维码扫描软件
方式二:发一发
免费发送App到手机
请输入正确的手机号码
看不清验证码不正确
该短信不收取任何费用
方式三:下一下
下载App观看
还有更多攻略和游戏礼包等着你
游戏新鲜报
dota本周上升视频
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
畅游视频网页游戏YOYO手游
完美游戏台
网络视听许可证博客访问: 14868
博文数量: 7
博客积分: 0
博客等级: 民兵
技术积分: 97
注册时间:
记录,分享,成长
分类: 嵌入式 15:26:53
本文对TI TM4C Cortex-M4 的ADC DC特性测试
具体讲述模拟输入通道与ADC核、序列SEQ、采样次数STEP的关系和配置方法。同时讲述了怎样同时利用M4内部的两个ADC,实现多通道ADC数据采集。
硬件配置与上一篇文章相同,详见&http://blog.chinaunix.net/uid--id-3816201.html&
&1,首先要使能ADC和端口
这里我们用到了PE[0~3]作为4通道ADC输入,同时使用ADC0和ADC1
&&&&// Using both ADC0 and ADC1
& & SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
&&&&SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
&&&&// Enable the port with ADC function
&&&&SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
&&&&// Configure gpio as ADC analog inputs
&&&&GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);&&&&//ch0
& &&GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_2);&&&&//ch1
&&&&GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_1);&&&&//ch2
& & GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);&&&&//ch3
2,配置ADC、序列sequence、采样次数step、ADC模拟输入通道channel
首先要搞清楚怎样配置。可以看看下面的实例代码:
点击(此处)折叠或打开
ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH3);
ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH4 | ADC_CTL_IE);
ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH5);
ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH6);
ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH7);
ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH8 | ADC_CTL_IE | ADC_CTL_END);
ADC_CTL_CHx表示从哪个通道采样,ADC_CTL_IE表示该次采样后会产生中断;ADC_CTL_END表示到此该次采样序列结束。所以上面的序列表示从通道1一直采样到通道8,并且在通道4和通道8采样的时候分别产生一次ADC中断,并且通道8采样完成后本次采样序列结束。因为序列0有8次采样,所以序列里面有8个语句。
这段代码显示的配置是:
每次采样更换一个ADC模拟输入通道,即每个ADC输入通道对应一次采样(一个step)
需要说明:
序列0有8个step,序列1和2有4个step,序列3只有一个step。
可以设置在某次采样结束后是否产生中断(添加参数ADC_CTL_IE)。这个中断能够被函数ADCIntStatus()读取。
读取采样数据用ADCSequenceDataGet()函数,该函数可以传一个指针进去,获取采样结果序列的位置。因为不同序列的采样次数是不同的,因此该指针指向的采样结果数组长度也是不一样的,这点要小心。
点击(此处)折叠或打开
&&&&&&&&&&&&//
&&&&&&&&&&&&// Dual channel mode. Capture interleaved samples from the two
&&&&&&&&&&&&// inputs.
&&&&&&&&&&&&//
&&&&&&&&&&&&ADCSequenceStepConfigure(ADC0_BASE, 0, 0,&(ADC_CTL_D | ADC_CTL_CH1));
&&&&&&&&&&&&ADCSequenceStepConfigure(ADC0_BASE, 0, 1,&(ADC_CTL_D | ADC_CTL_CH2));
&&&&&&&&&&&&ADCSequenceStepConfigure(ADC0_BASE, 0, 2,&(ADC_CTL_D | ADC_CTL_CH1));
&&&&&&&&&&&&ADCSequenceStepConfigure(ADC0_BASE, 0, 3,&(ADC_CTL_D | ADC_CTL_CH2&| ADC_CTL_IE |&ADC_CTL_END));
上面的序列表示,双通道差分采样。只用了ADC0的序列0,4次采用中,第一次对差分通道1采样,第二次对差分通道2采样,第三次第四次分别又对差分通道1和2采样。
由以上两个例子可以看出,ADCx-SEQx-STEPx-CHx之间是独立的,可以任意配置。
3,本文的ADC配置
为了使多通道都共享一个配置函数,本文自定义了一个ADC配置函数adcInit()。
点击(此处)折叠或打开
void adcInit(unsigned long adcbase, char sequence, char setp, char adcchannel)&&&&
&&&&// Enable sample sequence 3 with a processor signal trigger. Sequence 3
&&&&// will do a single sample when the processor sends a signal to start the
&&&&// conversion. Each ADC module has 4 programmable sequences, sequence 0
&&&&// to sequence 3. This example is arbitrarily using sequence 3.
&&&&ADCSequenceConfigure(adcbase, sequence, ADC_TRIGGER_PROCESSOR, 0);
&&&&// Configure step 0 on sequence 3. Sample channel 0 (ADC_CTL_CH0) in
&&&&// single-ended mode (default) and configure the interrupt flag
&&&&// (ADC_CTL_IE) to be set when the sample is done. Tell the ADC logic
&&&&// that this is the last conversion on sequence 3 (ADC_CTL_END). Sequence
&&&&// 3 has only one programmable step. Sequence 1 and 2 have 4 steps, and
&&&&// sequence 0 has 8 programmable steps. Since we are only doing a single
&&&&// conversion using sequence 3 we will only configure step 0. For more
&&&&// information on the ADC sequences and steps, reference the datasheet.
&&&&ADCSequenceStepConfigure(adcbase, sequence, setp, adcchannel | ADC_CTL_IE);
&&&&// Since sample sequence 3 is now configured, it must be enabled.
&&&&ADCSequenceEnable(adcbase, sequence);
&&&&// Clear the interrupt status flag. This is done to make sure the
&&&&// interrupt flag is cleared before we sample.
&&&&ADCIntClear(adcbase, sequence);
ADC配置为程序触发方式采样(参数为ADC_TRIGGER_PROCESSOR),ADC程序触发函数为ADCProcessorTrigger()。
每次触发对该序列全部STEP进行采样(除非中间的采样设置了ADC_CTL_END,否则是全序列采样)。
每个step采样结束后,只产生中断(参数为ADC_CTL_IE),不让采样结束(不设置参数ADC_CTL_END),否则其他通道不会被采样到。
一个ADC输入通道对应一个step。
对于同时使用ADC0和ADC1的4通道的采样,本文配置为:
&&&&&&&&adcInit(ADC0_BASE, ADC_SEQ_2, 0, ADC_CTL_CH0);& & //通道0对应ADC0-序列2-第0次采样
&&&&&&&&adcInit(ADC0_BASE, ADC_SEQ_2, 1, ADC_CTL_CH1);& & //通道1对应ADC0-序列2-第1次采样
&&&&&&&&adcInit(ADC1_BASE, ADC_SEQ_2, 0, ADC_CTL_CH2);& & //通道2对应ADC1-序列2-第0次采样
&&&&&&&&adcInit(ADC1_BASE, ADC_SEQ_2, 1, ADC_CTL_CH3);& & //通道3对应ADC1-序列2-第1次采样
4,ADC数据获取与处理
这里设定了一个处理函数
adcProcess(unsigned long adcbase, char sequence, char step, char serial)
& & & &float fValue;
& & & &unsigned long ulValue[8]={0};&&&&&&&&// The ADC Sequence0 of
has 8 steps
&&&&&&&&//
&&&&&&&&// Trigger the ADC conversion.
&&&&&&&&//
&&&&&&&&ADCProcessorTrigger(adcbase, sequence);
&&&&&&&&//
&&&&&&&&// Wait for conversion to be completed.
&&&&&&&&//
&&&&&&&&while(!ADCIntStatus(adcbase, sequence, false))
&&&&&&&&//
&&&&&&&&// Read ADC Value.
&&&&&&&&//
&&&&&&&&ADCSequenceDataGet(adcbase, sequence, ulValue);
&&&&&&&&//
&&&&&&&&// Convert to voltage
&&&&&&&&//
&&&&&&&&fValue = ADC_SAMPLE_TO_MV(ulValue[step]);&&&&&&&&&&&&
&&&&&&&&&&if((fValue > 999) | (fValue < -999 ))
&&&&&&&&&&{
&&&&&&&&&&&&fValue = fValue / 1000;
& & & & & & sprintf(g_cADC0_Value,"%4.3f%2s",fValue,"V");
&&&&&&&&&&}
&&&&&&&&&&else
&&&&&&&&&&{
& & & & & & sprintf(g_cADC0_Value,"%4.0f%2s",fValue,"mV");
&&&&&&&&&&}
&&&&&&&&&&if (ustrncmp(g_cADC0_Value,g_cADC0_ValueCp,6))
&&&&&&&&&&{
& & & & & & ustrncpy(g_cADC0_ValueCp,g_cADC0_Value,6);
&&&&&&&&&&&&&&&&&&&&
& & & & & & sRect.sXMin = 0;
& & & & & & sRect.sYMin = 30 * serial + 30;
& & & & & & sRect.sXMax = 100;
& & & & & &&sRect.sYMax = 30 * serial + 50;
& & & & & &&GrContextForegroundSet(&sContext, ClrBlack);
& & & & & & GrRectFill(&sContext, &sRect);&&&&&&&&&&&&&&&&&&&&&&&&
& & & & & & GrContextForegroundSet(&sContext, ClrWhite);
& & & & & & GrStringDraw(&sContext, g_cADC0_Value, -1, 10, 30 * serial + 30, 0);
&&&&&&&&&&}
在循环中不断采集和处理这4通道ADC。
& & & & adcProcess(ADC0_BASE,ADC_SEQ_2,0, ADC_CTL_CH0);
& & & & adcProcess(ADC0_BASE,ADC_SEQ_2,1, ADC_CTL_CH1);
& & & & adcProcess(ADC1_BASE,ADC_SEQ_2,0, ADC_CTL_CH2);
& & & & adcProcess(ADC1_BASE,ADC_SEQ_2,1, ADC_CTL_CH3);
&&&&&&&&&&&&
&&&&&&&&//
&&&&&&&&// This function provides a means of generating a constant length
&&&&&&&&// delay. The function delay (in cycles) = 3 * parameter. Delay
&&&&&&&&// 250ms arbitrarily.
&&&&&&&&//
&&&&&&&&SysCtlDelay(SysCtlClockGet() / 12);
5,测试结果
利用具有精确电压电流显示的电源输出作为ADC的模拟输入,测试结果表明M4的ADC测量值是精确的。具体指标没有计算。
4通道同时工作,单独给每个通道输入电压,观察该通道测量值,并与电压源自身的显示的电压值进行比较,发现测量值准确。
通道悬空,测量显示值变化很大,并且会受其他通道输入信号影响。
一旦给悬空通道输入确定的电压值,该通道的测量值稳定且不受其他通道影响。
同时给多个通道输入确定的电压值,各个通道测量值准确。
测试图片如下。
M4的双ADC核可以同时工作而互不影响
ADC模拟输入通道与ADC核、序列SEQ、采样次数STEP,没有确定的一一对应关系,可以任意配置
每个STEP都可以挂载到一个模拟输入通道,总共可配置的STEP有 2 ADC x 17 STEP (8+4+4+1) = 34.
总之,M4的ADC看起来值得相信。
测试代码【】
阅读(1343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 中野ありさ黑人 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信