正点例程ADC采样stm32最大采样频率不是4095吗

ADC结合DMA例子_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ADC结合DMA例子
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢ADC模块采样校正技术;1.F2812的ADC模块;TMS320F2812内部集成了ADC转换模块,;1.12位ADC核,内置了双采样-保持器(S/H;2.顺序采样模式或者同步采样模式;;3.模拟输入:0V~3V;;4.快速转换时间运行在25MHz,ADC时钟,或;5.16通道,多路选择输入;;6.自动序列化,在单一时间段内最大能提供16个自;7.序列发生器
ADC模块采样校正技术
1. F2812的ADC模块
TMS320F2812内部集成了ADC转换模块,该模块具有如下的功能:
1.12位ADC核,内置了双采样-保持器(S/H);
2.顺序采样模式或者同步采样模式;
3.模拟输入:0V~3V;
4.快速转换时间运行在25MHz,ADC时钟,或12.5MSPS;
5.16通道,多路选择输入;
6.自动序列化,在单一时间段内最大能提供16个自动A/D转换,每个转换可编程对16个输入通道中的任何一个进行选择。
7.序列发生器可按2个独立的8状态序列发生器或1个16状态序列发生器。
2. ADC模块误差
2.1 误差定义
常用的A/D转换器主要存在:失调误差、增益误差和线性误差。这里主要讨论失调误差和增益误差。理想情况下,ADC模块转换方程为y=x×mi,式中x=输入计数值 =输入电压×4095/3;y=输出计数值。在实际中,A/D转换模块的各种误差是不可避免的,这里定义具有增益误差和失调误差的ADC模块的转换方程为y=x×ma±b,式中ma为实际增益,b为失调误差。通过对F2812的ADC信号采集进行多次测量后,发现ADC增益误差一般在5%以内,即0.95
图1理想ADC转换与实际ADC转换
2.2 影响分析
在计算机测控系统中,对象数据的采集一般包含两种基本物理量:模拟量和数字量。对于数字量计算机可以直接读取,而对于模拟量只有通过转换成数字量才能被计算机所接受,因此要实现对模拟量准确的采集及处理,模数转换的精度和准确率必须满足一定的要求。由于F2812的ADC具有一定增益误差的偏移误差,所以很容易造成系统的误操作。下面分析两种误差对线性电压输入及A/D转换结果的影响。
F2812用户手册提供的ADC模块输入模拟电压为0~3 V,而实际使用中由于存在增益误差和偏移误差,其线性输入被减小。
下面以y=x×1.05+80为例介绍各项值的计算。当输入为0时,输出为80,由于ADC的最大输出值为4095,则由式y=x×1.05+80求得输入最大电压值为
2.8013。因此,交流输入电压范围为1.7,此时有效位数
N=ln4015/ln2=11.971,mV/计数位=2.977,其余项计算同上。表1中的最后一行显示了ADC操作的安全参数,其有效位数减少为11.865位,mV/计数位从0.7326增加为0.7345,这将会使转换结果减少0.2%。
在实际应用中,所采集的信号经常为双极型信号,因此信号在送至ADC之前需要添加转换电路,将双极型信号转化为单极型信号。典型的转换电路如图2所示。对于ADC模块,考虑到增益误差和失调误差对输入范围的影响,转换电路需要调整为如图3所示的电路。在图3中,输入增益误差的参考范围已经改变。
图2理想情况下的电压转换电路
图3校正后的电压转换电路
对于双极性输入,其0 V输入的增益误差对应单极性输入的1.4315V的增益误差,因此,原有ADC的增益误差和失调误差被增大了。例如,如果ADC的增益误差为5%,失调误差为2%,则其双极性的增益误差计算如下:双极性输入x′= 0.0000 V,单极性的ADC输入电压x = 1.4315 V,其理想的转换值为ye=1./3=1954,而由ya=+80计算得实际转换值,则双极性增益误差为ya-ye=8(9.1%误差)。通过计算可以看出,ADC的
误差大大增加,因此要使用ADC进行数据采集,就必须对ADC进行校正,提高其转换精度。
通过以上分析可以看出,F2812的ADC转换精度较差的主要原因是存在增益误差和失调误差,因此要提高转换精度就必须对两种误差进行补偿。
3. ADC校正措施
3.1.硬件角度
(1)硬件滤波,滤除干扰信号;
(2)电路板布线时需要注意不要让ADCINxx引脚运行在靠近数字信号通路的地方,这样能使耦合到ADC输入端的数字信号开关噪声大大降低;
(3)采用适当的隔离技术,将ADC模块电源引脚和数字电源隔离;
(4)如果采样电路部分是经过多路开关切换的,可以在多路开关输出上接下拉电阻到地;
(5)采样通道上的电容效应也可能会导致AD采样误差,因为采样通道上的等效电容可能还在保持有上一个采样数据的数值的时候,就对当前数据进行采样,会造成当前数据不准确。如果条件允许,可以在每次转化完成后现将输入切换到参考地,然后在对信号进行下一次采样。
2.软件角度
(1)多次采样取平均值算法,最为简单;
(2)数字滤波算法,例如采用中值滤波法,具体方法为:连续采样
20个数据,对这些数据进行排序之后,去掉最小的5个和最大的5个,然后取中间10个采样数据的平均值。
(3)软件校正算法。F2812的ADC转换精度较差的主要原因是存在增益误差(Gain Error)和偏置误差(Offset Error),要提高转换精度就必须对两种误差进行补偿,下面将具体介绍这种实用的补偿方法。
理想的12位ADC应该是没有增益误差和偏置误差的,因此其转换的计算公式为: Y=x*mi
其中,x=input count=inputvoltage*V
Y=output count
Mi=ideal gain=1
但是,实际上F2812的AD是存在增益误差和偏置误差的,其转换的计算公式如式2所示: Y=x*ma+mb
其中,ma=actual gain
B=actualoffset
(与输入为0时相关)
实际的和理想的转换计算曲线如图2所示:
三亿文库包含各类专业文献、应用写作文书、中学教育、幼儿教育、小学教育、外语学习资料、各类资格考试、行业资料、71ADC模块采样校正技术等内容。 
 这样,采用 1bit ADC 进行 64 倍过采样就能获得 4...用于系统校准(失调和增益);2 个匹配的 200 μA ...©2016 Baidu 使用百度前必读 | 文库协议 | 网站...  主程序流程:1.对系统控制模块进行初始化;2 初始化 ADC 模块;3 初始化 EPWM 模块;4 主函数程序;5 中断函数。 采样流程图 事件触发模块接受来自定时技术模块和...  多ADC 并行交替采样与校正技术 1、ADC 采样采样模式和及并行采样优缺点 ADC 采集模式常见的有串行和并行两种模式,也是应用中器件选择的一个 重要指标。 在同样的...  从图 13 一 1 可以很清楚地看到,X281x 的 ADC 模块一共具有 16 个采样...通常需要将采样输 人的信号先经过调理电路进行调整,使其输人电压范围在 A DC ...  (SHT0_2),开启 ADC12 模块 (ADC12ON); 2.设置 ADC12CTL1,选择采样保持...文档贡献者 g 贡献于 1/2 相关文档推荐 ...  *** 21.函数名:8 位 A/D 转换函数 22.调用:? = Read (); 23.参数:无...***/ 以上- 8 位 ADC 程序模块(适用于 STC12C2052AD 系列) C 代码 1. ...  利用两组输出值便可求 得 ADC 模块得校正增益和校正偏置,然后利用这两个值对...//采样计数 Uint16k; HighActualCount=AdcRegs.AdcResult1&&4;//读采样数据...  技术实验 ADC0809 的采样控制电路的实现 Jason.P 学号 成绩 指导教师 2016 年...实验板上的模数转换模块 设置为模式 5 后,旋转旋钮,可以看到数码管 1 和 2 ...  FPGA直接控制ADC0809对模拟信号进行采样_能源/化工_...数据处理模块 FPGA 图 2.1.2 系统具体流程框图 2...22 EOC ALE 8 21 D3 D7 9 20 OE D6 10 19 ...查看: 3174|回复: 6
如何用ADC采样方式来实现对一个正弦波的采样
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
我查了一下STM32&有FFT转化的DSP库函数。但是不清楚如何使用,主要有两个问题:
1.ADC初始化之后如何将数据传给pssIn指针。能否如下进行调用。
2.现在代码会在cr4_fft_1024_stm32 阻塞不清楚是什么原因。
请高手帮我看一下。
[C] 纯文本查看 复制代码
for(i=0;i&1024;i++)
for(j=0;j&10;j++)//采样频率为12M/(252*10)= 4993.2 计4993
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
adc_value+= ADC_GetConversionValue(ADC1);
// printf(\"voltage = %f\n\",3.3*adc_value/(4095*10));
adcin[i]=adc_value/10;
adc_value=0;
printf(\"adc value[%d]=%d\n\",i,adcin[i]);
// delay_ms(1000);
// delay_ms(1000);
printf(\"STM32 FFT\n\");
/*参数pssOUT表示FFT输出数组指针,参数pssIN表示要进行FFT运算的输入数组指针,参数Nbin表示了点数*/
cr4_fft_1024_stm32(&X_out[0], &adcin[0], 1024);
/*将采样数据转换为幅度数据*/
printf(\"dsp_asm_powerMag\n\");
dsp_asm_powerMag();
delay_ms(1000);
adcx=10000;
while(adcx--);
请问可能是什么地方出问题勒
11:30 上传
点击文件名下载附件
339.15 KB, 下载次数: 402
主题帖子精华
金钱113389
在线时间830 小时
帮顶。。。。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
连原子哥都帮顶了,看来这个问题是搞不定了。
原子哥,如果用定时器采样是否可行。
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
原子哥,如果用定时器采样是否可行。
有没有例子推荐一个。
主题帖子精华
金钱113389
在线时间830 小时
回复【4楼】yyang0514:
---------------------------------
&可以,例子我没有。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手上路, 积分 35, 距离下一级还需 15 积分
在线时间4 小时
同问,怎们通过ADC采集正弦波来计算:幅值,频率??!!!!!!!!!
主题帖子精华
新手上路, 积分 24, 距离下一级还需 26 积分
在线时间3 小时
我现在的毕设跟这个就差不多,问下楼主这个问题解决了没
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 3079|回复: 5
帮忙看下:STM32ADC,怎么采出来不是0就是4095?,官方例程。
&&已结帖(0)
主题帖子积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
如题,不想看那些复杂的寄存器了,就想简单的采一下电压,甚至不要求什么精度,判断电池电压的。&想着直接拿例程用下得了,有DMA就有DMA吧,虽然用不到。测试采集PC.4的电压,直接复制的例程。但是采出来不是0就是4095。偶尔会有乱七八糟的数,跟电压无关,一般比较大。&PC.4串68K的电阻接直流可调电源。&更严重的问题,是测试ADC涉嫌把两个STM32都烧了,手头上午还有3个好的板子,目前只有一个了。现象都是烧写这个ADC的程序,用过两次,使用STLIN2就下载不进去了。到PROGRAMING&FLASH那里,IAR没有相应,重启IAR,重启电脑都试过。目前仅有一块,还能用,但是电压不对。&
, , , , , ,
主题帖子积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 93, 距离下一级还需 7 积分
初级技术员, 积分 93, 距离下一级还需 7 积分
我最重要的一个小板,很多器件都是用它测试的,已经用不
主题帖子积分
初级工程师, 积分 2521, 距离下一级还需 479 积分
初级工程师, 积分 2521, 距离下一级还需 479 积分
主题帖子积分
专家等级:结帖率:25%
主题帖子积分
初级工程师, 积分 2521, 距离下一级还需 479 积分
初级工程师, 积分 2521, 距离下一级还需 479 积分
以前有类似的贴子,上电时你的代码就运行启动了DMA,DMA会不断的把ADC的数据送到RAM。而烧录FLASH是会用到部分RAM的,放在RAM里的代码被DMA改了,所以就烧录出错了。解决的办法是从选择从RAM&BOOT烧录芯片,这样DMA不会启动,烧录代码就可以正常在RAM里运行了。
主题帖子积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
主题帖子积分
专家等级:结帖率:75%
主题帖子积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
别用DMA的例程
&&很简单,ADC例程别用使用DMA的那个,而用其它更简单的例程。
主题帖子积分
主题帖子积分
专家等级:结帖率:27%打赏:0.00受赏:12.00
主题帖子积分
刚在另一个论坛回答了你的问题,你又发到这里
下次我也不能太着急,等你各处撒完英雄帖,再揭榜不迟,呵呵~~~~~~~~
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
下次我也不能太着急,等你各处撒完英雄帖,再揭榜不迟,呵呵~~~~~~~~
大神,你怎么帮他解决问题的,我也有这个问题啊,你在这个论坛没说啊。
精华达人奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
技术领袖奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章f28035例程 adc采样结果不正确 - C2000(TM) 32位实时 MCU - 德州仪器在线技术支持社区
f28035例程 adc采样结果不正确
发表于3年前
<input type="hidden" id="hGroupID" value="38"
使用的开发板:&/p>
&p>我下载的28035例程关于adc采样的,DSP2803x_examples\adc_soc,我在程序中跑时,从AdcResult.ADCRESULT0得到的采样数字量与实际电压值经过&/p>
&p>4096*(input &Analog -0)/3.3运算得到的值不对,要小的多这是为什呢,我程序都没动,基准电压是用的内部参考:&/p>
&p>AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG&br>AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference&br>AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC&br>AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC&br>AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG&/p>&div style=&clear:&>&/div>" />
f28035例程 adc采样结果不正确
此问题已被解答
All Replies
进士2741分
使用的开发板:
我下载的28035例程关于adc采样的,DSP2803x_examples\adc_soc,我在程序中跑时,从AdcResult.ADCRESULT0得到的采样数字量与实际电压值经过
4096*(input &Analog -0)/3.3运算得到的值不对,要小的多这是为什呢,我程序都没动,基准电压是用的内部参考:
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BGAdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power referenceAdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADCAdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADCAdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
探花11470分
AdcResult.ADCRESULT0寄存器数据时高12位有效,所以需要先右移四位,然后这个值/4093*3(ADC的输入是0~3V,不是DSP引脚电压3.3V)得到DSP引脚电压,这个电压是经过电路处理得到的,通常是经过比例和增益等到的结果,所以一般要减去一个偏置值,乘以一个系数,得到真实的电流值。
如果我的回答对您有帮助,请选择帖子下方的&是&,感谢您对TI的关注!
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
状元52288分
要进行偏置校准。
在adc.c中有一个函数void AdcOffsetSelfCal()
确认答案的话,帮忙点赞&&是&
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
你好,我想问一个关于AdcOffsetSelfCal函数的一个问题。我根据例程写的ADC程序,然后在RAM里面运行好好的,但是我一烧录到flash里面运行后,程序就在这个函数里面的一个标志位判断上面死循环了。而且在flash里面执行InitAdc中的延时函数DALAYUS时会出错
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
状元52288分
当程序跑在flash的时候,你需要调用memcpy函数,将有些运行在RAM的函数复制到RAM中运行,如DELAY US,如initlfash。
C:\ti\\device_support\f2803x\v130\DSP2803x_examples_ccsv5\flash_f28035
确认答案的话,帮忙点赞&&是&
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
你好,这个例程我看了,试过了把DELAY_US弄到RAM里面运行。可是为什么我又写了一个小小的程序,在主函数直接调用DELAY_US函数闪烁LED,烧录到flash后没有调用memcpy函数也可以运行,貌似周期也没变大。
然后,ADC的程序烧录到flash时,运行到AdcOffsetSelfCal()就会卡在下面那判断ADC转换是否完成的地方,可是在RAM调试时就没有这样。
下面是在flash运行时AdcOffsetSelfCal()函数里面调用到的AdcConversion()函数,程序在判断标志位时进入死循环
//ADC Conversion
AdcRegs.ADCSOCFRC1.all = 0x00FF; // Force Start SOC0-7 to begin ping-pong sampling
while( index & SampleSize ){
//Wait for ADCINT1 to trigger, then add ADCRESULT0-7 registers to sum while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){} AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Must clear ADCINT1 flag since INT1CONT = 0 Sum += AdcResult.ADCRESULT0; Sum += AdcResult.ADCRESULT1; Sum += AdcResult.ADCRESULT2; Sum += AdcResult.ADCRESULT3; Sum += AdcResult.ADCRESULT4; Sum += AdcResult.ADCRESULT5; Sum += AdcResult.ADCRESULT6; // Wait for SOC9 conversion to start, which gives time for SOC7 conversion result while( AdcRegs.ADCSOCFLG1.bit.SOC9 == 1 ){} Sum += AdcResult.ADCRESULT7;
//Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum while (AdcRegs.ADCINTFLG.bit.ADCINT2 == 0){} AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //Must clear ADCINT2 flag since INT2CONT = 0 Sum += AdcResult.ADCRESULT8; Sum += AdcResult.ADCRESULT9; Sum += AdcResult.ADCRESULT10; Sum += AdcResult.ADCRESULT11; Sum += AdcResult.ADCRESULT12; Sum += AdcResult.ADCRESULT13; Sum += AdcResult.ADCRESULT14; // Wait for SOC1 conversion to start, which gives time for SOC15 conversion result while( AdcRegs.ADCSOCFLG1.bit.SOC1 == 1 ){} Sum += AdcResult.ADCRESULT15;
index+=16;
} // end data collection
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
对了,还有一个问题对memcpy的,是不是如果要把某个函数放到RAM里面运行,应该在那个函数所在的C文件开头使用#pragma CODE_SECTION(InitFlash, &ramfuncs&);?
然后main函数里面的memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);是不是只要出现在移动到RAM里执行的函数执行之前,它就自动把所有要移动到RAM里的函数转移过去?
谢谢解答!
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼23907分
#pragma语句是预编译指令,不管出现在程序的后面还是前面都会在预编译的时候就固定他所放的位置
You have posted to a forum that requires a moderator to approve posts before they are publicly available.

我要回帖

更多关于 最大采样率 的文章

 

随机推荐