stm32多通道adc转换(非DMA)

摘自 http://bbs.elecfans.com/jishu_1378329_1_1.html

首先我们就用库函数来写一下相应的代码吧。
第一步:配置相应I/O口(我使用的是PA1和PB1,通道1和通道8,使用规则通道)。
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,RCC_APB2Periph_AFIO,ENABLE); //打开相应时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */

第二步:配置adc参数。
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大14M 设置ADC时钟(ADCCLK)
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1 和 ADC2 工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //多通道模式
ADC_InitStructure.ADC_Con[color=rgb(68, 68, 68) !important]tinuousConvMode = DISABLE; //工作在单次模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; 转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //adc的数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; //两个adc通道
ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_Sampletime_239Cycles5); //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,2,ADC_SampleTime_239Cycles5);

ADC_DiscModeChannelCountConfig(ADC1, 1); //对 ADC 规则组通道配置间断模式
ADC_DiscModeCmd(ADC1, ENABLE); //使能指定的 ADC 规则组通道的间断模式

ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能

到这里2个adc通道是配置好了。

第三步:进行数据采集和软件滤波(取多个数据进行平均值计算,使数据更准确)。
while(1)
{
adc1 = 0;
adc2 = 0;
for(i=0;i<50;i++);
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成
adc1 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成
adc2 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果
}
adc1 /= 50;
adc2 /= 50;
printf(“ADC1 = %.3f V \t ADC2 = %.3f V \r\n”,adc13.3/4096,adc23.3/4096);
delay_ms(1000);
}
好了,到这里双通道的ADC转换程序就没了。

是不是很简单,但当时却找了好久,这是多通道的规则组的ADC转换,可以多添加几组ADC通道,相应配置是一样的,重点是相应ADC转换要处于间断的模式,

ADC_DiscModeChannelCountConfig(ADC1, 1); //对 ADC 规则组通道配置间断模式ADC_DiscModeCmd(ADC1, ENABLE); //使能指定的 ADC 规则组通道的间断模式

这两个库函数就是配置ADC为间断的模式,
配置为间断模式之后,每一次软件转换启动后,读取的就是相应转换的通道数据。

ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能或者失能指定的ADC的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成
adc1 += ADC_GetConversionValue(ADC1); //返回最近一次 ADCx 规则组的转换结果

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值