91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

STM32雙ADC采集基本知識介紹

冬至子 ? 來源:小李的創(chuàng)客實驗室 ? 作者:初出茅廬的小李 ? 2023-07-08 15:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ADC基本介紹

ADC 的機制就是使用兩個 ADC 同時采樣一個或者多個通道。雙重ADC 模式較獨立模式一個最大的優(yōu)勢就是提高了采樣率,彌補了單個 ADC 采樣不夠快的缺點。

雙ADC工作框圖

圖片

雙ADC模式

在雙ADC模式里,根據(jù)ADC1_CR1寄存器DUALMOD[2:0]位所選的模式,轉換的啟動可以是ADC1主和ADC2從的交替觸發(fā)或同步觸發(fā)。

注意:在雙ADC模式里,當轉換配置成由外部事件觸發(fā)時,用戶必須將其設置成僅觸發(fā)主ADC,從ADC設置成軟件觸發(fā),這樣可以防止意外的觸發(fā)從轉換。但是,主和從ADC的外部觸發(fā)必須同時被激活。

注意:在雙ADC模式里,為了在主數(shù)據(jù)寄存器上讀取從轉換數(shù)據(jù),必須使能DMA位,即使不使用DMA傳輸規(guī)則通道數(shù)據(jù)。

圖片

圖片

1.jpg

同步規(guī)則模式

此模式在規(guī)則通道組上執(zhí)行。外部觸發(fā)來自ADC1的規(guī)則組多路開關(由ADC1_CR2寄存器的EXTSEL[2:0]選擇), 它同時給ADC2提供同步觸發(fā)。

注意: 不要在2個ADC上轉換相同的通道 ((兩個ADC在同一個通道上的采樣時間不能重疊)。

在ADC1或ADC2的轉換結束時:

● 產(chǎn)生一個32位DMA傳輸請求(如果設置了DMA位), 32位的ADC1_DR寄存器內(nèi)容傳輸?shù)絊RAM中,它上半個字包含ADC2的轉換數(shù)據(jù),低半個字包含ADC1的轉換數(shù)據(jù)。

● 當所有ADC1/ADC2規(guī)則通道都被轉換完時,產(chǎn)生EOC中斷(若任一ADC接口開放了中斷)。

注:在同步規(guī)則模式中,必須轉換具有相同時間長度的序列,或保證觸發(fā)的間隔比2個序列中較長的序列長,否則當較長序列的轉換還未完成時,具有較短序列的ADC轉換可能會被重啟。

圖片

圖片

圖片

掃描模式

此模式用來掃描一組模擬通道。 掃描模式可通過設置ADC_CR1寄存器的SCAN位來選擇。一旦這個位被設置, ADC掃描所有被ADC_SQRX寄存器(對規(guī)則通道)或ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執(zhí)行單次轉換。在每個轉換結束時,同一組的下一個通道被自動轉換。如果設置了CONT位,轉換不會在選擇組的最后一個通道上停止,而是再次從選擇組的第一個通道繼續(xù)轉換。

如果設置了DMA位,在每次EOC后, DMA控制器把規(guī)則組通道的轉換數(shù)據(jù)傳輸?shù)絊RAM中。而 注入通道轉換的數(shù)據(jù)總是存儲在ADC_JDRx寄存器中。

圖片

圖片

連續(xù)轉換模式

圖片

*單次轉換

*圖片

外部觸發(fā)轉換

轉換可以由外部事件觸發(fā)(例如定時器捕獲,EXTI線)。如果設置了EXTTRIG控制位,則外部事件就能夠觸發(fā)轉換。EXTSEL[2:0]和JEXTSEL2:0]控制位允許應用程序選擇8個可能的事件中的某一個,可以觸發(fā)規(guī)則和注入組的采樣。

注意:當外部觸發(fā)信號被選為ADC規(guī)則或注入轉換時,只有它的上升沿可以啟動轉換

圖片

數(shù)據(jù)對齊

ADC_CR2寄存器中的ALIGN位選擇轉換后數(shù)據(jù)儲存的對齊方式。數(shù)據(jù)可以左對齊或右對齊,如圖29和圖30所示。注入組通道轉換的數(shù)據(jù)值已經(jīng)減去了在ADC_JOFRx寄存器中定義的偏移量,因此結果可以是一個負值。SEXT位是擴展的符號值。對于規(guī)則組通道,不需減去偏移值,因此只有12個位有效。

圖片

通道選擇

有16個多路通道。可以把轉換組織成兩組: 規(guī)則組和注入組 。在任意多個通道上以任意順序進行的一系列轉換構成成組轉換。例如,可以如下順序完成轉換:通道3、通道8、通道2、通道 2、通道0、通道2、通道2、通道15。

● 規(guī)則組由多達16個轉換組成。規(guī)則通道和它們的轉換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉換的總數(shù)應寫入ADC_SQR1寄存器的L[3:0]位中。

● 注入組由多達4個轉換組成。注入通道和它們的轉換順序在ADC_JSQR寄存器中選擇。注入組里的轉換總數(shù)目應寫入ADC_JSQR寄存器的L[1:0]位中。

如果ADC_SQRx或ADC_JSQR寄存器在轉換期間被更改,當前的轉換被清除,一個新的啟動脈沖將發(fā)送到ADC以轉換新選擇的組。

ADC時鐘

ADC預分頻器的ADCCLK是ADC模塊的時鐘來源。通常,由時鐘控制器提供的ADCCLK時鐘和PCLK2(APB2時鐘)同步。RCC控制器為ADC時鐘提供一個專用的可編程預分頻器。

圖片

一般情況下:不要讓ADC時鐘超過14MHz,否則可能不準。

也就是說,如果按照默認設置PCLK2為72MHz,此時應為6分頻或者8分頻。

可編程的通道采樣時間

ADC使用若干個ADC_CLK周期對輸入電壓采樣,采樣周期數(shù)目可以通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每個通道可以分別用不同的時間采樣。

總轉換時間如下計算:

TCONV = 采樣時間+ 12.5個周期

例如:當ADCCLK=14MHz,采樣時間為1.5周期,TCONV = 1.5 + 12.5 = 14周期 = 1μs

校準

ADC有一個內(nèi)置自校準模式。校準可大幅減小因內(nèi)部電容器組的變化而造成的準精度誤差。在校準期間,在每個電容器上都會計算出一個誤差修正碼(數(shù)字值),這個碼用于消除在隨后的轉換中每個電容器上產(chǎn)生的誤差。

通過設置 ADC_CR2 寄存器的CAL位啟動校準。一旦校準結束, CAL位被硬件復位,可以開始正常轉換。建議在上電時執(zhí)行一次ADC校準。校準階段結束后,校準碼儲存在ADC_DR中。

注意:1 建議在每次上電后執(zhí)行一次校準。2 啟動校準前, ADC必須處于關電狀態(tài)(ADON=’0’)超過至少兩個ADC時鐘周期

圖片

ADC中斷

規(guī)則和注入組轉換結束時能產(chǎn)生中斷,當模擬看門狗狀態(tài)位被設置時也能產(chǎn)生中斷。它們都有獨立的中斷使能位。

注:ADC1和ADC2的中斷映射在同一個中斷向量上,而ADC3的中斷有自己的中斷向量。

圖片

ADC_SR寄存器中有2個其他標志,但是它們沒有相關聯(lián)的中斷:

● JSTRT(注入組通道轉換的啟動)

● STRT(規(guī)則組通道轉換的啟動)

圖片

ADC寄存器

ADC狀態(tài)寄存器(ADC_SR)

圖片

ADC控制寄存器(ADC_CR1)

圖片

圖片

ADC控制寄存器(ADC_CR2)

圖片

圖片

圖片

圖片

ADC采樣時間寄存器(ADC_SMPRx)

圖片

ADC規(guī)則序列寄存器(ADC_SQRx)

圖片

ADC規(guī)則數(shù)據(jù)寄存器(ADC_DR)

圖片

ADC庫函數(shù)配置

volatileuint32_t ADC_ConvertedValue[5] = {0};

void ADC_Config(void)
{ 	
	DMA_InitTypeDef DMA_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//開DMA時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);//開ADC1,ADC2時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB, ENABLE);
	
	//GPIO口配置-----------------------------------------------------------------------------											
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	

	//DMA1配置-----------------------------------------------------------------------------
	DMA_DeInit(DMA1_Channel1);//復位DMA控制器
	DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC1- >DR ) );//外設基址為:ADC數(shù)據(jù)寄存器地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;//存儲器地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//數(shù)據(jù)源來自外設
	DMA_InitStructure.DMA_BufferSize = 5;//緩沖區(qū)大小,應該等于數(shù)據(jù)目的地的大小
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設寄存器只有一個,地址不用遞增
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存儲器地址遞增
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//全字(32位)
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//全字(32位)
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;	//循環(huán)傳輸模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA 傳輸通道優(yōu)先級為高
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止存儲器到存儲器模式,因為是從外設到存儲器
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA
		
	//ADC1配置-----------------------------------------------------------------------------
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//同步規(guī)則
	ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //關閉掃描模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉換模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用外部觸發(fā)轉換,軟件開啟即可
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//轉換通道數(shù)
	ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC
	RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC時鐘,CLK2的8分頻,即9MHz
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);//配置ADC通道的轉換順序和采樣時間
	
	ADC_DMACmd(ADC1, ENABLE);	//使能DMA請求

	//ADC2配置-----------------------------------------------------------------------------
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//同步規(guī)則
	ADC_InitStructure.ADC_ScanConvMode = DISABLE; //關閉掃描模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉換模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用外部觸發(fā)轉換,軟件開啟即可
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//轉換通道數(shù)
	ADC_Init(ADC2, &ADC_InitStructure);//初始化ADC
	RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC時鐘,CLK2的8分頻,即9MHz
	
	ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//配置ADC通道的轉換順序和采樣時間

	//ADC1校準-----------------------------------------------------------------------------
	ADC_Cmd(ADC1, ENABLE);//使能ADC1
	ADC_ResetCalibration(ADC1);//使能復位校準 
	while(ADC_GetResetCalibrationStatus(ADC1));//等待復位校準結束	
	ADC_StartCalibration(ADC1);//開啟AD校準 
	while(ADC_GetCalibrationStatus(ADC1));//等待校準結束 
		
	//ADC2校準-----------------------------------------------------------------------------
	ADC_Cmd(ADC2, ENABLE);//使能ADC2
	ADC_ResetCalibration(ADC2);//使能復位校準 
	while(ADC_GetResetCalibrationStatus(ADC2));//等待復位校準結束	
	ADC_StartCalibration(ADC2);	//開啟AD校準 
	while(ADC_GetCalibrationStatus(ADC2));//等待校準結束 
	
	DMA_Cmd(DMA1_Channel1 , ENABLE);//使能DMA1通道
	ADC_ExternalTrigConvCmd(ADC2, ENABLE);//使能ADC2的外部觸發(fā)轉換
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能軟件觸發(fā)轉換
}

//DMA1中斷服務函數(shù)
__IO uint16_t ADC_ConvertedValueLocal_R = 0;
__IO uint16_t ADC_ConvertedValueLocal_L = 0;
uint16_t ADC_ConvertedValue_R[5] = {0};
uint16_t ADC_ConvertedValue_L[5] = {0};
void DMA1_Channel1_IRQHandler(void)//電流值讀取
{
	if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
	{
		int i = 0, j = 0, k = 0;
		 
		DMA_ClearITPendingBit(DMA1_IT_TC1);
		DMA_Cmd(DMA1_Channel1, DISABLE); 
		ADC_Cmd(ADC1, DISABLE);
		ADC_Cmd(ADC2, DISABLE);
		
		 for(i = 0; i < 5; i++)
		 {
			 //ADC1- >DR低16位,ADC1的數(shù)據(jù)
			 ADC_ConvertedValue_R[k++] = (ADC_ConvertedValue[i] & 0xffff);
			 //ADC1- >DR高16位,ADC2的數(shù)據(jù)
			 ADC_ConvertedValue_L[j++] = (ADC_ConvertedValue[i] & 0xffff0000) > > 16;
		 }
		 QuickSort(ADC_ConvertedValue_R, 0, 4);
		 QuickSort(ADC_ConvertedValue_L, 0, 4);
		 ADC_ConvertedValueLocal_R = ADC_ConvertedValue_R[2];
		 ADC_ConvertedValueLocal_L = ADC_ConvertedValue_L[2];
	 }
	 DMA_SetCurrDataCounter(DMA1_Channel1, 5);
	 DMA_Cmd(DMA1_Channel1, ENABLE);
	 ADC_Cmd(ADC1, ENABLE);
   	 ADC_Cmd(ADC2, ENABLE);
	 ADC_ExternalTrigConvCmd(ADC2, ENABLE);
	 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	}	 	
}

 //快速排序法
void QuickSort(uint16_t* a, int left, int right)
{
	int i = left;
    int j = right;
    int key = a[left];
	
	/*如果左邊索引大于或者等于右邊的索引就代表已經(jīng)整理完成一個組了*/
    if (left >= right) { return; }

	/*控制在當組內(nèi)尋找一遍*/
    while (i < j)
    {
        while (i < j && key <= a[j]) { 
			j--; 
		}
		
        a[i] = a[j];

        while (i < j && key >= a[i]) {
            i++;
        }

        a[j] = a[i];
    }
    a[i] = key;
	
    QuickSort(a, left, i - 1);
    QuickSort(a, i + 1, right);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2293

    文章

    11031

    瀏覽量

    364519
  • 定時器
    +關注

    關注

    23

    文章

    3298

    瀏覽量

    118796
  • RCC
    RCC
    +關注

    關注

    0

    文章

    95

    瀏覽量

    27575
  • 預分頻器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    8299
  • ADC采樣
    +關注

    關注

    0

    文章

    134

    瀏覽量

    13177
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    電磁繼電器基本知識介紹

    本帖最后由 eehome 于 2013-1-5 10:03 編輯 電磁繼電器基本知識介紹
    發(fā)表于 08-16 17:22

    電磁繼電器基本知識介紹

    本帖最后由 eehome 于 2013-1-5 09:55 編輯 電磁繼電器基本知識介紹
    發(fā)表于 08-20 09:39

    學習STM32,在ADC轉換采集這一章,adc采集與單adc采集相同通道速度是一樣的嗎?

    學習STM32,在ADC轉換采集這一章,adc采集與單ad
    發(fā)表于 09-23 09:25

    STM32F103外部中斷基本知識介紹

    外部中斷基本知識介紹EXTI–外部中斷/事件控制器STM32的每個IO都可以作為外部中斷的中斷輸入口。STM32的中斷控制器支持19個外部中斷/事件請求:**線0~15:**對應外部I
    發(fā)表于 08-16 06:41

    STM32CubeMX之RTC鬧鐘喚醒停機模式基本知識介紹

    STM32CubeMX(stm32L151C8T6) 之RTC鬧鐘喚醒停機模式基本知識介紹低功耗模式STM32F10xxx有三種低功耗模式:
    發(fā)表于 08-18 06:01

    STM32的GPIO端口模式基本知識介紹

    STM32基本知識點GPIO端口模式(1)GPIO_Mode_AIN 模擬輸入(2)GPIO_Mode_IN_FLOATING 浮空輸入(3)GPIO_Mode_IPD 下拉輸入(4
    發(fā)表于 02-22 06:39

    MIMO 的基本知識介紹

    MIMO 的基本知識介紹 很好的初學者入門書籍
    發(fā)表于 06-25 14:47 ?25次下載

    鋰離子電池的基本知識介紹

    鋰離子電池的基本知識介紹  鋰離子電池(Li-ion Batteries)是鋰電池發(fā)展
    發(fā)表于 10-24 16:13 ?848次閱讀

    圖像采集基本知識介紹

    圖像采集基本知識介紹 視頻采集     即將視頻轉換成PC機可使用的數(shù)字格式。    微視專業(yè)圖象
    發(fā)表于 01-15 14:55 ?2846次閱讀

    LED基本知識

    介紹LED的基本知識以及LED的分類。
    發(fā)表于 05-30 14:58 ?0次下載

    安全用電基本知識

    安全用電基本知識安全用電基本知識安全用電基本知識
    發(fā)表于 01-14 15:54 ?0次下載

    電纜接續(xù)基本知識_電纜接續(xù)工藝介紹

    下面我將從四個方面介紹電纜接續(xù)的基本知識以及電纜接續(xù)工藝方面相關知識
    發(fā)表于 12-28 10:27 ?1.9w次閱讀

    STM32單片機ADC采集

    STM32單片機ADC采集
    發(fā)表于 11-18 20:36 ?75次下載
    <b class='flag-5'>STM32</b>單片機<b class='flag-5'>ADC</b><b class='flag-5'>采集</b>

    Σ-ADC拓撲背后的基本原理的基本知識

    Σ- ADC是當今信號采集和處理系統(tǒng)設計人員工具包中的主要產(chǎn)品。本文旨在為讀者提供有關Σ-ADC拓撲背后的基本原理的基本知識。本文探討了噪聲、帶寬、建立時間和與
    的頭像 發(fā)表于 01-23 09:12 ?1724次閱讀
    Σ-<b class='flag-5'>ADC</b>拓撲背后的基本原理的<b class='flag-5'>基本知識</b>

    第12章-ADC采集電壓和顯示 基于STM32ADC—電壓采集(詳細講解+HAL庫)

    第12章-ADC采集電壓和顯示 基于STM32ADC—電壓采集(詳細講解+HAL庫)
    的頭像 發(fā)表于 08-21 16:31 ?5271次閱讀
    第12章-<b class='flag-5'>ADC</b><b class='flag-5'>采集</b>電壓和顯示 基于<b class='flag-5'>STM32</b>的<b class='flag-5'>ADC</b>—電壓<b class='flag-5'>采集</b>(詳細講解+HAL庫)
    主站蜘蛛池模板: 色天天综合久久久久综合片 | 69xxx视频hd| 色成网 | 成人夜色 | 国产精品久久久久久久久齐齐 | 特别黄的免费视频大片 | 天天插夜夜爽 | 视频一区在线观看 | 国产精品三级国语在线看 | 日本一区二区三区不卡在线看 | 高清一区二区三区四区五区 | 国产亚洲美女 | 在线片视频网站 | 亚洲成年人在线 | 韩日毛片 | 三级网在线 | 久久久久久久久国产 | 能看毛片的网址 | 九九涩 | 欧美成人精品一区二三区在线观看 | 综合色区 | 欧洲色| 男人在线资源 | 能看的黄色网址 | 成年片色大黄全免费网址 | 免费一级特黄特色大片在线 | 国模私拍在线观看 | 色无五月| 天天激情综合 | 操女人网址 | 在线观看免费视频片 | 欧美另类色 | 视频在线观看一区 | 国产理论 | 久久国产美女免费观看精品 | 久操视频网 | 丁香五月欧美成人 | 人人洗澡人人洗澡人人 | 四虎.com| 手机在线看 | 亚洲理论片在线观看 |