前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32F103系列多通道采集ADC

STM32F103系列多通道采集ADC

作者头像
用户11186929
发布2024-07-01 12:28:02
860
发布2024-07-01 12:28:02
举报
文章被收录于专栏:技术干货技术干货

adc.c

代码语言:javascript
复制
#include "adc.h"

uint16_t ADC_Converted_Value[ADC_NOFCHANNEL]={0,0,0,0,0,0,0,0,0,0};

static void AdcGpioInit(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(ADC_GPIO_CLK0 | ADC_GPIO_CLK1,ENABLE);
    
    //PA0~PA7
    GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN0 | ADC_GPIO_PIN1 | ADC_GPIO_PIN2 | 
                                  ADC_GPIO_PIN3 | ADC_GPIO_PIN4 | ADC_GPIO_PIN5 |
                                  ADC_GPIO_PIN7 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(ADC_GPIO_PORT0,&GPIO_InitStructure);
    
    //PB0 PB1
    GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN8 | ADC_GPIO_PIN9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(ADC_GPIO_PORT1,&GPIO_InitStructure);
}


static void AacModeConfig(void)
{
    DMA_InitTypeDef        DMA_InitStructure;
    ADC_InitTypeDef        ADC_InitStructure;
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    RCC_APB2PeriphClockCmd(ADC_CLK,ENABLE);
    //复位
    DMA_DeInit(ADC_DMA_CHANNEL);
    //配置dma
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));                //ADC数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Converted_Value;            //内部SRAM的变量
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                //数据源来自外设
    DMA_InitStructure.DMA_BufferSize = ADC_NOFCHANNEL;                                //缓冲区为10
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                //地址不递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;                        //存储器地址固定
    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传输通道优先级最高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                    //禁止存储器到存储器模式
    
    //初始化DMA
    DMA_Init(ADC_DMA_CHANNEL,&DMA_InitStructure);
    DMA_Cmd(ADC_DMA_CHANNEL,ENABLE);
    
    //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 = ADC_NOFCHANNEL;                            //转换通道十个
    
    //初始化ADC
    ADC_Init(ADC1,&ADC_InitStructure);    
    //配置ADC时钟为 PCLK2的6分频  72/6=12MHz  ADC最大时间尽量不超过14M
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);        
    //配置ADC通道转换顺序为1,第一个转换,采样时间为239.5个时钟周期采集周期长一点越精确
    //ADC_RegularChannelConfig(ADC1,ADC_CHANNEL0,0,ADC_SampleTime_239Cycles5);//PA0
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL1,1,ADC_SampleTime_239Cycles5);//PA1
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL2,2,ADC_SampleTime_239Cycles5);//PA2
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL3,3,ADC_SampleTime_239Cycles5);//PA3
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL4,4,ADC_SampleTime_239Cycles5);//PA4
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL5,5,ADC_SampleTime_239Cycles5);//PA5
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL6,6,ADC_SampleTime_239Cycles5);//PA6
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL7,7,ADC_SampleTime_239Cycles5);//PA7
    
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL8,8,ADC_SampleTime_239Cycles5);//PB0
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL9,9,ADC_SampleTime_239Cycles5);//PB1
    
    ADC_DMACmd(ADC1,ENABLE);
    ADC_Cmd(ADC1,ENABLE);
    //校准寄存器
    ADC_ResetCalibration(ADC1);
    //等待校准寄存器初始化完成
    while(ADC_GetResetCalibrationStatus(ADC1));
    //开始校准
    ADC_StartCalibration(ADC1);
    
    while(ADC_GetCalibrationStatus(ADC1));
    //软件触发ADC转换
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    
}

void AdcInit(void)
{
    AdcGpioInit();
    AacModeConfig();
}

adc.h

代码语言:javascript
复制
#ifndef _ADC_H_
#define _ADC_H_

#include "stm32f10x.h"

#define ADC_NOFCHANNEL                10
#define ADC_CLK                        RCC_APB2Periph_ADC1

#define ADC_GPIO_CLK0                RCC_APB2Periph_GPIOA
#define ADC_GPIO_PORT0                GPIOA

#define ADC_GPIO_CLK1                RCC_APB2Periph_GPIOB
#define ADC_GPIO_PORT1                GPIOB


#define ADC_DMA_CHANNEL                DMA1_Channel1
//PA0
//#define ADC_GPIO_PIN0                GPIO_Pin_0
//#define ADC_CHANNEL0                ADC_Channel_0
//PA1
#define ADC_GPIO_PIN1                GPIO_Pin_1
#define ADC_CHANNEL1                ADC_Channel_1
//PA2
#define ADC_GPIO_PIN2                GPIO_Pin_2
#define ADC_CHANNEL2                ADC_Channel_2
//PA3
#define ADC_GPIO_PIN3                GPIO_Pin_3
#define ADC_CHANNEL3                ADC_Channel_3
//PA4
#define ADC_GPIO_PIN4                GPIO_Pin_4
#define ADC_CHANNEL4                ADC_Channel_4
//PA5
#define ADC_GPIO_PIN5                GPIO_Pin_5
#define ADC_CHANNEL5                ADC_Channel_5
//PA6
#define ADC_GPIO_PIN6                GPIO_Pin_6
#define ADC_CHANNEL6                ADC_Channel_6
//PA7
#define ADC_GPIO_PIN7                GPIO_Pin_7
#define ADC_CHANNEL7                ADC_Channel_7
//PB0
#define ADC_GPIO_PIN8                GPIO_Pin_0
#define ADC_CHANNEL8                ADC_Channel_8
//PB1
#define ADC_GPIO_PIN9                GPIO_Pin_1
#define ADC_CHANNEL9                ADC_Channel_9

void AdcInit(void);

#endif

备注:PA0作为第一个采集的通道,目前遇到的情况是顺序采集到的PA0是缓冲区最后一个数据,所以暂时不使用PA0作为ADC采集io,可以使用其他通道进行采集

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档