1. 程式人生 > >【STM32F103RCT學習】庫函式雙通道ADC實現

【STM32F103RCT學習】庫函式雙通道ADC實現

一、連續掃描、連續轉換模式下對規則組的理解

規則組最多包含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的電壓