欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【STM32F103RCT学习】库函数双通道ADC实现

程序员文章站 2022-04-01 22:03:59
...

一、连续扫描、连续转换模式下对规则组的理解

规则组最多包含16个转换通道,也就是说ADC_NbrOfChannel可以设置上限为16

在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了ADC_CR2寄存器CONT位为1(从实践结果来看,调用库函数的时候该位会置1),转换不会在选择组的后一个通道上停止,而是再次从选择组的第一个通道继续转换。 如    

【STM32F103RCT学习】库函数双通道ADC实现

二、函数实现

#include"stm32f10x.h"
#include"mq135.h"
#include"delay.h"

u16 channel1;
u16 channel2;
u8  flag=0;

void mq135adc_init(void)
{
  ADC_InitTypeDef ADC_1;
	GPIO_InitTypeDef PA1;    //ADC1通道1
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);   //使能GPIOA、ADC1时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                          //设置ADC时钟分频因子为6,72/6=12MHz ADC时钟频率
	
	PA1.GPIO_Pin=GPIO_Pin_1;
	PA1.GPIO_Mode=GPIO_Mode_AIN;
	PA1.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&PA1);
	
	PA1.GPIO_Pin=GPIO_Pin_2;
	PA1.GPIO_Mode=GPIO_Mode_AIN;
	PA1.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&PA1);
	
	ADC_1.ADC_ScanConvMode=ENABLE;                                             //两个通道PA1,PA2,开启连续扫描模式
	ADC_1.ADC_ContinuousConvMode=ENABLE;                                       //连续转换,一个规则组,两个规则通道PA1,PA2,两个转换完了,又从同一组的第一个通道开始转
	ADC_1.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;                      //启动规则通道转换的事件(启动ADC转换的外围事件),这里SWSTART软件触发
	ADC_1.ADC_DataAlign=ADC_DataAlign_Right;                                   //ADC转换出来的数据(12位)存于ADC_DR(16位)右侧
	ADC_1.ADC_NbrOfChannel=2;                                                  //比如,设置规则通道(规则通道由1~16个小通道组成)中有多少个通道,也就是设置规则通道长度
	ADC_Init(ADC1,&ADC_1);                                                     
	ADC_Cmd(ADC1,ENABLE);                                                      //开启ADC1
	
	ADC_ResetCalibration(ADC1);                                                //执行复位校准
	while(ADC_GetResetCalibrationStatus(ADC1));                                //等待复位校准结束
	ADC_StartCalibration(ADC1);                                                //执行ADC校准
	while(ADC_GetCalibrationStatus(ADC1));                                     //等待ADC校准完毕
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);  //规则组,通道1为1级,优先转换
	ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_239Cycles5);  //规则组,通道2为2级,次先转换
}


void Get_Adc(void)                                                           //设置两个等待是为了验证连续扫描,扫完了通道1,接着扫通道2
{
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);                                     //软件触发ADC转换
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));                              //规则组,等待通道1转换完成
		channel1=ADC_GetConversionValue(ADC1);   

	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));                              //规则组,等待通道2转换完成
		channel2=ADC_GetConversionValue(ADC1); 

}









三、main函数

#include "stm32f10x.h"
#include "mq135.h"
#include "delay.h"
#include "lcd.h"

void mq135adc_init(void);

extern u16 channel1;
extern u16 channel2;

u16 Get_Adc_Average(u8 times);
void Get_Adc(void);

 int main(void)
 {	
	u16 temp_adc_value;
	delay_init();
	LCD_Init();
  mq135adc_init();
	POINT_COLOR=BLACK;
	LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:"); 
 	LCD_ShowString(60,150,200,16,16,"ADC_CH2_VAL:"); 
	while(1)
	{
	     Get_Adc();
		   LCD_ShowxNum(156,130,channel1,4,16,0);//显示 ADC 的值 
		   LCD_ShowxNum(156,150,channel2,4,16,0);//显示 ADC 的值 
		   delay_ms(1000);
	}
 }

四、头文件

#include"stm32f10x.h"
void mq135adc_init(void);
extern u8 i;
void Get_Adc(void);
u16 Get_Adc_Average(u8 times);

 五、实物展示

ADC_CH1_VAL(通道1)采集板子3.3V电压

ADC_CH2_VAL(通道2)采集气体传感器MQ135的电压

【STM32F103RCT学习】库函数双通道ADC实现

【STM32F103RCT学习】库函数双通道ADC实现

相关标签: STM32 ADC