MQ-2 氣體傳感器所使用的氣敏材料是在清潔空氣中電導(dǎo)率較低的二氧化錫(SnO2) 。當(dāng)傳感器所處環(huán)境中存在可燃?xì)怏w時(shí),傳感器的電導(dǎo)率隨空氣中可燃?xì)怏w濃度的增加而增大。 使用簡(jiǎn)單的電路即可將電導(dǎo)率的變化轉(zhuǎn)換為與該氣體濃度相對(duì)應(yīng)的輸出信號(hào)。將模擬量轉(zhuǎn)換為數(shù)字量的技術(shù)我們稱(chēng)之為ADC。
本示例采用開(kāi)發(fā)板硬件ADC功能進(jìn)行煙霧數(shù)據(jù)采集,STM32F103 擁有 1~3 個(gè) ADC(STM32F101/102 系列只有 1 個(gè) ADC),這些 ADC 可以獨(dú)立使用,也可以使用雙重模式(提高采樣率)。 STM32 的 ADC 是 12 位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器。它有 18 個(gè)通道,可測(cè)量 16 個(gè)外部和 2 個(gè)內(nèi)部信號(hào)源。各通道的 A/D 轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。 ADC 的結(jié)果可以左對(duì)齊或右對(duì)齊方式存儲(chǔ)在 16 位數(shù)據(jù)寄存器中。
1.硬件設(shè)計(jì)
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/pYYBAGKViUeAX4mLAABmYbxRpes952.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
采用PA0(ADC1_CH0)接口完成煙霧濃度采集。
軟件設(shè)計(jì)
ADC工作頻率配置
??根據(jù)STM32中文參考手冊(cè)ADC章節(jié)(第155頁(yè)),ADC的工作時(shí)鐘不能超過(guò)14MHZ。
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/poYBAGKViUiAN1jmAAG1y7Yvcoo423.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
ADC模式
??STM32F103開(kāi)發(fā)板有兩種轉(zhuǎn)換方式:規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換。規(guī)則轉(zhuǎn)換有可同時(shí)轉(zhuǎn)換16路通道,但只有一個(gè)數(shù)據(jù)寄存器,所以想完成16路通道同時(shí)轉(zhuǎn)換就需要DMA配合使用;注入通道有4個(gè)數(shù)據(jù)寄存器,可同時(shí)轉(zhuǎn)換4路通道。
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/pYYBAGKViUiAePyKAAG0iJvn5bw307.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
ADC模式配置
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/AF/poYBAGKViUiAZYxLAABM2j8fZoM196.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/pYYBAGKViUmAAbR7AADPKTemE3g087.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
代碼生成
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/pYYBAGKViUmAcZJxAALa7oS62xY655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
PA0引腳配置和ADC校準(zhǔn)
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/AF/poYBAGKViUqAMZzTAAIDaJb-hdg008.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
完成一次規(guī)則通道轉(zhuǎn)換
u16 Get_Regular_Channelx(u16 ch)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel=ch;//通道號(hào)
sConfig.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;//采樣周期
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)//ADC通道初始化
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);//開(kāi)啟ADC
HAL_ADC_PollForConversion(&hadc1,20);//等待規(guī)則通道轉(zhuǎn)換完成
return HAL_ADC_GetValue(&hadc1);
}
500ms采集一次數(shù)據(jù)
Delay_Ms(1);
time++;
if(time>=500)
{
time=0;
temp_ad =Get_Regular_Channelx(0);
printf("AD:%d\r\n",temp_ad);
}
ADC常用函數(shù)介紹
/**********************在stm32f1xx_hal_adc.c中*********************************************/
HAL_ADC_Start(ADC_HandleTypeDef* hadc); //開(kāi)啟ADC
HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc); //中斷方式開(kāi)啟ADC
HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length); //DMA方式開(kāi)啟
//等待轉(zhuǎn)換完成
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);//獲取數(shù)據(jù)
//ADC通道配置
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc,ADC_ChannelConfTypeDef* sConfig);
uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc);//獲取狀態(tài)
/***************************************在stm32f1xx_hal_adc_ex.h中*****************************/
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc);//ADC校準(zhǔn)
HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc);//使能ADC,開(kāi)始注入轉(zhuǎn)換
-
adc
+關(guān)注
關(guān)注
99文章
6537瀏覽量
545882 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5133瀏覽量
98330 -
STM32F103
+關(guān)注
關(guān)注
33文章
479瀏覽量
63910
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論