当前位置:首页 > 单片机 > 单片机
[导读] 1. 本次实践目标 a. 完成外部 ADC 的采集, 连接引脚为 PC2 b. 完成 STM32 内置温度传感器 ADC 的采集 c. ADC 的采集必须以 DMA 的方式工作,通过 FreeRTOS 系统中创建的一个进程读取采集结果,并打包

 

1. 本次实践目标

a. 完成外部 ADC 的采集, 连接引脚为 PC2

b. 完成 STM32 内置温度传感器 ADC 的采集

c. ADC 的采集必须以 DMA 的方式工作,通过 FreeRTOS 系统中创建的一个进程读取采集结果,并打包通过网络发送至上位机

 

2. 查看 datasheet

 

2.1 确认 STM32 内部温度传感器 使用哪个 ADCx , 使用哪个 channel

 

经确认,STM32 内部温度传感器使用 ADC1 的 channel_16。

2.2 查看 PC2 引脚作为 ADC 输入时,使用哪个 ADCx, 使用哪个 channel

 

经确认,STM32 的 PC2 引脚可以使用 ADC[1,2,3] 的 channel_12。

 

2.5.4 ADC 配置

 

A.初始化基本参数:

DMA_PeripheralBaseAddr = ADC1_DR_Address;

#define ADC1_DR_Address ((u32)0x40012400+0x4c)
#define ADC1_BUF_SIZE 2
#define TOTAL_CONVERT_CH_NUM 2

vu16 ADC_Buf[2];

其中 ADC1_DR_Address 可从数据手册中查得

第一个参数 DMA_PeripheralBaseAddr 用来设置 DMA 传输的外设基地址,比如要进行ADC采集,那么外设基地址 ADC1 数据存储器 ADC1->DR 的地址,表示方法为 (u32) & ADC1->DR,当然也可以通过数据手册直接算出外设的地址。
第二个参数 DMA_MemoryBaseAddr 为内存基地址,也就是我们存放DMA传输数据的内存地址 = (u32)ADC_Buf。
第三个参数 DMA_DIR 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数据发送到外设,也就是外设是源地还是目的地,这里我们设置为从外设地址读取数据,所以外设是源地了,所以选择值为DMA_DIR_PeripheralSRC。
第四个参数 DMA_BufferSize 设置一次传输数据量的大小,我们需要采集两个通道的数据 所以设置为ADC1_BUF_SIZE
第五个参数 DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增。设置为DMA_PeripheralInc_Disable;
第六个参数 DMA_MemoryInc 设置传输数据时候内存地址是否递增,由于我们是多通道采集,因此需要递增
第七个参数 DMA_PeripheralDataSize 用来设置外设的的数据长度是为字节传输(8bits),半字传输(16bits)还是字传输(32bits),这里我们是 16 位半字传输,所以值设置为 DMA_PeripheralDataSize_HalfWord
第八个参数 DMA_MemoryDataSize 是用来设置内存的数据长度,同样设置为半字传输 DMA_PeripheralDataSize_HalfWord。
第九个参数 DMA_Mode用来设置DMA模式是否循环采集。
第十个参数是设置 DMA 通道的优先级,有低,中,高,超高三种模式,这里我们设置优先级别为高级,所以值为DMA_Priority_High。因为开启多个通道,这个值非常重要。
第十一个参数 DMA_M2M 设置是否存储到存储器模式传输设置为 DMA_M2M_Disable。

工作模式:ADC_Mode =ADC_Mode_Independent;

总共有10种,主要都是针对双ADC下使用。针对初学者这里不多描述,感兴趣的朋友可以先自行研究一下各个模式的使用。

 

浏览模式:ADC_ScanConvMode = ENABLE;

主要是针对多条通道而言,也就是说你是否有多条通道。

多通道:ENABLE;

单通道:DISABLE;

 

转换模式:ADC_ContinuousConvMode =ENABLE;

这里是配置是否需要连续转换。

连续转换ENABLE:也就是只需要启动(触发)转换一次,后面就不用再次启动(触发)就可以连续工作了。

 

单次转换DISABLE:也就是根据一次转换完后需要再次启动(触发)才能工作。

 

触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

触发方式也就是使用什么方法触发ADC转换。哟定时器、外部触发、软件触发,一般常用软件触发。这里有很多种触发方式,详情可以参考其参数。

 

对其方式:ADC_DataAlign = ADC_DataAlign_Right;

右对齐:低12位数据为有效位(常用);

左对齐:高12为数据为有效位;

 

通道数:ADC_NbrOfChannel =TOTAL_CONVERT_CH_NUM;

这个参数比较简单,我们定义工作的通道数量。

 

B.设置规则组通道:

ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5);

我们定义通道12的转换顺序为第1、通道16的转换顺序为第2;

至于为什么ADC_Channel_16 的采集周期要设置为ADC_SampleTime_239Cycles5,是因为 STM32 的内部温度传感器要求的,现在 ADC1 的时钟源为 APB2 时钟分枝 8 分频,即 72MHz/8 = 9MHz。而要求采样周期 ≥ 17.1us, 所以 17.1 * 9 = 153.9,而最接近的也就是ADC_SampleTime_239Cycles5

2.5.4 读取采集结果

 

到此,本次实践总结完毕。

 

其实,其它的 外设 DMA 控制方式与些类似,本次总结比较详细,也算是一个笔记。

 

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

系统设计师通常侧重于为应用选择最合适的数据转换器,在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而,如果不慎重考虑时钟发生器、相位噪声和抖动性能,数据转换器、动态范围和线性度性能可能受到严重的影响。

关键字: 时钟发生器 adc

专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开始备货TI TLV915x运算放大器和ADS7128 12位模数转换器 (ADC)。

关键字: 贸泽 adc 模数转换器

自然界产生的信号,都是模拟信号,比如我们说话的声音,看到的景色,感受到的温度、湿度、压力、流速、光、电、风及个人的呼吸、血压、体温、心跳、体重、血糖,体脂等等。这些模拟信号都得最终放在电脑,手机等数字领域进行处理,存储或...

关键字: adc 模拟信号

为增进大家对ADC的认识和了解,本文将基于两方面对ADC予以介绍:1.什么是并行ADC,并行ADC的基本原理是什么?2.流水线ADC与其它ADC有何区别。

关键字: adc 指数 流水线adc

ADC是电子电路中常用器件,大家对于ADC也较为熟悉。为增进大家对ADC的了解,本文将对高速ADC以及流水线ADC结构予以介绍。

关键字: adc 指数 流水线adc

ADC也即数模转换器,在现实中,ADC具备重要作用。对于ADC,电子相关专业的朋友想必相当熟悉。为增进大家对ADC的认识,本文将对管道ADC以及其原理予以介绍。

关键字: adc 指数 管道adc

设计人员有各种模数转换器(ADC)可以选择,数字数据输出类型是选择过程中需要考虑的一项重要参数。

关键字: 高速转换器 数字数据 adc

ADC包括三个基本功能:抽样、量化和编码。如何实现这三个功能,就决定了ADC的形式和性能。

关键字: 模数转换 adc

自然界产生的信号,都是模拟信号,比如我们说话的声音,看到的景色,感受到的温度、湿度、压力、流速、光、电、风及个人的呼吸、血压、体温、心跳、体重、血糖,体脂等。这些模拟信号都得最终放在电脑,手机等数字领域进行处理,存储或者...

关键字: adc 电源设计

在设计ADC电路时,一个常见的问题是“如何在过压条件下保护ADC输入”。那么,在过压情形中,可能出现哪些问题?发生的频率又是怎样的?有木有潜在的补救措施?

关键字: adc 电源设计
关闭
关闭