【菜鸟入门】stm32 之 ADC 模数转换

发布者:科技狂人最新更新时间:2020-03-04 来源: eefocus关键字:菜鸟入门  stm32  ADC  模数转换 手机看文章 扫描二维码
随时随地手机看文章

今天对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有的地方我还没有搞的完全懂,愿意听各位大神指点!

关键字:菜鸟入门  stm32  ADC  模数转换 引用地址:【菜鸟入门】stm32 之 ADC 模数转换

上一篇:【菜鸟入门】stm32 之 实时时钟
下一篇:【STM库应用】stm32 之 TIM (详解一 通用定时器)

推荐阅读最新更新时间:2024-11-05 16:23

STM32串口发送问题
在串口1发送中,第一个字总是发不出来,单步调试发送正常,硬件上电复位发送不正常,发现是STM32上电复位后需要先读取 USART_SR,然后写 USART_DR,解决办法在串口初始化加入USART_GetFlagStatus(USART2, USART_FLAG_TC); void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
stm32检测按键单击,双击,长按
硬件连接: 按键上拉 外设配置: 外部配置为下降沿中断,定时器中断时间为5ms。定时器中断抢占优先级必须高于外部中断 检测方法: 定义一个时间,在该时间段里检测到一个下降沿,认为是单击;低电平持续时间超过该时间,认为是长按;检测到两个下降沿认为是双击。 代码 #define KEY_PRESS_TIME 800 //检测时间段 uint16_t key_time_cnt = KEY_PRESS_TIME + 5; bool key_pressed = false; //单击标志 bool key_long_pressed = true; //长按标志 void
[单片机]
STM32 FSMC操作SRAM的步骤简析
本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单元。其具有高性能、低功耗特点。为方便用户扩展SRAM的存储空间,为用户有提供了两个片选引脚;此外,含有两个字节控制信号UB和LB,可方便用户按字节访问SRAM或按字访问SRAM。IS62WV51216具有45ns/55ns访问速度,因为是全静态操作,因此无需外部时钟和刷新要求。 IS62WV51216功能框图 IS62WV51216有地址译码器、数据IO、控制逻辑和存储阵列四部分构成。地址译码器将1
[单片机]
<font color='red'>STM32</font> FSMC操作SRAM的步骤简析
增量累加ADC的应用
增量累加ADC表面上看起来也许很复杂,但实际上它是由一系列简单的部件所构成的精确数据转换器。增量累加ADC由两个主要构件组成:执行模数转换的增量累加调制器和数字低通滤波器/抽取电路。增量累加调制器的基本构件(集成运算放大器、求和节点、比较器/1 位ADC和1位DAC)如图1所示。调制器的充电平衡电路强制比较器的数字输出位流来代表平均模拟输入信号。在把比较器输出回送至调制器的1位DAC的同时,还利用一个低通数字滤波器对其进行处理。这个滤波器主要计算0和1的数量,并去掉大量噪声,从而实现高达24位的数据转换器。      图 1:增量累加 ADC 由执行模数转换的增量累加调制器及其后的数字滤波器和抽取器组成   ana
[模拟电子]
增量累加<font color='red'>ADC</font>的应用
STM32单片机GPIO端口使用
简介: 最近一段时间在学STM32,感觉都是在和寄存器打交道,首先先说下什么是寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。 STM32的每个IO口有7个寄存器控制(1个IO口应该就是一组),分别是两个32位的端口配置寄存器,CRL和CRH。两个32位的数据寄存器IDR和ODR(这上面四个是重点),一个32位置位复位寄存器,一个16位复位寄存器,一个锁存寄存器LCKR. ____________________________________________________________________________________________________
[单片机]
STM32学前班教程之三:让PC工作,开发软件的选择
1、 软件与版本的选择 需求:支持STLink2或未来的Jlink V7调试接口(因为STM32-SK使用这个接口),能够找到去除软件限制的方法,最好具有中文版帮助和界面,最好带有纯软件仿真 选择:RealView MDK 3.23RPC或者IAR EWARM 4.42A(5版本观望一下)。 2、 RealView MDK 3.23RPC(中国版)安装与去除限制 第一步:执行安装程序完成基本安装,最后选项选择加入虚拟硬件,便于纯软件调试。 第二步:执行软件,点击File-- Licence Manager,复制CID的数据到破解器的CID,其他选项如下图,然后点击Generate。 第三步:复制LIC0的数据到软件的LI
[单片机]
关于STM32软件复位代码编写
对于STM32来说软件复位有两种方式: 1)采用官方自带的软件库 在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数 /******************************************************************************* * Function Name : NVIC_GenerateSystemReset * Description : Generates a system reset. * Input : None * Output : None * Return : None ***********
[单片机]
stm32adc使用(借鉴)
STM32F407_ADC查询模式配置介绍 1.ADC对应管脚介绍 |---管脚------对应ADC----||---管脚------对应ADC----| | PA0 --- ADC123_IN0 || PA1 --- ADC123_IN1 | | PA2 --- ADC123_IN2 || PA3 --- ADC123_IN3 | | PA4 --- ADC12_IN4 || PA5 --- ADC12_IN5 | | PA6 --- ADC12_IN6 || PA7 --- ADC12_IN7 | | PB0 --- ADC12_IN8 || PB1 --- ADC12_IN9 | | PC4 --- ADC12_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved