色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

STM32雙ADC采集基本知識介紹

冬至子 ? 來源:小李的創客實驗室 ? 作者:初出茅廬的小李 ? 2023-07-08 15:55 ? 次閱讀

ADC基本介紹

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

雙ADC工作框圖

圖片

雙ADC模式

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

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

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

圖片

圖片

1.jpg

同步規則模式

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

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

在ADC1或ADC2的轉換結束時:

● 產生一個32位DMA傳輸請求(如果設置了DMA位), 32位的ADC1_DR寄存器內容傳輸到SRAM中,它上半個字包含ADC2的轉換數據,低半個字包含ADC1的轉換數據。

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

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

圖片

圖片

圖片

掃描模式

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

如果設置了DMA位,在每次EOC后, DMA控制器把規則組通道的轉換數據傳輸到SRAM中。而 注入通道轉換的數據總是存儲在ADC_JDRx寄存器中。

圖片

圖片

連續轉換模式

圖片

*單次轉換

*圖片

外部觸發轉換

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

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

圖片

數據對齊

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

圖片

通道選擇

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

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

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

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

ADC時鐘

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

圖片

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

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

可編程的通道采樣時間

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

總轉換時間如下計算:

TCONV = 采樣時間+ 12.5個周期

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

校準

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

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

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

圖片

ADC中斷

規則和注入組轉換結束時能產生中斷,當模擬看門狗狀態位被設置時也能產生中斷。它們都有獨立的中斷使能位。

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

圖片

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

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

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

圖片

ADC寄存器

ADC狀態寄存器(ADC_SR)

圖片

ADC控制寄存器(ADC_CR1)

圖片

圖片

ADC控制寄存器(ADC_CR2)

圖片

圖片

圖片

圖片

ADC采樣時間寄存器(ADC_SMPRx)

圖片

ADC規則序列寄存器(ADC_SQRx)

圖片

ADC規則數據寄存器(ADC_DR)

圖片

ADC庫函數配置

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數據寄存器地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;//存儲器地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//數據源來自外設
	DMA_InitStructure.DMA_BufferSize = 5;//緩沖區大小,應該等于數據目的地的大小
	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;	//循環傳輸模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA 傳輸通道優先級為高
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止存儲器到存儲器模式,因為是從外設到存儲器
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA
		
	//ADC1配置-----------------------------------------------------------------------------
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//同步規則
	ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //關閉掃描模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續轉換模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用外部觸發轉換,軟件開啟即可
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//轉換通道數
	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;//同步規則
	ADC_InitStructure.ADC_ScanConvMode = DISABLE; //關閉掃描模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續轉換模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用外部觸發轉換,軟件開啟即可
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//轉換通道數
	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的外部觸發轉換
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能軟件觸發轉換
}

//DMA1中斷服務函數
__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的數據
			 ADC_ConvertedValue_R[k++] = (ADC_ConvertedValue[i] & 0xffff);
			 //ADC1- >DR高16位,ADC2的數據
			 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];
	
	/*如果左邊索引大于或者等于右邊的索引就代表已經整理完成一個組了*/
    if (left >= right) { return; }

	/*控制在當組內尋找一遍*/
    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);
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2270

    文章

    10896

    瀏覽量

    355769
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114739
  • RCC
    RCC
    +關注

    關注

    0

    文章

    93

    瀏覽量

    26933
  • 預分頻器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    8131
  • ADC采樣
    +關注

    關注

    0

    文章

    134

    瀏覽量

    12840
收藏 人收藏

    評論

    相關推薦

    電磁繼電器基本知識介紹

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

    電磁繼電器基本知識介紹

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

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

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

    STM32F103外部中斷基本知識介紹

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

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

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

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

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

    MIMO 的基本知識介紹

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

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

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

    圖像采集基本知識介紹

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

    LED基本知識

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

    安全用電基本知識

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

    電纜接續基本知識_電纜接續工藝介紹

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

    STM32單片機ADC采集

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

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

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

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

    第12章-ADC采集電壓和顯示 基于STM32ADC—電壓采集(詳細講解+HAL庫)
    的頭像 發表于 08-21 16:31 ?2491次閱讀
    第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庫)
    主站蜘蛛池模板: 97caopeng| 51精品少妇人妻AV一区二区| 一级黄色香蕉视频| www.伊人网| 好色的妹妹| 日本男女动态图| 性色少妇AV蜜臀人妻无码| 影音先锋 av天堂| 国产超碰AV人人做人人爽| 看看妇女的B免费看| 色综合 亚洲 自拍 欧洲| 最近日本MV字幕免费观看视频| 俄罗斯爱爱| 免费人成网站永久| 亚洲大爷操| 吃奶吸咪咪动态图| 久久国产高清字幕中文| 午夜福利体验试看120秒| 97精品免费视频| 久草青青在线| 亚洲AV一宅男色影视| 动漫美女人物被黄漫在线看| 美丽的姑娘BD在线观看| 亚洲精品国产在线观看| 国产精品九九久久精品视| 欧美亚洲精品一区二三区8V| 最近中文字幕完整版高清| 精品国产乱码久久久久久夜深人妻 | 97成人在线| 麻豆成人AV久久无码精品| 亚洲中文字幕永久在线| 花蝴蝶高清影视视频在线播放| 色婷婷国产精品视频一区二区三区 | 日产亚洲一区二区三区| freehd另类xxxx喷水| 欧美日韩亚洲成人| 99国内偷揿国产精品人妻| 免费看黄软件| YELLOW视频在线观看最新| 日本十八禁无遮拦啪啪漫画| 成人免费视频在线看|