STM32 12位AD 到底是除以em4095读写程序还是4096

查看: 3511|回复: 2
第一次接触单片机ADC 都会有这些问题
如何利用单片机的ADC模块(或者独立的ADC芯片)得到接入ADC管脚上的实际电压值?
这个问题,是第一次接触ADC时候,大家都会遇到的问题。
会读到什么值
单片机会读到什么值?需要看一个特性,就是几位的ADC,在手册上就会给出,例如,STM32的ADC是12位的。另外,还有8位,10位,16位,24位等。
我先告诉你答案:STM32读到的ADC值,是从0到4095,当你把ADC引脚接了GND,读到的就是0,当你把ADC引脚接了VDD,读到的就是4095。
接下来告诉你为什么:前面提到,STM32的ADC是12位的,我们知道,8位的值是从0~255;16位的值,是从0~65535。这两个位的最大值,是我们最为熟悉的。
(怎么算出来的?这问题就又降低到另一个层面了,这里我们说的几位的值,每个位只能是0或者1,比如2位的值,可以表示为00 01 10 11四种不同的值,这是以2进制表示的,转换成十进制就是0 1 2 3,所以得出结论,2位的值可以表示从0~3。同理,3位的值,可以表示十进制的0~9,你可以展开计算一下。4位的值,可以表示0~16,5位的值,可以表示从0~31,同理,你可以得出任意位的值可以表示的范围。)
所以,12位的值,可以表示从0~4095,这就是先在感性上,认识了为什么12位的ADC的值,是从0~4095.
读到的值怎么换算成实际的电压值
前面提到了,我们输入GND,读到的值是0,输入VDD,得到的值是4095,那么,当你读到2035的时候,你知道输入电压多少V吗?这个问题,归根接地,就到了数学XY坐标,已知两点坐标值(0,0)(3.3,4095),给出任意X坐标值,求Y值的问题了吧?简单不简单?
参考电压是什么
讨论这个问题之前,你先拿万用表量一下你的VDDA的实际电压是多大?是不是标准的3.300V?应该不是吧?或许是2.296V,或许是3.312V。然后你把VDD连接到ADC引脚之后,得到的是4095,也就是,实际上,当你读出4095这个数据的时候,实际的电压值不是你想象中的3.300V。有些初学者,觉得几毫伏的电压差无所谓,但实际应用中,几毫伏就可能代表很大的实际工况,例如,在一个量程为50克的电子称上。
所以,这时候,芯片厂商就想了一个办法,给ADC模块中引入参考电压,由非常标准的参考电压芯片来接入参考电压引脚。标准的电压芯片,我们一般叫做参考电压芯片,或者叫做基准电压芯片。例如REF3133(输出3.300V) REF3025(输出2.500V)等等。
注意:STM32 的100脚以上(含100脚)有参考电压引脚。在没有参考电压引脚的单片机上,可以把基准电压芯片接入VDDA,但是VDDA和VDD的电压差不能超过0.3V,例如,VDD是3.3V的话,可以给VDDA接入一个3.3V的参考电压芯片或者3.0V的参考电压芯片,但是不能接入2.5V的参考电压芯片,后果就是芯片不能工作。
ADC引脚的输入电压范围是多大
一般情况下,ADC引脚的输入电压,是从0~VDD,如果有REF引脚,一般是0~Vref,也有0~2Vref的情况。
如果被测的电压大于ADC的输入电压,例如,要用STM32测量0~5V的电压的话,可以在输入ADC引脚之前,加入电阻分压和放大器电路。
总结:看完这篇文章,你是否会觉的,一切都只是基础知识的融合。
学电子,欢迎关注:科技老顽童
 不错!谢谢
 不错,赞
Powered by实用的STM32之ADC步骤与技巧
我的图书馆
实用的STM32之ADC步骤与技巧
才有)& && &5、双重模式(带2个ADC的设备): 8种转换模式& && &6、最多有18个通道:16个外部通道& && && && && && && && && && && &&&2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)& && &......(略,请看参考手册哈,由于篇幅,就不过多的列出来了、、说到略、让我想起了月光宝盒诸葛亮的:略懂略懂、、其实我也是略懂略懂而已、、)& && &12、DMA功能(仅ADC1有)& && &本博客里,由于篇幅、所以就以独立模式下的单次转换为例哈、打开参考手册可以看到这段话:& && & 单次转换模式下,ADC只执行一次转换。& && & 该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。& && & 一旦选择通道的转换完成:& && & ● 如果一个规则通道被转换: ─ 转换数据被储存在16位ADC_DR寄存器中 ─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE,则产生中断。& && & ● 如果一个注入通道被转换: ─ 转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。& && & 然后ADC停止。& && &此图形象的表明了其背后那不为人知的秘密转换关系。。虽然单凭看文字就能想象出来、但是、有图片是不是更加形象呢???
& &&&对于以上的寄存器、在此我稍微提提:免得寄存器大神们产生怨气:好不容易等到你讲我老大ADC,却不把我这些背后的勤劳者给导出来& &&&好了,那就恕小弟容禀:& &&&1、ADC状态寄存器(ADC_SR) & &&&
& & 2、ADC控制寄存器1(ADC_CR1) & & 3、ADC控制寄存器2(ADC_CR2)& && & EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group)& && & ALIGN:数据对齐 (Data alignment)& && & RSTCAL:复位校准 (Reset calibration)& && & CAL:A/D校准 (A/D Calibration)& && & CONT:连续转换 (Continuous conversion)& && & ADON:开/关A/D转换器 (A/D converter ON / OFF)& & 4、ADC采样时间寄存器1(ADC_SMPR1)& && & SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection)& & 5、ADC规则序列寄存器1(ADC_SQR1)& && & L[3:0]:规则通道序列长度 (Regular channel sequence length)& && & SQ1[4:0]:规则序列中的第1个转换 (1st conversion in regular sequence)(ADC规则序列寄存器3(ADC_SQR3))& & 6、ADC规则数据寄存器(ADC_DR)& & & & DATA[15:0]:规则转换的数据 (Regular data)
(由于寄存器过于多,我们就不在这一一列举了哈、、因为我主要是用库,所以寄存器相关的位都不具体介绍了哈、请大家参照中文手册)& &在这里,向大家介绍下:数据对齐:& && && && && && && && && && && && && && && & ALIGN位用于设置对齐方式:右或左;& && && && && && && && && && && && && && && & 对于注入通道,转换结果是减去偏移量的值,可以为一个负数,在右对齐时扩展位位符号位。 & & 那我们现在要怎么来实现呢??这个问题、相信大家在看了那么多的寄存器之后急迫想要知道的吧、、前面的只是个热身、、接下来步骤如下:& & 1、开启ADC1的时钟,由于ADC1是在PA1上,所以同时也要打开PA的时钟,并进行相关的配置、对于这个配置,要把PA1设置成模拟输入,为什么呢??大家打开中文参考手册可以看到& & 啊哈、、这下子清楚了吧、& &2、复位ADC1,(本人觉得没必要、为什么,待会我会跟你说,留下悬念先),设置ADC1的分频因子,(记住,这里的ADC的时钟不能超过14MHZ),而且其采样周期长点会好点,& && &&&ADCCLK---最快可达14MHz, 时钟来自经过分频器的PCLK2(2、4、6、8分频)& && &&&整个转换时间 = 采样时间 + 12.5个周期(固定时间)& && & 在14MHz和采样时间位1.5周期时 ? 转换时间:1μs (14个周期 cycles)当ADCCLK=14MHz和1.5周期的采样时间:& && &&&TCONV = 1.5 + 12.5 = 14周期 = 14×(1 / (14 × 1000000)) = 1μs& && & 其采样周期一览表:
& & 涉及到采样周期、这里来看看转换序列:& & 最多达16个转换通道且可以采样不同的顺序排列,不同的采样时间和过采样的可能性。例如:- 转换通道:1、2、8、4、7、3、11
& && && && && && && && && & - 不同的采样时间;
& && && && && && && && && & - Oversampling of channel 7。
3、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息;& && & 大家通过打开"stm32f10.adc.h"可以看到:&&typedef struct
&&uint32_t ADC_M& && && && && && && & //设置ADC模式--&独立模式
&&FunctionalState ADC_ScanConvM& && & //设置是否开启扫描模式 ---&否
&&FunctionalState ADC_ContinuousConvM //设置是否开启连续转换模式 ----&否
&&uint32_t ADC_ExternalTrigC& && && & //设置启动规则转换组转换模式----&软件触发& && && && &&&
&&uint32_t ADC_DataA& && && && && &&&//设置数据对齐方式-----&右对齐
&&uint8_t ADC_NbrOfC& && && && && &//设置规则序列的长度----&顺序进行规则转换的ADC通道数目1
}ADC_InitTypeD复制代码
& &&&4、使能ADC并校准注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准)还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢?这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码& && &分别的库函数请看待会的代码。(请用比较老外的方式去看,也就是用英语啦,为什么呢?请看下文)& &&&5、读取AD的值& & 当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、& && &相关的库函数请看代码、void Adc_Init(void)
& & ADC_InitTypeDef ADC_InitS
& & GPIO_InitTypeDef GPIO_InitS
& &/* Enable ADC1 and GPIOA clock */
& & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
& & RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ
&&/* Configure PA.1 (ADC Channel) as analog input -------------------------*/
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
& & //ADC_DeInit(ADC1);//在这里复位被我注释掉了、至于为什么,我待会会说
& && &/* ADC1 configuration ------------------------------------------------------*/
&&ADC_InitStructure.ADC_Mode = ADC_Mode_I//这里对应上面所讲的配置,在这里就不给出注释了
&&ADC_InitStructure.ADC_ScanConvMode = DISABLE;
&&ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
&&ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
&&ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
&&ADC_InitStructure.ADC_NbrOfChannel = 1;
&&ADC_Init(ADC1, &ADC_InitStructure);
& & /* Enable ADC1 *///知道我为啥要在上面提醒大家要用老外的方式来看了吧、因为这里的注释都是用英文的
&&//请不要以为我装逼,我这样做是有原因的、、原因我待会会说、你也会明白我最初的标题为何那样写
&&ADC_Cmd(ADC1, ENABLE);
&&/* Enable ADC1 reset calibration register */& &
&&ADC_ResetCalibration(ADC1);
&&/* Check the end of ADC1 reset calibration register */
&&while(ADC_GetResetCalibrationStatus(ADC1));
&&/* Start ADC1 calibration */
&&ADC_StartCalibration(ADC1);
&&/* Check the end of ADC1 calibration */
&&while(ADC_GetCalibrationStatus(ADC1));
& &&&到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为什么有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴、& &&&步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例:& &点击main.c可以看到神奇的一幕:& &大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看:对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、&&所以大家要好好利用官方给的历程、说到这、你猜我词穷了吗?&&答案是否定的、、我还有话要说:&&做一件事要有一个目的、、才不会显得自己做的很空泛、、我写博客也一样、、我想让我自己理清思路、也希望自己在写的过程中能领悟到自己在学的时候没领悟到的知识点、、也希望能帮到跟我有一样困惑的人、、我把我不懂的理解后写下来、我也知道会有人跟我一样遇到同样不懂的地方、、所以这就是我的目的哈、、希望能帮到你们、、尽管不认识你们、、啊哈、、初学者、难免有出错、、所以、写错或理解错的请帮我指出来、臣不甚感激,今当远离,零表涕零,不知所言、、
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&高速12位AD芯片
在电子工程世界为您找到如下关于“高速12位AD芯片”的新闻
高速12位AD芯片资料下载
高速12位AD芯片.AD7887.读写芯片和AD数据C代码....
本板采用USB2.0总线接口的同步采集器。 本采集器一个重要特点是体积小,特别适合于放置在笔记本电脑的包内,方便携带。 本板通过采用高速高精度AD芯片、高精度的放大器、高密度FPGA逻辑芯片、精细地布线以及优良的制版工艺,实现了高速、高精度实时数据采集,具有以下性能特点: 1、32通道模拟量高速采集。可以设置1-32通道采集,起始通道号可以自由设定。 2、AD幅值采集高精度:12位采集精度...
,发展势头已将传统仪器远远抛在了后面,并将持续下去。但是一般的虚拟仪器对于普通电子爱好者来说仍然是太昂贵了,而且由于通用的虚拟仪器要考虑高速信号,往往采用高速低分辨率的AD/DA芯片,一般分辨率只能达到8至12位,这对于电子爱好者常用的音频领域恰恰不够精确。在现代多媒体电脑上,声卡已经成为一个必不可少的重要组成部分,它给我们提供了丰富多彩的视听娱乐和有声交流功能,使“多媒体”的名称名副其实。但是你是否...
摘 要:本文详细地阐述了基于USB2.0的实时数据采集虚拟仪器系统的设计细节和研究成果。系统采用400MHz增益带宽积的运算放大器,运用DA高精度校准技术,并选用高采样率低噪声的12位AD转换芯片进行模拟电路和AD转换电路设计,保证了数据采集系统的信噪比,提高了系统测量精度。系统还采用预测编码和字典压缩等数据压缩技术,降低了系统数据传输量,并运用USB2.0高速数据串行传输接口技术,实现了数据...
DSP281x模板及例程,
sprc097_281x 例程程序介绍
高性能价格比
更加完备的硬件功能,丰富的软件例程
芯片支持C语言编写,编译率高达90%
32位 TMS320FMHz
片内flash 128K×16 bit(128位密码保护)18K×16 bit 高速RAM
片内12位高速A/D ,16路...
常用的实时数字信号处理的器件有可编程的数字信号处理(DSP)芯片(如AD系列、TI系列)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)等。在工程实践中,往往要求对信号处理要有高速性、实时性和灵活性,而已有的一些软件和硬件实现方式则难以同时达到这几方面的要求。随着可编程逻辑器件和EDA技术的发展,使用FPGA来实现数字信号处理,既具有实时性,又兼顾了一定的灵活性。FPGA具有的灵活的...
高速12位AD芯片相关帖子
主A/D控制从属A/D是否工作,因为我是要做8*2通道的,当主ad控制从属ad不工作时,就相当于是8*1通道,当主ad控制从属ad两个都采集时,就相当于是16*1或者8*2。至于怎么去控制我现在也还没搞懂,想先选了芯片再说。如果ad芯片实现不了控制功能我就只能再加一个控制器去控制这两个ad了
[quote][size=2][url=forum.php?mod=redirect&goto...
Q:用TMPM37A做FOC算法的电机控制可以把外围器件较少到哪种配置?AD检测的个数,精度和速度怎样?PWM时间精度可以做到什么程度?PWM生成有没有更简便的方式?
东芝工程师解答:此芯片内置了AD运放、预驱、还有5V的稳压器,这样的话,外围只用接一个驱动的MOSFET,还有一些阻流器件应该就可以了。AD检测的精度应该是12位的,速度在一点几个微妙到2微妙左右。PWM的精度要看客户的...
做测试的时候,我用万用表检测电压输出电压1.200V,我用开发板检测电压总是在1.1-1.3之间飘动,为啥就不能像万用表那样稳定呢?
我采用的AD芯片是AD7266,电源采用的单路直流电源,用示波器测试其纹波也就400MV左右。
问题出在哪里呢?难道是采样率太高了?
万用表是如何采集到平均值的,我用AD芯片采集的总是飘动很大 “万用表是如何采集到平均值的”
你的“万用表”想必是...
最近实验室需要做个数字电源实验,在F28377和F28M35之间纠结,大家给点意见
1:三相10khz逆变器控制(PWM,AD之类的就不多说了)
2,高速的串口通信(之前看28335的手册,串口最高速度好像只能到38400bps,有点捉急)
3.最好有10M或以上的以太网(也可以通过外接芯片实现)
看论坛里面F28M35资料挺少的,不知道好不好入手
c2000选型问题...
我手上有一些国内高速AD和DAC芯片资料,大家可以看看!
1.YA16D125:16位125MHz双通道A/D转换器(=AD9268)
2.YA16S125:16位125MHz单通道A/D转化器(=AD9265)
3.YA12D210:12位210MHz双通道A/D转换器(=AD9613)
4.YA14D250:14位250MHz双通道A/D转换器(=AD9643...
一搬1MSPS左右的ADC大都在16位以下,我看到一款芯片AD8436据说可以提供真RMS结果,成本低于峰值法、均值法或数字解决方案,能达到±0.5%的精度。
如果使用一个24位的三角积分ADC+AD8436测量,和使用一个16位的高速ADC做DFT的结果比较,不知道效果会不会好些?
另外如果使用比较器计算过零时间,因为比较器的响应速度很快,排除振荡影响这样计算得到的相角精度是不是会...
本帖最后由 lonerzf 于
07:16 编辑
小弟看到一片关于AD转换设计中的基本问题整理博文,特地转载过来和大家共分享。
原文地址 /space.php?uid=170730&do=blog&id=3836
了解数据转换器错误及参数
1.如何选择高速模数转换之前的信号调理器件;如何解决多路模数转换...
! 推荐DSP:OMAP-L138
推荐理由:集成了C674X DSP核心 ARM926EJ-S ARM核心。最高主频456MHz。高性能C6000系列。集ARM和DSP优势于一身,有专门的并行接口可以外接FPGA活着高速并行AD。无论是针对电力等行业的高速数据采集还是视频处理都可以使用。最重要的是性价比灰常高。相比其他C6000的DSP来说,这款芯片功耗很低,适合嵌入式移动终端。TI提供了丰富...
内校准寄存器。CMOS结构保证了很低的功耗,省电模式使待机功耗减至15μW(典型值)。3)微功耗8通道12位AD转换器:AD7888  AD7888是高速、低功耗的12位AD转换器,单电源工作,电压范围为2.7V~5.25V,转换速率高达125ksps,输入跟踪-保持信号宽度最小为500ns,单端采样方式。AD7888包含有8个单端模拟输入通道,每一通道的模拟输入范围均为0~Vref。该器件转换满...
& && &&&自从考研复试结束以后,就开始了俺的毕业设计了。这个题目说实话,想做出来简单,想做好比较难。好了,言归正传,开始说说设计思路吧。
& && &硬件方案如下:
1.主控制器采用ST公司的STM32F407ZGT6,该芯片基于Cortex M4内核,带有FPU浮点运算单元,和DSP...
高速12位AD芯片视频
高速12位AD芯片创意
你可能感兴趣的标签
热门资源推荐

我要回帖

更多关于 stm32 adc 大于4096 的文章

 

随机推荐