对于 M0 ADC部分的总结

M0的ADC是有趣的,首先我们来看看其功能框图:

我相信很多的同学看到ADC会不知所措,虽然说学了STM32的ADC,也会有一些帮助,但是要真正地看懂M0的ADC还是需要很认真的看手册才行。

从最左边看起:ADCA0,ADCA1,ADCA2……这些是我们ADC的输入管脚,那我们要怎么知道这些通道对应的管脚是谁?这时候我们需要打开手册,无论是M0的说明书,还是M0的编程手册都有对于管脚复用的描述,

打开M0的说明书,这边的管脚图片较为清晰,我们可以很清楚的看到在模拟2字的下端就有ADCB7,ADCA7等字样,往左看,分别对应的是PC13和PC14,那我们就很清楚了,在选择复用功能后,如果我们要用ADCA7作为我们的输入通道,PC13就是我们的输入管脚。

解决好输入通道后,我们按照从左往右的顺序看到12位ADC转换器,从字面是意思就知道了,转换器那顾名思义就是将模拟转数字的一个模块,具体的工作原理可以上网去看一下,是有好几种转换的方法的,各有优缺点,在12位ADC转换器的左上角写着ADCREF的字样,翻译成中文就是ADC参考的意思。

这些部分就是选择其参考的电压,这里不需要过分深究,明白其原理参考的具体意义就好,在程序默认的情况下,是选择5V的,毕竟M0这个芯片和STM32不同,其管脚都是可以容忍5V的电压的,所以选择3.3V的话,测试条件少的可怜。

在12位转换器的右边有一个ADCRESULTX的字样,翻译成中文就是转换的结果,那么这个X又和谁相关?

这个是M0中第一个让人不理解的地方,看手册:

在对应的ADCRESULTX寄存器的描述中我们可以知道,X的数值与SOCX中的X相对应,也就是说如果是SOC1那么结果转换的结果就是在ADCRESUTL1寄存器中。这里要强调一点,在M0中每个ADC转换的结果都是有对应的ADCRESUTL寄存器进行对应存储的,这点和STM32不同,从而在M0中运用到DMA这个外设的情况很少,基本可以不用。

那么SOC又是一个什么东西,既然ADCRESULTX与它有关,那么它在转换中扮演了什么角色呢?

在我的理解中,我把12位ADC转换器看作成一个宝箱上的锁,把SOC看成制作钥匙的材料,就当它是黄金的材料吧,我把SOC(做钥匙的材料)分3个步骤来打造钥匙,第一个步骤为触发源,第二个步骤为采样窗口,第三个步骤为通道配置,在最开始的时候,我们已经对ADC转换的通道(输入通道)进行了选择,不同的通道好比不同的锁,那么我们需要选择相应的通道配置,也就是SOC的第三个步骤,把SOC(做钥匙的材料)经过第三个步骤打磨出钥匙的轮廓,使它可以插入我们想要打开的锁。入下图:

在ADC.C中有我们的SOC通道选择表,当我们选择ADCINB7作为我们的输入通道时,我们需要选择15来进行与之匹配,这样子钥匙才可以成功插入相应的宝箱上的锁。

而对于采样窗口,我们可以理解就是转换的一个速度设置,默认状态下选择9,则转换速度最快。对于采样窗口,可以理解成钥匙的转动的手柄,学过初中物理都知道,如果我们手柄越小,那么受力面积越小,压强则越大,那么在相同力的情况下,打开的速度就越快。

最后一个就是触发源的选择:

不能说一定,但是我想说99.9%选择00(软件触发),其他的触发源在M0中很少有过运用,用到的话一般都是较高水准的产品了。对于触发源,可以理解成是谁来开锁,在99.9%的情况下,那一定是我们人手来开锁,而剩下的0.1%可能是机器来开锁,而软件触发就对应着99.9%这部分。

图中SW就是软件触发的意思。

了解了SOC,我们再来看看它在我们ADC转换中的代码部分,看看有什么新的发现:

这个是ADC通道选择的代码,从图中我们可以发现ADCSOCX中的X是属于0-15的,也就是说我们一共有16份打造钥匙的材料,在没有选择触发源,采样窗口和配置通道下,他们就是一样的。在这种情况下,我们是可以任意选择一份材料来打造我们想要的钥匙的,这就侧面反应了一个情况,SOC是可以任意选择的,并没有固定。我可以用SOC1这份材料,也可以用SOC2这份材料,因为他们最开始就是一样的,在经过3个步骤以后才变成我想要的钥匙!

这样子描述,想必大家都对SOC有一定的了解了,那么解决好第一个难点,再看下图:

在SOC的右边有EOCADCINT2个字样,那么这个又代表着什么含义呢?

首先我想你可能比较熟悉的是ADCINT,看到INT很容易想到中断相关的知识,是的,这里就是代表着中断的意思。那么EOC又和中断有什么相联系呢?手册会告诉我们答案!

注意我高亮的部分,这2句话先读10遍!

读好以后,我向你解释一下其中的含义:

第一句话-因为存在16个独立的SOC,所以有16SOC完成EOC,也就是说16SOC对应着16EOC的出现,隐约的意思就是SOCX中的XEOCX中的X是相对应的

第二句话-ADC模块的中断可以被配置成以任一EOC信号作为中断源,从这句话中可以得到2个很重要的线索,第一个:EOC是触发中断的中断源,第二个:任意一个EOC都可以作为中断的触发源。

结合这2句话,我们又发现既然SOCX与EOCX相对应,那么其实第二句话中的任意一个EOC都可以作为中断的触发源其实也是受到SOCX中的X控制的,因为是SOCX产生了EOCX(X对应),就好比我选择了SOC1作为打造钥匙的材料,这时我使能了ADC中断,但是却选择了EOC2来作为ADC中断的触发源,这时中断是不进行的。所以我认为这句话是有BUG的。我认为作者想表达的意思是:ADC模块中,确定的EOCXX0-15)可以被任意选择作为ADC中断(1-9)的触发源。我个人认为这样子描述才是正确的,也是作者真正想表达的意思。

ADC的中断一共有10个,第10个保留。

如下图:

这里是选择了EOC5作为ADCINT5的中断触发源,我们这里可以改成像下图:

EOC5作为触发源不变,修改其他的ADC中断是完全没有问题的。

接着在ADC中断中获取转换结果的值,这里的ADCRESULTX_b.RESULT中的X是与SOC中的X相对应,在文章的上面也有提到过的。

最后一步就是要启动ADC转换了,钥匙有了,那么就需要执行一句话来打开宝箱上的锁了

这里的(1<<5)并不固定,要根据你SOCX中的X的值做相应的调整,如果是2那就是(1<<2).

全部理解了以后,我再和你说一下ACCESS_ENABLE是什么东西。

我们会在ADC.C文件中经常的看到ACCESS_ENABLE这一行代码,想必大家已经傻了,这个到底什么鬼啊!手册会告诉我们答案!

在ACCESS_EN寄存器的描述中说的就是我们如果想要在对一些具有ACCESS_EN标识的写保护的寄存器上修改和读取一些数据,就必须关闭这个寄存器的ACCESS_EN保护,这样子我们才可以成功的对其写数据和读数据,而且在32个周期后,会自动恢复为ACCESS_EN保护状态,。这就是为什么ADC.C中和其他地方有这个东西的存在的理由。稍微理解就好,不需要深究。这就好比,在STM32中,要用到GPIO,要先开启GPIO的时钟一样的道理。

关于ADC的内容说好了,最后我想说的是,如果想彻底弄清楚ADC是需要花一些时间的,你可能照着程序抄一遍或者背一遍也能实现功能,但是你并不能真正的掌握其中的道理,是无意义的,只有真正的掌握了,这样子在今后无论怎么变,你都可以得心应手。另外补充一句,用到ADC中断时,记得要打开ADC的中断使能哦,要不然也是不可以进入的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值