【STM32F103RCT學習】庫函式雙通道ADC實現
阿新 • • 發佈:2018-12-10
一、連續掃描、連續轉換模式下對規則組的理解
規則組最多包含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的電壓