STM32—ADC多通道采集电压

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的信息。

  • 27
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
STM32中,ADC是一个十分重要的模块,它可以用来对外部信号进行模拟量采集。对于多通道电压采集STM32的ADC可以通过DMA方式实现多通道采集,这样可以提高采样效率和精度。 下面是一个示例代码,演示如何使用STM32的ADC进行多通道电压采集: ```c #include "stm32f10x.h" #define ADC1_DR_Address ((u32)0x4001244C) void ADC1_GPIO_Config(void); void ADC1_Mode_Config(void); void ADC1_DMA_Config(void); u16 ADC_ConvertedValue[3]; int main(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 3; 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_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); ADC1_GPIO_Config(); ADC1_Mode_Config(); ADC1_DMA_Config(); while (1); } void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); /* Configure PA0, PA1 and PA2 as analog input -----------------------------------------*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); } void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_DeInit(ADC1); 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 = 3; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel configuration ---------------------------------------*/ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA ----------------------------------------------------------*/ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 --------------------------------------------------------------*/ ADC_Cmd(ADC1, ENABLE); /* ADC1 reset calibration ---------------------------------------------------*/ ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); /* ADC1 calibration ---------------------------------------------------------*/ ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); } void ADC1_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* DMA channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 3; 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_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); } ``` 在代码中,使用了ADC1、DMA1和GPIOA模块。首先是GPIO的配置,将PA0、PA1和PA2配置为模拟输入。然后是ADC的配置,设置了ADC1的扫描模式和DMA模式,并将PA0、PA1和PA2分别作为ADC1的第1、2和3个通道。最后是DMA的配置,使能了DMA1的通道1,并设置了DMA的传输方向、缓存地址和大小等参数。在主函数中,使用了一个无限循环,这样可以让程序一直运行,不会退出。 在本示例中,使用了连续转换模式,因此ADC会不断地采集多个通道电压值,并通过DMA将采集到的数据传输到内存中。因此,可以通过访问ADC_ConvertedValue数组来获取采样数据。 需要注意的是,在使用多通道采集时,采样顺序与通道顺序有关。在本示例中,采样顺序为ADC_Channel_0、ADC_Channel_1和ADC_Channel_2,因此ADC_ConvertedValue数组中的第一个元素是ADC_Channel_0的采样值,第二个元素是ADC_Channel_1的采样值,第三个元素是ADC_Channel_2的采样值。如果需要改变采样顺序,只需要修改ADC_RegularChannelConfig函数的通道顺序即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值