【STM32F103RCT学习】库函数双通道ADC实现
程序员文章站
2022-04-01 22:03:59
...
一、连续扫描、连续转换模式下对规则组的理解
规则组最多包含16个转换通道,也就是说ADC_NbrOfChannel可以设置上限为16
在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了ADC_CR2寄存器CONT位为1(从实践结果来看,调用库函数的时候该位会置1),转换不会在选择组的后一个通道上停止,而是再次从选择组的第一个通道继续转换。 如
二、函数实现
#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的电压