历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 【菜鸟入门】stm32 之 ADC 模数转换

2020-03-04 来源:eefocus

今天对ADC进行了研究,个人感觉,ADC的配置相对也对比较复杂一点,因为需要配置的寄存器是比较多的!


在datasheet 关于ADC的简介中,明确说明ADC的输入时钟不得超过14M,他是有PCLK2经过分频得来的


这次我们选用ADC1_IN0作为讲解的对象,ADC1_IN0 -->PA0


所以在配置时钟的时候要配置PA0和ADC1,关于怎么配置,已经说的很清楚了。


在配置PA0的输入模式方面我要说明一下,有好多人在这个地方还是很郁闷的

在8.1.11 外设GPIO的配置中每种配置都说的很清楚,如果我们对那中模式配置有疑问,我们都可以直接在这里查找


这里的ADC我们采用模拟输入模式:

所以我们这里需要把PA1配置为0000b


输入配置完成,在开头我已经强调过了,ADC的时钟不能超过14MHz,所以我们要对ADC的时钟进行些操作


RCC_CFGR这个寄存器找了我半天,我就感觉在RCC里面配置,但是一直找不到ADC的配置项,后来在网上找了半天,才知道ADC的频率配置在这里选择


我一般在配置系统时钟的时候喜欢配置为72MHz,即PCLK2 = 72MHz


所以为了满足我们的ADC,我们至少需要6分频,当然8分频也可以,好吧废话了一句。。


我们这里就6分频吧:RCC->CFGR &= ~(3<<14);RCC->CRGR |= 2<<14;


这里得到的ADC时钟为12MHz,时钟配置完成后,那我们就来专心配置ADC register了


当然,有经验的人,不用想,直接先找到控制寄存器(CR ,Control Register)


ADC的控制寄存器比较多,我刚开始看的比较郁闷,然后再李想老师的代码里面找了一段(因为最近比较忙,没有时间,所以喜欢搞定现成的代码研究下);当然大家也可以只要,只要你把别人的配置方法,配置原理学会了,也是很不错的,有时候我道觉得这是一种比较学习的快捷办法!这里给大家交流下学习经验


先看看ADCx_CR1

CR1寄存器大部分位是管理WATCH DOG的,我们一般不怎么用WATCH DOG,在430上我基本上没有用过看门狗,感觉这个狗不是很听话,我也不是很了解他,所以以后用到了再说吧。


首先是双模式选择

我们需要注意下:在ADC2和ADC3中这些位为保留的,所以以后我们再配置的时候注意下,还有下面的几行


这里我们用独立模式0000b,在此模式中,双ADC同步不工作,每个ADC接口独立工作;


关于模式大家可以看看11.9章

至今我还没有明白这个扫描模式时干嘛用的!谁会了,帮忙指点下,谢谢了。


关于CR2的配置相对比较多的!

我们这里不使用外部事件来启动转换,直接用软件来转换,所以20位我们要置0,从而在选择启动规则通道组转换的外部事件我们就只能用SWSTART(Software Start)

我们用的是ADC1,而且还关闭了外部启动转换,所以我们这里就选择111


为了保证数据数据的实时性,我们需要进行连续转换,我不知道李想老师为什么选用单次转换,不过也无所谓了。


然后为了保证读书的方便,我们可以把数据存储的时候进行右对齐;这样我们就不需要进行移位的操作了,直接读就ok 了。


关于SQR寄存器,规则序列寄存器,听着都纠结,我们只用一个通道,所以我们就二话不说的配置为0000b


通道的采样时间,我的观念是采样时间越长越精确,经过测试确实是这样


由于我们用的是CH1,所以我们呢就要配置SMPR的SMP1设置为111

这些配置完了,那我们就来启动ADC吧。


还是CR2,打开ADC,进行矫正复位,矫正。


完成后,就没有了,只剩下读数据了。

读数据我要说下:

我们要先配置我们要采样的通道,然后打开控制寄存器CR2上的开始转换 Start Conversion


注意检测状态寄存器里面的转换状态,转换结束,他会把EOC位置1


然后我们就可以读数据了;


现在附上代码,大家可以参考代码看看:


/* adc.c */

#include

 

void adc1_init()

{

RCC->APB2ENR |= 1<<2;

GPIOA->CRL &= ~(0xf<<0);

GPIOA->CRL |= 0x0<<0;

RCC->APB2ENR |= 1<<9;

RCC->APB2RSTR |= 1<<9;

RCC->APB2RSTR &= ~(1<<9);

RCC->CFGR &= ~(3<<14);

RCC->CFGR |= 2<<14; // 6 div PCLK2 / 6 = 12MHz

ADC1->CR1 &= ~(0xf<<16);

ADC1->CR1 |= 0<<16; //Set Indenpendence Mode

ADC1->CR1 &= ~(1<<8); //Scan Mode Disable

/* Config Control Register 2*/

ADC2->CR2 |= 1<<1; //Continuous conversion mode

ADC1->CR2 &= ~(7<<17); //Clear

ADC1->CR2 |= 7<<17; //software start

ADC1->CR2 |= 1<<20; //Conversion on external event enable

ADC1->CR2 &= ~(1<<11); //Right Alignment

ADC1->SQR1 &= ~(0xf<<20);

ADC1->SQR1 |= 0<<20;

ADC1->SMPR2 &= ~(0x7<<3);

ADC1->SMPR2 |= 7<<3;

ADC1->CR2 |= 1<<0; //Start ADC to Calibration

ADC1->CR2 |= 1<<3;

while(ADC1->CR2 & 1<<3);

ADC1->CR2 |= 1<<2;

while(ADC1->CR2 & 1<<2);

}

 

unsigned short get_adc(unsigned char ch)

{

ADC1->SQR3 &= ~(0xf<<0);

ADC1->SQR3 |= ch;

ADC1->CR2 |= 1<<22;

while(!(ADC1->SR & 1<<1));

return ADC1->DR;

}

 

主函数::::

/* main.c */

#include

#include "stdio.h"

#include "init.h"

#include "usart.h"

#include "adc.h"

 

int main()

{

char buff[256];

sys_init(9);

rs232_init(CPU_72M,9600);

rs232_send_byte('n');

adc1_init();

while(1)

{

sprintf(buff,"V:%.3f Vn",3.3*get_adc(1)/4096);

rs232_send_str(buff,strlen(buff));

delay_ms(1000);

}

}


ADC有的地方我还没有搞的完全懂,愿意听各位大神指点!

推荐阅读

史海拾趣

鑫雁公司的发展小趣事

为了更快地拓展市场,聚洵半导体积极寻求与国内外知名企业的合作。公司与世界领先的芯片制造公司台积电建立了晶圆代工合作关系,并在长电科技和华天科技进行封装测试,确保了产品的一流工艺和品质。此外,聚洵还与国内多家电子元器件电商平台如立创商城、华强芯城等建立了紧密的合作关系,通过线上线下双管齐下的分销渠道,将产品迅速推向市场。这些合作不仅提升了聚洵的品牌知名度,还极大地促进了其市场份额的增长。

承兴(CX)公司的发展小趣事

经过多年的努力和发展,承兴公司已经成为一家具有全球影响力的电子企业。除了在中国市场保持领先地位外,承兴还积极拓展海外市场,并在美国、新加坡等地设立了分公司和研发中心。通过与全球合作伙伴的紧密合作和资源共享,承兴不断提升其全球竞争力,并努力实现国际化的发展目标。

请注意,由于承兴(CX)公司的具体发展历程和细节可能因时间和市场变化而有所不同,以上故事仅为虚构示例,旨在展示承兴公司在电子行业中的发展脉络和关键事件。

BOSER公司的发展小趣事

近年来,电子行业面临着诸多变革和挑战,如智能化、物联网等新技术的发展。BOSER公司积极应对这些变革,不断调整和优化产品结构,加大在智能化、物联网等领域的研发投入。同时,公司还加强与高校、科研机构的合作,共同推动电子行业的创新与发展。

Continental公司的发展小趣事

随着汽车工业的发展,大陆集团开始将业务扩展到汽车轮胎领域。1901年,马牌轮胎首次与德国戴姆勒·奔驰汽车公司合作参加汽车竞赛,这标志着大陆集团正式进入汽车轮胎市场。仅仅三年后,大陆集团就生产出了全世界第一条带花纹的汽车轮胎,这一创新大大提高了轮胎的抓地力和安全性。1908年,大陆集团又生产出了全世界第一个可拆装的车轮,使车轮和车轴分开,由此大大节省了换轮胎的时间。这些技术创新使得大陆集团在汽车轮胎市场上占据了重要地位。

Belden Wire and Cable公司的发展小趣事

随着全球化的深入发展,Belden公司开始积极拓展国际市场。通过在全球范围内设立分支机构和工厂,百通不仅提升了自身的产能和效率,也更好地满足了全球客户的需求。同时,公司还不断推出新产品和新技术,拓展在工控线缆、音视频线缆和计算机网络等领域的市场份额。如今,Belden已经成为全球最大的综合布线及专业线缆制造商之一,其产品和服务遍布全球各地。

这五个故事只是Belden Wire and Cable公司发展历程中的一部分,但它们都客观地反映了公司在电子行业里不断发展、创新和壮大的事实。通过这些故事,我们可以看到一个企业通过不断创新和拓展市场,逐渐成长为行业领导者的过程。

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

问答坊 | AI 解惑

unix环境高级编程第2版英文版 and 中文版

unix环境高级编程第2版英文版 and 中文版  学习linux的经典之作…

查看全部问答>

手机领域的新创新

今日读了一些杂志,遇到一些有趣的手机领域的新创新概念产品,收集如下 1:太阳能手机电池:     顾名思义,有了这样的电池,你的手机就再也不怕没电了,你可以尽情通过你的手机听MP3,看手机电视或者MP4,打游戏,上网等等。不过这个 ...…

查看全部问答>

有人用过掌微A3的平台吗?里面有个UTLDRV是做什么用的?

有人用过掌微A3的平台吗?里面有个UTLDRV是做什么用的?…

查看全部问答>

帮忙分析下:WinCE下的拨号问题

  我用的是wince5.0的系统,系统起来后,如果手动点击拨号连接,那么可以拨上网络,而且断开后继续拨也基本都能成功。 如果是应用程序调用RasDial来拨号,发现即使拨上去了,那么调用RasHangUp挂断网络后,经常就无法拨上网络了。 而且 ...…

查看全部问答>

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889 EMAIL:SDTZ_ZZ@126.COM

有没有这样的网卡:自身能实现双网卡冗余容错备份,我QQ:270996889     EMAIL:SDTZ_ZZ@126.COM…

查看全部问答>

USB资料及开发手册

本帖最后由 paulhyde 于 2014-9-15 04:16 编辑 主要包括开发知道和常用的USB开发工具,还带PPT讲解,在每个文件夹里有分类好的东西,算是比较全面的资料了,刚注册该网站,请多多支持,帮忙顶一下哈  …

查看全部问答>

LM3S的调试方法->在RAM中运行程序

如果每次调试仿真都要烧写flash的话,是很麻烦尤其是代码量比较大,每次擦除flash,编程flash,校验flash,下载调试代码,然后才能进入调试环境,这样下来很费时间,而在ram中调试烧写代码到ram就相当快了,大大加快了调试速度,缺点就是RAM的空间有一定限制. ...…

查看全部问答>

各位师兄请问怎么读出 MSP430F149 的GIE 位!请指教!

各位师兄请问怎么读出 MSP430F149 的GIE 位! 最好的用C 语言汇编也可! 急急! :confused:…

查看全部问答>