网易首页 > 网易号 > 正文 申请入驻

盘点!STM32之ADC+步骤小技巧不容错过

0
分享至

盘点!STM32之ADC+步骤小技巧不容错过

今早起来很准时的收到了两条10086的扣月租的信息、心痛不已、怀着这心情、又初始了STM32的钻研、早上做了计算机控制的PID实验,又让我想起了飞思卡尔的电磁小车、曾经的电感电压采集让我心碎的多少次、又让我开心了多少次、但已经成为过去、(软件和硬件都会影响),呵呵、大约有人已经猜到我接下来要介绍什么了、在你们面前、我已没机密、额、其实标题也直接“表白”了、看到标题,别吓到哈、并不是要用英文写、至于理由是什么、请往下看:

言归正传:STM32的ADC模块,请允许我用如此通俗的语言:普通话来介绍STM32ADC模块的特色:

1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)

STM32F103系列:在56MHz时转换时间为:1μs

在72MHz时转换时间为:1.17μs

2、转换范围:0~3.6V (3.6v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.6))

3、ADC供电要求:2.4V~3.6 V

4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)

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_Mode; //设置ADC模式-->独立模式

FunctionalState ADC_ScanConvMode; //设置是否开启扫描模式 --->否

FunctionalState ADC_ContinuousConvMode; //设置是否开启连续转换模式 ---->否

uint32_t ADC_ExternalTrigConv; //设置启动规则转换组转换模式---->软件触发
uint32_t ADC_DataAlign; //设置数据对齐方式----->右对齐

uint8_t ADC_NbrOfChannel; //设置规则序列的长度---->顺序进行规则转换的ADC通道数目1

}ADC_InitTypeDef;

4、使能ADC并校准

注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准)

还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢?

这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码

分别的库函数请看待会的代码。

5、读取AD的值

当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、

相关的库函数请看代码、

void Adc_Init(void)

ADC_InitTypeDef ADC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

/* 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_Independent;//这里对应上面所讲的配置,在这里就不给出注释了

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

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));

u16 Get_val(u8 ch)

u16 DataValue; //

/* ADC1 regular channel14 configuration */

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);

/* Start ADC1 Software Conversion */

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

/* Test if the ADC1 EOC flag is set or not */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

//FlagStatus Status;

//Status = ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);

//while(!Status);---->这样做实现不了、请注意

/*Returns the ADC1 Master data value of the last converted channel*/
DataValue = ADC_GetConversionValue(ADC1);
return DataValue;
}
u16 ADC_Get_aveg(u8 ch,u8 n)
{
u32 ad_sum = 0;
u8 i;
for(i=0;i
{
ad_sum += Get_val(ch);
delay_ms(5);
}
return (ad_sum / n);
}
adcx=ADC_Get_aveg(ADC_Channel_1,10);//获取AD数值(0~4095)
temp=(float)adcx*(3.3/4096);//获取相应的电压值

到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为何有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴。

步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例:

点击main.c可以看到神奇的一幕:

大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看:

对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、

所以大家要好好利用官方给的历程、说到这、你猜我词穷了吗?

答案是否定的、、我还有话要说:

做一件事要有一个目的,才不会显得自己做的很空泛。我想让我自己理清思路、也希望自己在写的过程中能领悟到自己在学的时候没领悟到的知识点,也希望能帮到跟我有一样困惑的人。我把我不懂的理解后写下来,我也知道会有人跟我一样遇到同样不懂的地方。尽管不认识你们,初学者,难免有出错。所以,写错或理解错的请帮我指出来,臣不甚感激,今当远离,零表涕零,不知所言。

想要学习单片机的朋友 ,关注我们,回复一哥,与导师一起学习成长,共同进步,还有更多资料领取。

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

浩然史观
2024-06-15 16:55:02
刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

小萝卜丝
2024-06-16 08:32:04
女人G潮时,“喷”出的是水吗?

女人G潮时,“喷”出的是水吗?

水白头
2024-06-16 14:23:11
世道如此之坏!

世道如此之坏!

吴女士
2024-06-16 13:33:32
视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

环球网资讯
2024-06-16 13:41:16
诡异的一幕:中产又可以开滴滴了,中国人排队出国……

诡异的一幕:中产又可以开滴滴了,中国人排队出国……

智谷趋势
2024-06-16 15:50:48
监管能见度丨光韵达回复深交所年报问询函,连续3年增收不增利,应收账款持续攀升

监管能见度丨光韵达回复深交所年报问询函,连续3年增收不增利,应收账款持续攀升

时代商学院
2024-06-16 17:10:46
新加坡前总理李光耀:过早翘起尾巴与美国对抗,是中国颠覆性错误

新加坡前总理李光耀:过早翘起尾巴与美国对抗,是中国颠覆性错误

黑天鹅洞察
2024-06-16 22:33:10
广东:女子离婚后去前夫家看娃,留宿后中奖了,女子纠结:复婚吗

广东:女子离婚后去前夫家看娃,留宿后中奖了,女子纠结:复婚吗

大有看头
2024-06-16 13:05:03
医大教师因抢救患儿迟到被罚后续:举报者身份被扒,校方二次回应

医大教师因抢救患儿迟到被罚后续:举报者身份被扒,校方二次回应

洛洛女巫
2024-06-16 13:41:45
50年石油美元协议到期 沙特:不再续约

50年石油美元协议到期 沙特:不再续约

南方都市报
2024-06-16 07:03:39
马来西亚总理不但看破,还非要说破:我不担心台海,原因很简单

马来西亚总理不但看破,还非要说破:我不担心台海,原因很简单

千里持剑
2024-06-16 12:42:12
太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

火山诗话
2024-06-16 16:42:18
创业板IPO|丘钛微提交注册近一年半仍未上市,过会当年净利润同比大降逾七成

创业板IPO|丘钛微提交注册近一年半仍未上市,过会当年净利润同比大降逾七成

时代商学院
2024-06-16 17:08:37
中国正面临40年来最大的经济危机?

中国正面临40年来最大的经济危机?

趣说世界哈
2024-06-17 00:15:02
80个国家和4个组织签署瑞士和平峰会宣言,乌克兰外交取得胜利

80个国家和4个组织签署瑞士和平峰会宣言,乌克兰外交取得胜利

山河路口
2024-06-16 20:40:56
牵涉“女首富”案,又一位越共中央高层受处分

牵涉“女首富”案,又一位越共中央高层受处分

中国新闻周刊
2024-06-16 15:09:59
打断妻子多根肋骨,上市公司创始人被公诉!

打断妻子多根肋骨,上市公司创始人被公诉!

中国基金报
2024-06-16 00:09:20
3-0,压哨升至第4!女排总决赛对阵:中国再战日本,波兰PK土耳其

3-0,压哨升至第4!女排总决赛对阵:中国再战日本,波兰PK土耳其

侃球熊弟
2024-06-16 21:56:43
科创板IPO|零营收,持续亏损,必贝特提交注册一年后仍未获批

科创板IPO|零营收,持续亏损,必贝特提交注册一年后仍未获批

时代商学院
2024-06-16 17:09:33
2024-06-17 03:28:49
单片机一哥
单片机一哥
喜欢关注一下,丰富单片机经验
46文章数 130关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

冷藏货车违规乘人致8人窒息后遇难 河南叶县通报

头条要闻

冷藏货车违规乘人致8人窒息后遇难 河南叶县通报

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

家居
房产
数码
亲子
军事航空

家居要闻

空谷来音 朴素留白的侘寂之美

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

数码要闻

PCIe 5.0 SSD终于要便宜了!群联E31T主控无缓存能跑12GB/s

亲子要闻

玩这个游戏的都是勇士

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版