洋桃开发板笔记(八 )ADC初识——模数转换


STM32的ADC初识

杜洋工作室 www.DoYoung.net

洋桃电子 www.DoYoung.net/YT

  • 在此声明一下所有代码均为杜洋工作室的不允许复制,转发以及在商业上的行为等,本人只是在此程序上进行理解和注释。

上一次的笔记是在洋桃的程序上了解了DMA的大概框体,主要讲解DMA的一些概念。对DMA有兴趣可以去看看:
https://blog.csdn.net/qq_40546576/article/details/100075437
本次主要讲的是了解ADC的使用。由于本次特殊,需要截取部分图片进行讲解,可能造成了观看不适,请大家谅解!谢谢。


模数转换器

模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。


主要代码

你如果看不懂代码不要急,下面有详细的解释。
和前面一样,我们最主要的是会用最基本的ADC的语句(固件库函数),其他仅为了解,为后期提高而已。

vu16 ADC_DMA_IN[2]; //ADC数值存放的变量,该地址为NAND Flash的某个位置。

void ADC_DMA_Init(void) //DMA初始化设置
{ 
	DMA_InitTypeDef  DMA_InitStructure;//定义DMA初始化结构体
	DMA_DeInit(DMA1_Channel1);//复位DMA通道1  这个要查手册,每个DMA的通道,有哪些可以用的
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address
	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN; //定义DMA通道ADC数据存储器(其他可直接读此变量即是ADC值)
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
	DMA_InitStructure.DMA_BufferSize = 2;//!!!定义DMA缓冲区大小(根据ADC采集通道数量修改)
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//!!! 当前存储器地址:Disable不变,Enable递增(用于多通道采集)
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1
	DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
}
void ADC_GPIO_Init(void){ //GPIO初始化设置,把它相应的转换为ADC需要的端口。
	GPIO_InitTypeDef  GPIO_InitStructure; 	//声明端口的结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟(用于ADC的数据传送)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟
     GPIO_InitStructure.GPIO_Pin = ADC_CH4 | ADC_CH5; //!!!选择端口                        
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //选择IO接口工作方式       
	GPIO_Init(ADCPORT, &GPIO_InitStructure);			
}
void ADC_Configuration(void){ //初始化设置
	ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量
	ADC_GPIO_Init();//GPIO初始化设置
	ADC_DMA_Init();//DMA初始化设置
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 2;//!!!顺序进行规则转换的ADC通道的数目(根据ADC采集通道数量修改)
	ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
	//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
	//ADC1,ADC通道x,规则采样顺序值为y,采样时间为28周期		 
	ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_28Cycles5);// ADC1选择信道x,采样顺序y,采样时间n个周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_28Cycles5);// ADC1选择信道x,采样顺序y,采样时间n个周期
	ADC_DMACmd(ADC1, ENABLE);// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
	ADC_Cmd(ADC1, ENABLE);//使能ADC1
	ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器
	while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
	ADC_StartCalibration(ADC1);//开始ADC1校准
	while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
	ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}

参考手册相关内容

在这里插入图片描述
官方的固件库手册中也表明了,为多通道输入的,12位分辨率ADC。
在这里插入图片描述
规则组正常的ADC采集, 注入组是触发中断方式的ADC采集


我们拿出代码原图进行分别讲解

1、ADC.h的文件

相关函数及变量的声明
在这里插入图片描述
ADC1_DR_Address这个地址来历在这里插入图片描述
在STM32中每个功能都有自己的映射地址,在手册28页2.3 存储器映像
我们这是需要使用ADC1,要找到映射地址在这里插入图片描述
这个地址里面有STM32的ADC1所有的信息,我们需要ADC转化后的数据,进行处理。
需要到手册181页,我们可以找到ADC_DR是存放ADC数据的地址偏移量4Ch
在这里插入图片描述
可以看出来,高16位是ADC2转换为DATA的数据,低16为ADC1转换为DATA的数据
呢么我们现在需要外部ADC1的映射地址位置应该为,起始地址(ADC1)+偏移量(需要的内容)=映射地址
映射地址=0x40012400+0x4C=0x4001244C。
是DMA1里面ADC1对应的地址,每个都不一样,需要到参考手册查询。
在这里插入图片描述
这些只是一些的端口该一个好记名称,本质没有变化。顺便声明了一下。
在这里插入图片描述
声明了一下函数,初始化函数。
这时我们接着上次的DMA函数,在进行一次分析
在这里插入图片描述
我相信大家认真看看应该会有些了解,注释很详细了。
接下来我们解释代码,我们主要解释我们可以修改的地方

一、这为DMA的初始化

在这里插入图片描述
1、我们需要用到把DMA清空原先配置的内容 DMA_DeInit(DMA1_Channel1);//复位DMA通道1
2、外设地址我们选择需要用到ADC1转化后的映射地址 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
3、外设地址有了,内部存储器转移的目标地址选择自己声明的变量地址,但是我们变量用数组进行存放,如下DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN;
4、指定一下数据的传输方向DIR是英文方向的简写,注意这需要填写“源地址” DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
5、在需要设定传输通道个数 DMA_InitStructure.DMA_BufferSize = 2
6、由于外设ADC1转换数据只存放在一个位置,而内部为数组两个数值,所以外部地址不需要自增,内部地址需要
在这里插入图片描述
7、外设数据大小和内部数据大小应该设定一致,否则高位重复低位数据,这里我们全部设定为16位的数据
在这里插入图片描述
8、DMA是否工作在,单次还是循环的模式,我们这里是选择 位环形缓冲模式,就是不断的送数据,不管上一次的数据是否用过。直接放入新的数据。DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
9、优先级的选择,设定为高,一共有4种选择 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
10、我们这里不需要内存向内存送数据,所以直接关闭M2M
在这里插入图片描述
11、接下来配置和使能一下通道就完成了DMA的初始化
在这里插入图片描述

二、端口的初始化GPIO

一些基本的GPIO初始化函数
在这里插入图片描述
1、由于我们这里需要用到ADC,和DMA,所以洋桃家在这里,配置时钟时,也顺便在这里配置了,便于查找。
ADC和DMA的时钟配置需要到时钟树可以看到,我这里截的时系统结构的
在这里插入图片描述

三、ADC初始化函数

函数内容
在这里插入图片描述
1、GPIO的初始化和DMA的初始化
在这里插入图片描述
2、ADC的一些先关配置,可以参考,固件库手册
在这里插入图片描述
3、我们ADC1通道数用两条
在这里插入图片描述
4、配置ADC的设置
在这里插入图片描述
5、我们这里采用规则组,并且选择通道,和优先级,还有采样时间
在这里插入图片描述
6、一些,不需要调的参数,开启使能和校准等等,还有开始ADC转换使能
在这里插入图片描述
基本上配置结束了,接下来我们讲解主函数,需要怎么的到数据和处理一些简单的数据。

四、MAIN.C主函数

在这里插入图片描述
我们的ADC数据均在ADC_DMA_IN[ ]数组中,我们直接使用就可以了。


参考来源:

  • Google搜寻引擎等等
  • 杜洋工作室 www.DoYoung.net
  • 洋桃电子 www.DoYoung.net/YT
  • STM32库开发实战指南 基于STM32F103(第二版)
  • 《stm32f1xx 参考手册》
  • 《stm32f1xx 固件库》

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 洋桃iot(YoungTek IoT)开发板资料包是为开发者提供的一套包含相关学习资料和资源的综合套件。该资料包可以帮助开发者学习和使用洋桃iot开发板进行物联网应用的开发。 洋桃iot开发板资料包通常包含以下内容: 一、开发板硬件手册:介绍了洋桃iot开发板的各个硬件接口和功能,以及相关的操作和使用方法。开发者可以通过该手册了解开发板的硬件架构和特性。 二、开发板软件说明:介绍了开发板的软件部分,包括操作系统、驱动程序和开发工具等。开发者可以通过该说明学习如何使用开发板的软件部分。 三、开发板示例代码:提供了一些常见的物联网应用的示例代码,包括传感器数据采集、数据传输和远程控制等。开发者可以通过学习这些示例代码,了解如何使用洋桃iot开发板进行应用开发。 四、开发板编程教程:提供了一些基本的编程教程,包括C语言和Python等常用的编程语言。开发者可以通过学习这些教程,了解如何使用洋桃iot开发板进行编程和应用开发。 五、技术支持:洋桃iot开发板资料包通常还提供技术支持,开发者可以通过官方网站或者在线社区等途径获取技术支持和解答问题。 综上所述,洋桃iot开发板资料包提供了一套丰富的学习资源,帮助开发者快速入门并掌握洋桃iot开发板的使用,从而进行物联网应用的开发。 ### 回答2: 洋桃IoT开发板是一种集成了物联网技术的开发板,它的资料包包括以下内容: 1. 开发板说明书:详细介绍了洋桃IoT开发板的硬件结构、接口定义、功能特点,以及如何进行开发和调试。 2. 开发工具:提供了适用于洋桃IoT开发板的开发工具,包括编程软件、调试工具等,方便开发者进行项目开发和调试。 3. 示例代码:提供了一些常见的示例代码,涵盖了物联网应用的基本功能,如传感器数据采集、网络通信、云平台连接等,开发者可以根据自己的需求进行修改和扩展。 4. 电路原理图:提供了洋桃IoT开发板的电路原理图,方便开发者深入理解开发板的硬件设计和接口电路连接。 5. 相关资料和参考文档:提供了一些与洋桃IoT开发板相关的资料和参考文档,如芯片手册、通信协议等,帮助开发者更好地了解和使用开发板洋桃IoT开发板具有良好的兼容性和易用性,开发者可以基于此开发板快速开发物联网应用,并实现硬件与软件的高度整合和互联互通。通过使用洋桃IoT开发板,开发者可以更加方便地实现物联网产品的开发和部署,加快产品上市和推广的速度。 ### 回答3: 洋桃iot开发板是一款功能强大且易于使用的物联网开发板。该开发板提供了丰富的资料包,用于帮助开发人员快速上手和开发物联网应用。 首先,洋桃iot开发板资料包中包含了详细的硬件说明书。该说明书介绍了开发板的主要硬件组成、连接方式以及引脚定义等信息,让开发人员了解开发板的结构和功能。 其次,资料包中还包括了示例代码和开发工具。开发人员可以通过这些示例代码快速入门,了解如何使用洋桃iot开发板进行基本的物联网应用开发。开发工具则提供了一个集成开发环境,方便开发人员编写、调试和上传代码到洋桃iot开发板。 此外,洋桃iot开发板资料包中还提供了丰富的教程和文档。这些教程和文档从不同层面介绍了物联网的基础知识、使用洋桃iot开发板的方法和技巧,以及常见问题的解决方法。开发人员可以通过这些资源深入学习和理解物联网的原理和应用。 最后,洋桃iot开发板资料包还包括了团队的技术支持渠道。开发人员可以通过官方网站、社区论坛或邮件联系技术支持团队,提出问题或寻求帮助。这样可以确保开发过程中遇到的问题得到及时解决,提高开发效率。 总之,洋桃iot开发板资料包提供了全面的资源和支持,为开发人员提供了便利。借助这些资料和工具,开发人员可以快速开发出高质量的物联网应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mannixcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值