国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32--ADC數(shù)值采樣/附ADC采集熱敏傳感器使用

這篇具有很好參考價值的文章主要介紹了STM32--ADC數(shù)值采樣/附ADC采集熱敏傳感器使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一丶ADC介紹

二丶ADC工作原理及管腳分布

三丶代碼部分詳解

(一)庫函數(shù)介紹

(二)代碼部分整合


一丶ADC介紹

????????ADC模塊中文名為模擬/數(shù)字轉(zhuǎn)換器,是12位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器,一般用于數(shù)值的采樣??可以將引腳上連續(xù)變化的模擬電壓轉(zhuǎn)換為內(nèi)存中存儲的數(shù)字變量,建立模擬電路到數(shù)字電路的橋梁。學(xué)習(xí)過stm32后我們知道,stm32是數(shù)字電路,。數(shù)字電路沒有多少伏,多少度的概念,而通常的傳感器模塊,輸出的都是模擬量。

比如我要使用熱敏傳感器測量溫度,那么需要將傳感器模塊的模擬量,轉(zhuǎn)換成STM32可以“看懂的數(shù)字量”,所以想要讀取溫度的數(shù)值,就需要用到ADC模數(shù)轉(zhuǎn)換器來實現(xiàn)了,實現(xiàn)過程簡單來說就是ADC讀取引腳上的電壓,通過轉(zhuǎn)換,儲存到DR寄存器里。(本次使用的是STM32C8T6)

二丶ADC工作原理及管腳分布

AD轉(zhuǎn)換原理如圖

????????

stm32采樣電路,stm32,單片機,嵌入式硬件,嵌入式實時數(shù)據(jù)庫,c#

?(1)ADC的輸入通道,包括IN0-IN15,共16GPIO口,和兩個內(nèi)部通道,內(nèi)部溫度傳感器,內(nèi)部參考電壓

(2)共18個輸入通道,將數(shù)據(jù)傳輸?shù)綌?shù)模轉(zhuǎn)換器,模擬多路開關(guān)可選擇我們想要的通道

(3)數(shù)模轉(zhuǎn)換器使用逐次逼近法將模擬量轉(zhuǎn)換為數(shù)字量?

(4)轉(zhuǎn)換后分為兩個組:規(guī)則組和注入組,存放準(zhǔn)換結(jié)果。

????????規(guī)則組:可以傳輸16位數(shù)據(jù),但規(guī)則組寄存器只有一位,所以如果轉(zhuǎn)運不及時會出現(xiàn)數(shù)據(jù)覆蓋的問題,前面的數(shù)據(jù)還沒有讀,后面的數(shù)據(jù)就上來了,這時候就需要用到DMA,DMA可以將ADC寄存器的數(shù)據(jù)暫時挪到DMA寄存器中,需要的時候就會被取出(本次代碼不涉及DMA,如需了解可看下篇文章)本次代碼使用的是規(guī)則組

? ? ?注入組:注入組一次可以傳輸4位數(shù)據(jù),則不需要考慮數(shù)據(jù)覆蓋的問題

(5)我們知道,ADC可以由軟件觸發(fā),也可以由硬件觸發(fā),軟件觸發(fā)顧名思義,在程序中手動調(diào)動代碼即可實現(xiàn)。而硬件觸發(fā),就是框圖內(nèi)所包含的觸發(fā)源??可系氖且?guī)則組,靠下的是注入組

(6)EOC是規(guī)則組準(zhǔn)換完成信號,JEOC是注入組轉(zhuǎn)換完成信號


總結(jié)如圖

stm32采樣電路,stm32,單片機,嵌入式硬件,嵌入式實時數(shù)據(jù)庫,c#

三丶代碼部分詳解

(一)庫函數(shù)介紹

? ? ? ? 鑒于ADC庫中函數(shù)繁多,本次只介紹現(xiàn)象代碼會使用到的部分和少量拓展


1丶復(fù)位函數(shù)ADC_DeInit

void ADC_DeInit(ADC_TypeDef* ADCx);

該函數(shù)作用為將外設(shè)ADCx的全部寄存器重設(shè)為缺省值,說的簡單點就是復(fù)位,恢復(fù)“出廠設(shè)置

2丶初始化函數(shù)ADC_Init

工作模式:本次采用單ADC模式

數(shù)據(jù)對其方式:ADC轉(zhuǎn)換是12位,故存儲在寄存器中是12位的數(shù)據(jù),但數(shù)據(jù)寄存器是16位的,存儲時空位補零,所以就出現(xiàn)了數(shù)據(jù)對其問題。一半來說,我們都是采用右對齊的模式。那么左對齊有什么用呢,加入你只想讀一個大概的數(shù)據(jù),不想要這么高的分辨率,就可以使用左對齊,取前八位,就舍棄了后面的數(shù)據(jù),減小了分辨率。

ADC觸發(fā)方式:選擇內(nèi)部軟件觸發(fā)

轉(zhuǎn)換模式:單次轉(zhuǎn)換模式為轉(zhuǎn)換一次給到寄存器數(shù)據(jù)后停止。連續(xù)轉(zhuǎn)換模式轉(zhuǎn)換一次后開始下一輪轉(zhuǎn)換,一直持續(xù)下去,不需要手動開始下一次轉(zhuǎn)換

掃描模式:多通道進(jìn)行

通道數(shù)選擇:只選用一個通道

    ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //獨立工作模式,即單ADC模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對齊
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //內(nèi)部軟件觸發(fā)
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   //單次轉(zhuǎn)換模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;         //非掃描模式
	ADC_InitStructure.ADC_NbrOfChannel = 1;               //只使用一個通道
	ADC_Init(ADC1, &ADC_InitStructure);                   

3丶 ADC_Cmd使能ADC

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

4丶 ADC_DMACmd是否使用DMA

void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);

5丶ADC_ITConfig是否使用中斷

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

6丶根據(jù)手冊規(guī)定,需要進(jìn)行ADC校準(zhǔn)

void ADC_ResetCalibration(ADC_TypeDef* ADCx);    //復(fù)位校準(zhǔn)
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);     //復(fù)位校準(zhǔn)狀態(tài)
void ADC_StartCalibration(ADC_TypeDef* ADCx);      //開始校準(zhǔn)
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);     //校準(zhǔn)狀態(tài)

7丶ADC_SoftwareStartConvCmd軟件觸發(fā)ADC

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

8丶時鐘分頻

手冊規(guī)定ADC最大14mhz,所以選擇6分頻或8分頻

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

結(jié)合上文總結(jié)一下ADC初始化流程

(1)開啟APB2時鐘和ADC時鐘

(2)ADC時鐘分頻,選擇六分頻或八分頻

(3)初始化GPIO? 注:這里GPIO模式要使用GPIO_Mode_AIN,ADC專用模式

(4)ADC及ADC通道選擇

(5)初始化ADC

(6)使能ADC,給ADC上電

(7)校準(zhǔn)ADC

(二)丶代碼部分整合

ADC部分

#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);
		
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1)==SET);
		


	
}

uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	
	return ADC_GetConversionValue(ADC1);

}

主函數(shù)部分

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "ADC.h"
#include "LED.h"

uint16_t Temp;
#define T25 298.15    
#define B   3380
float  Vlue;

double myLn(double a)
{
	int  N = 15;
	int k=0,nk=0;
	double x=0.0,xx=0.0,y=0.0;
	x=(a-1)/(a+1);
	xx = x*x;
	nk = 2*N+1;
	y = 1.0/nk;
	
	for(k = N;k>0;k--)
	{
		nk = nk -2;
		y = 1.0/nk+xx*y;
	}
	return 2.0*x*y;
}

float Get_Temperaturn(void )
{
	float r_f = 0.0,temp_f = 0.0;
	
	Temp = AD_GetValue();
	Vlue = (float)Temp/4095*3.3;
	
	r_f = (Vlue*10000)/(3.3-Vlue); 
	temp_f = 1/((myLn(r_f/10000))/B + 1/T25 ) - 273.15; 	
	return temp_f;
}

int main(void)
{
	OLED_Init();
	AD_Init();
	OLED_ShowString(1, 1, "Temperature:");
	LED1_ON();
	while (1)
	{
		Temp = AD_GetValue();
		
		OLED_ShowNum(2, 3, Get_Temperaturn(), 2);
		OLED_ShowString(2,6,"C");

		
		Delay_ms(100);
		
		if(Get_Temperaturn()>28)
		{
			OLED_ShowString(3,1,"warn");
		
		}
			if(Get_Temperaturn()<28)
		{
		
			OLED_ShowString(3,1,"safe");
		}
	}
}

關(guān)于溫度的轉(zhuǎn)換

Rt = R 乘 EXP(B 乘 (1/T1-1/T2))
對上面的公式解釋如下:

Rt 是熱敏電阻在T1溫度下的阻值;
R是熱敏電阻在T2常溫下的標(biāo)稱阻值;
B值是熱敏電阻的重要參數(shù);
EXP是e的n次方;
這里T1和T2指的是K度即開爾文溫度,K度=273.15(絕對溫度)+攝氏度;

根據(jù)串聯(lián)分壓,知道總電壓VCC 3.3v,熱敏電阻的電壓V2是adc采集后經(jīng)過轉(zhuǎn)換得到的,也是已知,
所以R1的電壓就是VCC - V2 ,然后根據(jù)R1電阻10K,可以求得電路的電流 I ,所以熱敏電阻的
電阻 就可以用電流電壓比值,于是得到Rt。
參數(shù)R 和 B值都是熱敏電阻的參數(shù),根據(jù)自己買的器件決定,我的就是10k,3380??梢詥栙u家,
也可以自己網(wǎng)上查型號。
這里還要注意,T2的單位是開爾文,所以室溫25攝氏度的開爾文是273.15+25=298.15.
就只剩下T1是未知數(shù),一元一次方程,帶進(jìn)去一算就歐克。

AD視頻文章來源地址http://www.zghlxwxcb.cn/news/detail-774695.html

到了這里,關(guān)于STM32--ADC數(shù)值采樣/附ADC采集熱敏傳感器使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32—ADC詳解入門(ADC讀取煙霧傳感器的值)

    STM32—ADC詳解入門(ADC讀取煙霧傳感器的值)

    目錄 一、ADC是什么 二、ADC的性能指標(biāo) 三、ADC特性 四、ADC通道 五、ADC轉(zhuǎn)換順序 六、ADC觸發(fā)方式 七、ADC轉(zhuǎn)化時間 八、ADC轉(zhuǎn)化模式 九、實驗(使用ADC讀取煙霧傳感器的值) 1、配置 2、代碼 ????????ADC是Analog-to-DigitalConverter的縮寫。指模/數(shù)轉(zhuǎn)換器或者模擬/數(shù)字轉(zhuǎn)換器。是指

    2024年02月11日
    瀏覽(33)
  • 超詳細(xì)?。TM32-ADC模數(shù)轉(zhuǎn)換器-驅(qū)動內(nèi)部溫度傳感器

    超詳細(xì)?。TM32-ADC模數(shù)轉(zhuǎn)換器-驅(qū)動內(nèi)部溫度傳感器

    ??在STM32微控制器系列中,ADC(Analog-to-Digital Converter)是一個重要的外設(shè)模塊,它允許微控制器將模擬信號轉(zhuǎn)換成數(shù)字信號以進(jìn)行處理。模擬信號–數(shù)字信號。 ?? MCU只能處理數(shù)字量(10011001),如果需要MCU區(qū)分模擬輸入信號時,MCU直接做不了,需要將模擬信號通過模數(shù)轉(zhuǎn)換

    2024年02月19日
    瀏覽(27)
  • STM32——ADC讀取光敏傳感器控制LED燈,看門狗中斷

    STM32——ADC讀取光敏傳感器控制LED燈,看門狗中斷

    一、編寫讀取AD值的函數(shù),之后判斷AD值,進(jìn)行相應(yīng)操作,比如點燈。 二、用ADC讀取光敏傳感器AO口輸出,并配置ADC通道看門狗監(jiān)控這條通道,當(dāng)光線太暗時打開LED燈。 之后會再介紹可編程RGB燈帶WS2812B。 光敏傳感器有兩個輸出口,一個是DO(Digital Output),一個是AO(Analog O

    2023年04月18日
    瀏覽(26)
  • STM32_ADC————ADC+DMA多路數(shù)據(jù)傳輸,看門狗中斷,傳感器控制LED

    STM32_ADC————ADC+DMA多路數(shù)據(jù)傳輸,看門狗中斷,傳感器控制LED

    一:介紹ADC與DMA的基本情況與初始化 二:利用ADC+DMA+看門狗中斷+傳感器控制LED燈代碼 三:總結(jié)實驗過程中碰到的錯誤與問題 通過DMA轉(zhuǎn)運ADC的數(shù)據(jù),設(shè)置ADC的中斷看門狗閾值,當(dāng)光敏傳感器的ADC采樣值在看門狗高低閾值中間,不觸發(fā)中斷,如果超過看門狗的高低閾值就會觸發(fā)

    2024年02月04日
    瀏覽(28)
  • STM32+DHT11采集溫濕度傳感器數(shù)據(jù)

    STM32+DHT11采集溫濕度傳感器數(shù)據(jù)

    ????????DHT11 是一款濕溫度一體化的數(shù)字傳感器。該傳感器包括一個電阻式測濕元件和一個 NTC 測溫元件,并與一個高性能 8 位單片機相連接。通過單片機等微處理器簡單的電路連接就能夠 實時的采集本地濕度和溫度。 DHT11 與單片機之間能采用簡單的單總線進(jìn)行通信,僅

    2024年02月07日
    瀏覽(39)
  • 通過STM32內(nèi)部ADC將煙霧傳感器發(fā)送的信號值顯示在OLED上

    通過STM32內(nèi)部ADC將煙霧傳感器發(fā)送的信號值顯示在OLED上

    一.CubeMX配置 首先我們在CubeMX配置ADC1, 設(shè)置一個定時器TIM2定時1s采樣一次以及刷新一次OLED, 打開IIC用于驅(qū)動OLED顯示屏。 二.程序 在Keil5中添加好oled的顯示庫,以及用來顯示的函數(shù)、初始化函數(shù)、清屏函數(shù)等。在主程序中初始化oled,并將其清屏。 在定時器中斷回調(diào)函數(shù)中對A

    2024年02月15日
    瀏覽(32)
  • Stm32_標(biāo)準(zhǔn)庫_8_ADC_光敏傳感器_測量具體光照強度

    Stm32_標(biāo)準(zhǔn)庫_8_ADC_光敏傳感器_測量具體光照強度

    ADC簡介 測量方式 采用二分法比較數(shù)據(jù) IO通道 ADC基本結(jié)構(gòu)及配置路線 獲取數(shù)字變量需要用到用到光敏電阻的AO口,AO端口接在PA0引腳即可 測得的模擬數(shù)據(jù)與實際光照強度之間的關(guān)系為 代碼: 完整樸素代碼: 效果: 此代碼的不足之處在于每次寫入數(shù)字都會提前占據(jù)固定位置,

    2024年02月04日
    瀏覽(25)
  • 基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)

    基于STM32 RS485傳感器數(shù)據(jù)采集(參考正點原子部分代碼)

    目前工業(yè)上,傳感器一般都選RS485,modbus通訊協(xié)議,這種通訊方式,有很強的魯棒性,本篇文章基于原子哥的精英板進(jìn)行開發(fā)。 1、初始化與電腦通信的串口(PA9 PA10) 2、采用串口中斷將數(shù)據(jù)保存到數(shù)組buff中 3、用定時器來配置一幀字節(jié)是否結(jié)束(空閑時間指定時間) 5、從機

    2024年02月11日
    瀏覽(24)
  • STM32采集問答式串口傳感器數(shù)據(jù)寫入SD卡(spi模式)

    STM32采集問答式串口傳感器數(shù)據(jù)寫入SD卡(spi模式)

    STM32f103RCT6板子 問答式溫濕度傳感器(TTL信號) 外接SD卡模塊(淘寶都差不多) 1. SD卡模塊 ,采用SPI1接線 (CLK)SCK —PA5 (DATA0)MISO —PA6 (CMD)MOSI —PA7 (DATA3)CS —PA4 前面小括號里的是SDIO模式的接線,可以忽略。 2. 傳感器模塊 問答式TTL信號的傳感器都可以, 連接到板子的串口2,

    2024年02月05日
    瀏覽(41)
  • STM32實現(xiàn)薄膜壓力傳感器數(shù)據(jù)采集(標(biāo)準(zhǔn)庫和HAL庫實現(xiàn))

    STM32實現(xiàn)薄膜壓力傳感器數(shù)據(jù)采集(標(biāo)準(zhǔn)庫和HAL庫實現(xiàn))

    單片機型號及壓力傳感器: STM32F103C8T6 最小系統(tǒng)板 壓力傳感器選用的是薄膜壓力傳感器 生活中經(jīng)常遇到需要測量壓力值,因此,考慮到這樣的需求從網(wǎng)上買了一個薄膜壓力傳感器,實物圖如下: 柔性薄膜壓力傳感器的 產(chǎn)品特點 : 超薄,厚度小于0.3mm 響應(yīng)速度快 壽命長,通

    2024年02月02日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包