你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103ADC的工作模式和触发方式的探索与理解,结合自我.....  

[复制链接]
拼命三郎 发布时间:2015-1-6 22:43
STM32F103ADC的工作模式和触发方式的探索与理解,结合自我探索分享。


前段时间做开发用到了STM32规则通道的ADC,因为需要定时采集,所以使用了外部触发方式。初次接触到STM32的ADC感觉还可以驾驭,但随着开发的推进,发现自己对于STM32ADC的不知之处还有好多,现将开发过程中的心得与大家分享。
1、STM32F103中不足100脚的芯片ADC参考电压在芯片内部接到Vadd管脚上,这个是无论如何都不能通过设置寄存器更改的。那么STM32内部有没有参考电压呢,答案是否定的,参考电压是没有的,参照倒是有一个1.2V的。说实话,一开始我也以为这个参照电压就是参考电压,但是随着学习的跟进,发现这个参照电压的作用仅仅是可以”参照“而已,前面也讲了参考电压Vref已经接到Vadd上了,那么这个参照电压和Vref不是一回事了。只是用于修正你所读到的ADC值而已。举个例子吧:假设Vref=Vadd=3.3,在AD采集的时候要一次读取ADC通道的值和通道17即参照电压的值,假设此时读到的AD值为2000,读到通道17的值为1500。此时如果参照电压是准的,Vadd是波动的,那么Vref实际的值应该是4095*1.2/1500=3.27V,那么AD值2000对应的电压应该为2000/4095*3.27V=1.597V。这样大家就可以理解参照电压的作用了,如果大家还不满足内部参照电压的精度的话,可以再开辟一个AD通道,外接外部基准电压芯片。AD采集之后的计算方式与内部参照电压是相同的。
2、STM32F103ADC通道转换模式的问题:
STM32的ADC有单次转换和连续转换2种模式,这两种模式又可以选择是否结合扫描模式。
CONT=0,SCAN=0    单次转换模式(Single conversion mode)单次扫描1通道
CONT=1,SCAN=0    连续转换模式(Continuous conversion mode) 连续扫描1通道
CONT=0,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组)
CONT=1,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组

需要注意的是,如果你的转换序列当中有超过一个通道需要转换的话,那么必须要开启扫描模式,否则的话,始终只转换第一通道。


用ADC1,Regular通道的顺序为Ch0,Ch1,Ch2,Ch3,启动Scan模式
在单次转换模式下:
启动ADC1,则
1. 开始转换Ch0
2. 转换完成后自动开始转换Ch1
3. 转换完成后自动开始转换Ch2
4. 转换完成后自动开始转换Ch3
5. 转换完成后停止,等待ADC的下一次启动。下一次ADC启动从第一步开始
在连续转换模式下:
启动ADC1,则
1. 开始转换Ch0
2. 转换完成后自动开始转换Ch1
3. 转换完成后自动开始转换Ch2
4. 转换完成后自动开始转换Ch3
5. 转换完成后回到第一步
如果没启动Sacn模式则上述过程中没有2、3、4这三个步骤
上述前提是Discontinuous模式没有启用。


关于这个扫描模式,着实让我纠结了好久,一开始,根据中文手册上的来。咱玩包含两个通道的规则通道采集,完了还不带DMA的。

手册中对规则通道转换的描述

手册中对规则通道转换的描述
,手册说了每一个规则通道转换完毕都置位EOC,那就是每转换一个通道都可以进中断喽,那这样的话,咱还用啥DMA啊,直接中断吧,好吧。就这么办,程序写好了,跟踪调试发现,中断虽然进了,但是只有第二组数据。为什么不行呢,手册中讲的好好的,怎么就不行了呢,带着这个疑问,楼主开始了探索之旅
首先继续不用DMA,在主函数中采用以下语句读取ADC数据。
    while (1)
    {
                if((ADC1->SR)&0x02)//读取判断EOC位
                {
                        adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
                        Filter_Table[ Filter_Tab_Count++ ] = adcx;
                }
    }
还是只有最后一组数据。好吧,那这样好了:
    while (1)
    {
                adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
                Filter_Table[ Filter_Tab_Count++ ] = adcx;
    }
终于凑效了,可以在跟踪的时候,在不同时间停下的时候读到第一组和第二组数据了,这是为什么呢,这说明第一通道也是在转换的,只是在转换完毕的时候没有置位EOC罢了,当然也就不能触发ADC中断了。


看来又被手册忽悠了,多个通道用中断的方式是不行的。PS:手册中的一个规则通道应该指的是一个规则通道组。

好吧,那启用DMA好了,那么问题来了,手册扫描模式中讲到

手册中对规则通道扫描模式的描述

手册中对规则通道扫描模式的描述
,EOC置位后DMA才来搬运数据,那么岂不是要丢好多数据!当然中文手册也讲了,以英文手册为准,既然有疑问,那咱翻翻英文手册好了 3.jpg 英文手册中讲到,在ADC_DR寄存器每次更新后,DMA才会搬运数据。总结:ADC在采用规则通道组采集的时候必须启用扫描模式,并且启用DMA传输支持。


好了,终于写的差不多了,由于个人能力有限,有表达不清的地方还请斧正,我一定更改,这么晚了,洗洗睡去了。


1 收藏 6 评论85 发布时间:2015-1-6 22:43

举报

85个回答
拼命三郎 回答时间:2015-1-6 22:50:53
自己顶上去,睡觉了。
天好蓝 回答时间:2015-1-7 08:46:20
学习了,研究下。
拼命三郎V5 回答时间:2015-1-7 08:54:26
最近正在做ADC采集,学习了。
625058882 回答时间:2015-1-7 09:08:10
中文手册仅供参考,请以英文手册为准,说实话我也上过当
拼命三郎 回答时间:2015-1-7 09:37:39
ADC.zip (2.78 KB, 下载次数: 232)
大秦正声 回答时间:2015-1-7 09:52:26
分辨率实际效果如何谢谢
拼命三郎 回答时间:2015-1-7 17:21:04
大秦正声 发表于 2015-1-7 09:52
分辨率实际效果如何谢谢

还没有研究过分辨率
我是酱油哥 回答时间:2015-1-7 17:27:00
103有十二位的ADC 其分辨率是不是1/4096?
kxj116 回答时间:2015-1-7 17:36:36
应该是4095分之一,分辨率和采集速度设置什么的没什么关系

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版