adc:
1.stm32内部的adc模块有三个adc1,adc2,adc3,他们彼此独立,所以可以进行同步采样。
2adc的输入时钟不得超过14mhz,它是由pclk2经分频产生,要在rcc_cfgr配置,再adc自己的寄存器中在没有时钟分频的配置位。
3.adc转换时间: stm32f103xx增强型产,时钟为56mhz时为1μ s( 时钟为72mhz为1.17 μ s)
4.adc的转换精度默认设置为12位,输入范围:adc输入范围:v ref-≤ vin≤ vref+
5.共有18个通道,其中外部16个通道,内部两个通道,内部温度传感器连接在adc1_in16,内部参考电压v refint连接在adc1_in17
6.转换的启动方式:有外部触发,内部外设触发如timx,以及软件触发,一次触发转换一个组,软件使能方式通过设置adc_cr2 寄存器的adon。
7.两个组的概念,a.规则组:一般情况下使用的adc转换序列;b.注入组,它的优先级高于规则组中的转换序列,当规则组正在转换的情况下,入股触发了注入组,他将会打断规则组正在进行的转换,知道注入组转换完成,再次会带规则则组转换。
8总的来说,规则转换的方式有两种,即连独立单次转换方式、间断一次启动转换n个通道,n可配置、连续不断地转换,知道知道设置了停止。连续加是扫描模式下,一次启动通道会在序列中逐个来回的转换,然而规则通道组只有一个数据寄存器adcx_dr,因此下一次转换完成之前必须将上次转换的数据值读出,否则将会 被覆盖,这是一般会使能dma请求,让每次数据刺激转换完成后产生eoc的同时,也产生dma请求,dma将dr中的数据传至存储器单元。
而单次转换模式下必须要每次完成之后查询eoc或利用中断将数据读出,然后再软件启动下一次转换,在这期间若要改变转换的序列也可以写入下次采集的通道。和以前使用ad的模式一样,但这样耗费时间。
间断模式,是在整个sqr寄存器组中通过设置n,一次制转换其中的几个,知道将这个序列转换完。暂时未用。
8.adc的采样时间时刻配置的,在采样时间寄存器配置,一次转换所需要的时间tconv= 采样时间+ 12.5 = 14 周期,12.5是转换周期。
9.有序数据只有12,不足16位,因此要设置第七方式,方便数据的提取,有注入组中能设置转换的品偏移量,即转换结果等于采样值减去偏移量的值,可能是负值,因此右对齐式,高位时符号位的扩展,规则组下高4位全部为0。
10.可以配置adc转换的阀值,类似看门狗功能,adc_htr 和adc_ltr寄存器分别配置上下限,不在这个范围内饰可以产生中断标志,用户可以选择进入中断。
11.外部触发模式,主要是外设的触发信号,tim的中断时间来触发adc的转换开始,达到控制采样时间的的目的,就不用如原来一样单独的写配置定时器中断。
12.双adc使用,双adc有很多中模式,最可能用到的就是双adc规则同步转换方式,可查阅datasheet来配置。
规则单次转换配置方式:
关闭cont,关闭scan模式,设置n值等于1,adc独立模式,初始化结构体基本上是这样。
然后向sqr组中的某个位置写入通道号,配置该通道的转换采样时间。
使能adcx,比较重要的是在最后要进行adc校准,否则可能不准,校准包括复位校准、ad校准,等待校准完成后才能开始转换。
每次转换完成查询eoc标志位,然后读取dr数据并且使能下一次转换,也可写入新的转换通道。
void init_adc()
{
adc_inittypedef adc_initstructure;
gpio_inittypedef gpio_initstructure;
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa|rcc_apb2periph_adc1,enable);
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable);
rcc_adcclkconfig(rcc_pclk2_div6);
gpio_initstructure.gpio_pin =gpio_pin_0|gpio_pin_1;
gpio_initstructure.gpio_mode = gpio_mode_ain;
gpio_init(gpioa, &gpio_initstructure);
gpio_initstructure.gpio_pin =gpio_pin_0|gpio_pin_1;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init(gpiob, &gpio_initstructure);
adc_deinit(adc1);
adc_initstructure.adc_mode = adc_mode_independent;
adc_initstructure.adc_scanconvmode = enable; //这是使用连续扫描模式时
adc_initstructure.adc_continuousconvmode = enable;
adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none;
adc_initstructure.adc_dataalign = adc_dataalign_right;
adc_initstructure.adc_nbrofchannel = 2;
// adc_initstructure.adc_scanconvmode = dsiable;
// adc_initstructure.adc_continuousconvmode = disable;
// adc_initstructure.adc_nbrofchannel = 1;
adc_init(adc1, &adc_initstructure);
adc_regularchannelconfig(adc1,adc_channel_0, 1, adc_sampletime_239cycles5 ); //
adc_regularchannelconfig(adc1,adc_channel_1, 2, adc_sampletime_239cycles5 ); //
/* enable adc1 dma */
adc_dmacmd(adc1, enable);
/* enable adc1 */
adc_cmd(adc1, enable);
/* enable adc1 reset calibration register */
adc_resetcalibration(adc1);
while(adc_getresetcalibrationstatus(adc1))
{
;
}
/* start adc1 calibration */
adc_startcalibration(adc1);
while(adc_getcalibrationstatus(adc1))
{
;
}
}
读取函数:
void getadvalue()
{
// adc_regularchannelconfig(adc1
射频识别技术漫谈(17)——射频卡中数据的存储形式
小米升级MIUI 9手机型号列表公开
可以对未来的物联网有什么期待
中国CMOS芯片厂商拿下全球50%+的份额,打败了索尼、三星
瑞萨将会有新动作,或将涉足新领域
大神教你如何快速使用DMA处理ADC
如何安装气动切断阀
突破?差距?华为新手机拆解来了!
待挖的金矿:健康类电子电器
从多个角度阐述2018年手机产业IPO的状况
AMD的潜力将超越苹果成台积电的首要客户
工业机器人对企业带来的好处有哪些
磷酸铁锂电池PK三元锂电池,谁才是最终赢家?
中药材质量追溯云平台助力中医行业的兴起
NXP蓝牙4.0开发板核心板内置及无线解决方案
TI的新型IWR6x毫米波传感器介绍
如何利用shell脚本实现数学运算?
氮化硅陶瓷在氢氟酸水溶液中的水热分解行为
智能手机失去了过往的高增长魔力?
油烟在线监测系统安装注意事项-旭华智能