历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2021年09月03日 | STM32—ADC多通道采集电压

2021-09-03 来源:eefocus

ADC详解

前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍:ADC详解


程序说明

为了使这次代码阅读方便,博主没有在头文件中宏定义变量,都是直接采样库函数中的规定形参。此次采用多通道采集电压,使用ADC1的通道10、11、12、13、14、15一共六个通道,采用DMA将转换结果传输至内存。


函数主体

引脚配置

引脚配置的时候,将所有引脚一次性配置好,过于简单,不作详细说明。


void ADC_GPIO_Config(void)

{

GPIO_InitTypeDef   GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,  ENABLE);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN ;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|

GPIO_Pin_1|

GPIO_Pin_2|

GPIO_Pin_3|

GPIO_Pin_4|

GPIO_Pin_5;

GPIO_Init(GPIOC , &GPIO_InitStruct);

}


ADC和DMA配置

此函数中主要配置了ADC的相关信息和DMA的信息。


uint16_t result[6]={0,0,0,0,0,0};


void ADC_DMA_COnfig(void)

{

ADC_InitTypeDef  ADC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,  ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* 复位DMA1的通道1 */

DMA_DeInit(DMA1_Channel1);

// 配置 DMA 初始化结构体

// 外设基址为:ADC 数据寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( ADC1_BASE+0x4c);

// 存储器地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)result;

// 数据源来自外设

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

// 缓冲区大小,应该等于数据目的地的大小

DMA_InitStructure.DMA_BufferSize = 6;

// 外设寄存器只有一个,地址不用递增

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;


// 存储器地址递增

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 

// 外设数据大小为半字,即两个字节

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

// 内存数据大小也为半字,跟外设数据大小相同

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

// 循环传输模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;


// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

// 禁止存储器到存储器模式,因为是从外设到存储器

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

// 初始化DMA

DMA_Init(DMA1_Channel1, &DMA_InitStructure);

// 使能 DMA 通道

DMA_Cmd(DMA1_Channel1 , ENABLE);

// ADC 模式配置

// 只使用一个ADC,属于单模式

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

// 扫描模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE ; 


// 连续转换模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;


// 不用外部触发转换,软件开启即可

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;


// 转换结果右对齐

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

// 转换通道个数

ADC_InitStructure.ADC_NbrOfChannel = 6;

// 初始化ADC

ADC_Init(ADC1, &ADC_InitStructure);

// 配置ADC时钟为PCLK2的8分频,即9MHz

RCC_ADCCLKConfig(RCC_PCLK2_Div8); 

// 配置ADC 通道的转换顺序和采样时间

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_55Cycles5);

// 使能ADC DMA 请求

ADC_DMACmd(ADC1, ENABLE);

// 开启ADC ,并开始转换

ADC_Cmd(ADC1, ENABLE);

// 初始化ADC 校准寄存器  

ADC_ResetCalibration(ADC1);

// 等待校准寄存器初始化完成

while(ADC_GetResetCalibrationStatus(ADC1));

// ADC开始校准

ADC_StartCalibration(ADC1);

// 等待校准完成

while(ADC_GetCalibrationStatus(ADC1));

// 由于没有采用外部触发,所以使用软件触发ADC转换 

ADC_SoftwareStartConvCmd(ADC1, ENABLE);


函数开头定义了ADC和DMA的结构体变量,并且打开了俩个外设的时钟(DMA挂载在AHB总线上)。DMA模块可以参考之前写的博客:DMA

这次DMA传输是从外设到内存,直接从ADC的数据寄存器中取数据,然后传输到全局数组变量result中。剩下的都在函数中作了详细注解。


主函数

#include "stm32f10x.h"

#include "usart.h"

#include "adc.h"


extern uint16_t result[6];

float voltage[6];


void delay(void)

{

uint32_t k=0xffffff;

while(k--);

}


int main(void)

{

uint8_t n;

/* 配置串口 */

DEBUG_USART_Config();

/* 有关ADC的函数打包 */

ADCx_Init();

while(1)

{

for(n=0;n<6;n++)

{

    /* 转换为实际电压 */

voltage[n]=(float) result[n]/4096*3.3;

printf("n通道%d的值为:%fVn",n,voltage[n]);

}

delay();

}

}


主函数中也有相应注解。

推荐阅读

史海拾趣

DRI Relays Inc公司的发展小趣事

为了满足全球客户的需求,DRI Relays Inc公司开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立了分公司和研发中心,以便更好地了解当地市场需求和提供定制化服务。同时,公司还积极参与国际展览和交流活动,加强与全球客户的沟通和合作。这些举措不仅提高了公司的国际知名度,还为公司赢得了更多的订单和市场份额。

超霸(GP)公司的发展小趣事

绿索超容在追求经济效益的同时,始终不忘履行社会责任。公司积极响应国家绿色发展的号召,致力于环保事业和可持续发展。在产品研发和生产过程中,绿索超容始终坚持绿色、低碳、环保的理念,采用环保材料和工艺,减少对环境的影响。此外,公司还积极参与社会公益活动,为社会贡献自己的力量。这些举措不仅提升了绿索超容的企业形象,也为其在电子行业中树立了良好的口碑。

Glenair公司的发展小趣事
如果设定的欠电压保护阈值过高或过低,都可能导致电路无法正确触发保护动作。
Gennum ( Semtech )公司的发展小趣事
作为输出设备,用于显示电路的工作状态。
ept Connectors公司的发展小趣事

EPT Connectors公司成立于1967年,由创始人Bernhard Guglhör在德国的某个小镇上创建。起初,公司专注于连接器的小规模制造,以满足当地电子设备的需求。随着技术的不断进步和市场的扩大,EPT逐渐意识到连接器在电子设备中的重要性,并决定专注于这一领域的发展。经过几年的努力,EPT在德国建立了自己的总部,并开始向国际市场拓展。

Globaltech Semiconductor Co Ltd公司的发展小趣事

随着技术的不断成熟,Globaltech开始积极拓展国际市场。公司通过与国内外多家系统厂商建立紧密的合作关系,共同开发新产品,进一步提升了其市场竞争力。特别是在亚洲市场,Globaltech凭借其高性价比的产品和快速的响应能力,迅速占据了大量市场份额。同时,公司还积极参与国际展会,与全球客户面对面交流,进一步提升了品牌知名度和影响力。

问答坊 | AI 解惑

国半推出新款PWM降压控制器,采用低噪音仿电流模式结构

美国国家半导体公司宣布推出一款新的脉冲宽度调制(PWM)降压控制器,其特点是采用美国国家半导体独有的仿电流模式(ECM)结构,确保输出电压时占空比可以降至最低,而开关频率可以高达1.5MHz。 这款型号为LM3495的降压控制器可为ASIC、FPGA、数字信号 ...…

查看全部问答>

DSP芯片的原理和开发应用(3)

2.4 TI浮点DSP芯片 2.4.1 TMS320C3X TMS320C3X是TI的第三代产品,也是第一代浮点DSP芯片。TMS320C3X中目前具有TMS320C 30、TMS320C31和TMS320C32三种。TMS320C31是TMS320C30的简化和改进型,它在TMS320 C30的基础上去掉了一般用户不常用的 ...…

查看全部问答>

为何在数字信号处理系统价格如此低廉而且功能如此强大时,仍推荐模拟信号处理?

解答:因为有些时候模拟信号处理价格甚至更为低廉,而且可以完成数字信号处理不能完成的功能。模拟信号处理电路的销量可以证明这种说法。   伦敦南肯辛顿(South Kensington)科学博物馆建于维多利亚女王统治时期。尽管它运行良好而且很值得参 ...…

查看全部问答>

09电赛猜题群!信号+控制类!

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 QQ号:89212186 集各省高手,猜09赛题! 大家抓紧时间,多多交流,争取缩小赛题!  …

查看全部问答>

外企机械工程师的二十年职业感悟

89年毕业,国企4年,民企2年,港企7年,意企5年,日韩合资企业2年,经历非标设备、玩具、电子、自动化设备行业。 在珠三角亲历了“中国制造”的繁荣壮大,也感受到目前金融海啸带来的凛冽气息,对“中国制造”有一些管窥之见,结合本人的经历,在 ...…

查看全部问答>

如何用 diff及其他工具写一个版本控制系统?

摘自:arm linux fpga 嵌入0群  49900581(超级群)  群主在坛子里ID:wangkj wangkj:32. 如何用 diff 及其他工具写一个版本控制系统?(要有 check in, check out, file lock .. 等功能) 先知_找到了:不是都有免费 ...…

查看全部问答>

请教关于CE下右键功能消失的问题

请教各位:    在正常情况下,手按住触摸屏会出现一个小圆圈,然后弹出菜单:图标排列方式、刷新、粘贴、新建文件夹、属性等 类似鼠标右键功能 但是我的PDA用一段时间后就没有这个功能了,长按触摸屏,相当于只按左键,并不弹出菜单 ...…

查看全部问答>

VxWorks5.5是否支持PCI Express

vxworks5.5是否对PCI Express能够支持? 还是只要BSP中对其支持就可以了? 刚学VxWorks不是很长时间,对很多问题不是很清楚,希望各位能够帮我解答这个问题,还有就是在VxWorks下写PCI Express设备的驱动与PCI设备的驱动区别大吗?…

查看全部问答>

信号线与电源线共用的问题

我现在有两个电路模块,需要互相通信,数据量少,采用类似485的通信就可以了。但是我想用通信线由其中的一块电路板给另外电路板供电,即两根线既用来通信又做电源线,请问大家有做个类似项目的吗?给点思路啊。谢谢!…

查看全部问答>

压力传感器!!!!

有没有高手用过压力传感器啊,用凌阳单片机采集信息。 主要内容:从一个容器向另一个容器注水,用压力传感器测出容器中水量变化,传给单片机处理。 有人推荐我使用MPX5010,但是以前没有用过,还请高手们指点啊!!!!!!!!!…

查看全部问答>