STM32學習筆記之ADC

STM32F10X

1、ADC介紹
12
ADC是一種逐次逼近型模擬數字轉換器。它有多達18個通道,可測量16個外部和2個內部信號源各通道的信號源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行。 ADC的結果可以左對齊或右對齊方式存儲在16位數據寄存器中。

模擬看門狗特性允許應用程序檢測輸入電壓是否超出用戶定義的高/低閥值。

2、ADC主要特徵
12位分辨率
● 轉換結束、注入轉換結束和發生模擬看門狗事件時產生中斷
● 單次和連續轉換模式
● 從通道
0到通道n的自動掃描模式
● 自校準
● 帶內嵌數據一致性的數據對齊
● 採樣間隔可以按通道分別編程
● 規則轉換和注入轉換均有外部觸發選項
● 間斷模式
● 雙重模式
(2個或以上ADC的器件)
ADC轉換時間:
STM32F103xx增強型產品:時鐘爲56MHz時爲1μs(時鐘爲72MHz1.17μs)
STM32F101xx基本型產品:時鐘爲28MHz時爲1μs(時鐘爲36MHz1.55μs)
STM32F102xxUSB型產品:時鐘爲48MHz時爲1.2μs
STM32F105xxSTM32F107xx產品:時鐘爲56MHz時爲1μs(時鐘爲72MHz1.17μs)
ADC供電要求: 2.4V3.6V
ADC輸入範圍: VREF- VIN VREF+
● 規則通道轉換期間有DMA請求產生 

3、ADC開關控制
通過設置ADC_CR2寄存器的ADON位可給ADC上電。當第一次設置ADON位時,它將ADC從斷電狀態下喚醒。
ADC上電延遲一段時間後(tSTAB),再次設置ADON位時開始進行轉換。
通過清除
ADON位可以停止轉換,並將ADC置於斷電模式。在這個模式中, ADC幾乎不耗電(僅幾個μA)
4、 ADC時鐘
由時鐘控制器提供的ADCCLK時鐘和PCLK2(APB2時鐘)同步。 RCC控制器爲ADC時鐘提供一個專用的可編程預分頻器,詳見小容量、中容量和大容量產品的復位和時鐘控制(RCC)章節。
5、通道選擇
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_SQRxADC_JSQR寄存器在轉換期間被更改,當前的轉換被清除,一個新的啓動脈衝將發送到ADC以轉換新選擇的組。
溫度傳感器/ VREFINT內部通道
溫度傳感器和通道ADC1_IN16相連接,內部參照電壓VREFINTADC1_IN17相連接。可以按注入或規則通道對這兩個內部通道進行轉換。
注意: 溫度傳感器和
VREFINT只能出現在主ADC1中。
6、單次轉換模式
單次轉換模式下, ADC只執行一次轉換。該模式既可通過設置ADC_CR2寄存器的ADON(只適用於規則通道)啓動也可通過外部觸發啓動(適用於規則通道或注入通道),這時CONT位爲0
一旦選擇通道的轉換完成:
● 如果一個規則通道被轉換:
轉換數據被儲存在16ADC_DR寄存器中
EOC(轉換結束)標誌被設置
如果設置了EOCIE,則產生中斷。
● 如果一個注入通道被轉換:
轉換數據被儲存在16位的ADC_DRJ1寄存器中
JEOC(注入轉換結束)標誌被設置
如果設置了JEOCIE位,則產生中斷。
然後
ADC停止。
7、連續轉換模式
在連續轉換模式中,當前面ADC轉換一結束馬上就啓動另一次轉換。此模式可通過外部觸發啓動或通過設置ADC_CR2寄存器上的ADON位啓動,此時CONT位是1
每個轉換後:
● 如果一個規則通道被轉換:
轉換數據被儲存在16位的ADC_DR寄存器中
EOC(轉換結束)標誌被設置
如果設置了EOCIE,則產生中斷。
● 如果一個注入通道被轉換:
轉換數據被儲存在16位的ADC_DRJ1寄存器中
JEOC(注入轉換結束)標誌被設置
如果設置了JEOCIE位,則產生中斷。 

8、掃描模式
此模式用來掃描一組模擬通道。
掃描模式可通過設置
ADC_CR1寄存器的SCAN位來選擇。一旦這個位被設置, ADC掃描所有被ADC_SQRX寄存器(對規則通道)ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執行單次轉換。在每個轉換結束時,同一組的下一個通道被自動轉換。如果設置了CONT位,轉換不會在選擇組的最後一個通道上停止,而是再次從選擇組的第一個通道繼續轉換。
如果設置了
DMA位,在每次EOC後, DMA控制器把規則組通道的轉換數據傳輸到SRAM中。而注入通道轉換的數據總是存儲在ADC_JDRx寄存器中。
9、注入通道管理
觸發注入
清除ADC_CR1寄存器的JAUTO位,並且設置SCAN位,即可使用觸發注入功能。
1. 利用外部觸發或通過設置ADC_CR2寄存器的ADON位,啓動一組規則通道的轉換。
2. 如果在規則通道轉換期間產生一外部注入觸發,當前轉換被複位,注入通道序列被以單次掃描方式進行轉換。
3. 然後,恢復上次被中斷的規則組通道轉換。如果在注入轉換期間產生一規則事件,注入轉換不會被中斷,但是規則序列將在注入序列結束後被執行。 圖27是其定時圖。
注: 當使用觸發的注入轉換時,必須保證觸發事件的間隔長於注入序列。例如:序列長度爲
28
ADC時鐘週期(2個具有1.5個時鐘間隔採樣時間的轉換),觸發之間最小的間隔必須是29
ADC時鐘週期。
自動注入
如果設置了JAUTO位,在規則組通道之後,注入組通道被自動轉換。這可以用來轉換在
ADC_SQRxADC_JSQR寄存器中設置的多至20個轉換序列。
在此模式裏,必須禁止注入通道的外部觸發。
如果除
JAUTO位外還設置了CONT位,規則通道至注入通道的轉換序列被連續執行。
對於
ADC時鐘預分頻係數爲48時,當從規則轉換切換到注入序列或從注入轉換切換到規則序
列時,會自動插入
1ADC時鐘間隔;當ADC時鐘預分頻係數爲2時,則有2ADC時鐘間隔的
延遲。
注意: 不可能同時使用自動注入和間斷模式

10、間斷模式
規則組
此模式通過設置ADC_CR1寄存器上的DISCEN位激活。它可以用來執行一個短序列的n次轉換
(n<=8),此轉換是ADC_SQRx寄存器所選擇的轉換序列的一部分。數值nADC_CR1寄存器的
DISCNUM[2:0]位給出。
一個外部觸發信號可以啓動
ADC_SQRx寄存器中描述的下一輪n次轉換,直到此序列所有的轉
換完成爲止。總的序列長度由
ADC_SQR1寄存器的L[3:0]定義。
舉例:
n=3,被轉換的通道 = 012367910
第一次觸發:轉換的序列爲 012
第二次觸發:轉換的序列爲 367
第三次觸發:轉換的序列爲 910,併產生EOC事件
第四次觸發:轉換的序列
0 12
注意: 當以間斷模式轉換一個規則組時,轉換序列結束後不自動從頭開始。
當所有子組被轉換完成,下一次觸發啓動第一個子組的轉換。在上面的例子中,第四次觸發重
新轉換第一子組的通道
0 12
注入組
此模式通過設置ADC_CR1寄存器的JDISCEN位激活。在一個外部觸發事件後,該模式按通道
順序逐個轉換
ADC_JSQR寄存器中選擇的序列。
一個外部觸發信號可以啓動
ADC_JSQR寄存器選擇的下一個通道序列的轉換,直到序列中所有
的轉換完成爲止。總的序列長度由
ADC_JSQR寄存器的JL[1:0]位定義。
例子:
n=1,被轉換的通道 = 123
第一次觸發:通道1被轉換
第二次觸發:通道
2被轉換
第三次觸發:通道
3被轉換,並且產生EOCJEOC事件
第四次觸發:通道
1被轉換
注意:
1 當完成所有注入通道轉換,下個觸發啓動第1個注入通道的轉換。在上述例子中,第四個
觸發重新轉換第
1個注入通道1、2 不能同時使用自動注入和間斷模式 。
11、數據對齊

12、程序示例
void  Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );  //使能ADC1通道時鐘
 
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
//PA1 作爲模擬通道輸入引腳                         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);  //復位ADC1 

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數轉換工作在單次轉換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啓動
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目
ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器   

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //使能復位校準  
 
while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束

ADC_StartCalibration(ADC1); //開啓AD校準
 
while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束
 
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啓動功能
}   

void TASK1(void *param)
{
  uint16_t adc_value= 0;
  uint8_t i = 0; 
  for(;;)
  {
    adc_value= 0;
       for(i=0;i<4;i++)
  {
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);    
  while(ADC_GetSoftwareStartConvStatus(ADC1));
adc_value += ADC_GetConversionValue(ADC1);
  }
  ADC_Speed = adc_value/4;
  CoTickDelay(10);
  }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章