STM8S單片機的A/D結構簡介: 具有ADC1 ADC2(部分型號沒有ADC2)最多提供16個轉換通道,A/D轉換的各個通道可以執(zhí)行單次和連續(xù)的轉換模式。
本文引用地址:http://www.butianyuan.cn/article/201611/320926.htm1.電壓0到Vdda;
2.在64和80引腳封裝的有獨立的Vref,其他的封裝形式Vref連接在Vdda
3.續(xù)轉換形式;
4.時間14個時鐘周期;
5.10位轉換精度;
6.產生轉換結束中斷;
![](http://editerupload.eepw.com.cn/fetch/20161101/320926_1_0.jpg)
ADC1結構圖
編程中注意的知識點:
過置位ADC_CR1寄存器的 ADON位來開啟ADC。當首次置位ADON位時,ADC從低功耗模式喚醒。為了啟動轉換必須第二次使用寫指令來置ADC_CR1寄存器的ADON 位。在轉換結束時ADC會保持在上電狀態(tài),用戶只需要置位ADON位一次來啟動下一次的轉換。
如果長時間沒有使用ADC,推薦將ADC模塊切換到低功耗模式來降低功耗,這可以通過清零 ADON 位來實現(xiàn)。ADC模塊上電后,所選通道對應的I/O口輸出模塊是被禁用的。因此推薦在ADC上電之前要選擇合適的ADC轉換通道。
如果單次模式在單次轉換模式中,ADC僅在由ADC_CSR寄存器的CH[3:0]選定的通道上完成一次轉換。該模式是在當CONT位為0時通過置位ADC_CR1寄存器的ADON位來啟動的。
一旦轉換完成,轉換后的數(shù)據(jù)存儲在ADC_DR寄存器中,EOC(轉換結束)標志被置EOCIE 被置位將產生一個中斷。
代碼如下:
#include "adc.h"
u16 TempADC;
void ADC_Config(void)
{
ADC_CR1 |= 0x01; //開始啟動初始化必須啟動一次
//第一次寫1,ADC從低功耗喚醒,第二次寫1,啟動ADC轉換
//ADC_CR1 |= 0x20; //使能轉換結束中斷,本例中采用的查詢方式。
}
uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel, ADC1_PRESSEL_FCPU_D2,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);
//你也可以用操作寄存器的方式代碼如下,但未驗證。
#if 0
ADC_CR2 = 0x00; // A/D結果數(shù)據(jù)左對齊
CLK_PCKENR2 |= 0x08; // 使能fMASTER與ADC的連接
ADC_CR1 = 0x00;// ADC時鐘=主時鐘/2=8MHz,單次轉換模式
ADC_CSR = 0x01; // 選擇通道2
ADC_TDRL = 0x01; // 禁止施密特觸發(fā)功能
ADC_TDRH = 0x01;
ADC_CR1 = 0x03; //2分頻,連續(xù)轉換,啟動ADC
ADC_CR2 = 0x31; //外部事件保留,數(shù)據(jù)右對齊,禁止掃描模式,
ADC_CSR|= 0x01; //選擇通道1
#endif
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel,ADC1_ALIGN_RIGHT);
ADC_CR1 |= 0x01; //開始啟動轉換
while(!(ADC_CSR & 0x80)); //等待轉換結束
return ADC1_GetConversionValue(); //返回ADC結果
}
//這個初始化代碼很重要,不能省,每次切換通道都要初始化一次!
在main函數(shù)中直接調用即可:
TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1); //獲取AD轉化值
WetADC=Get_ADCCH_Value(ADC1_CHANNEL_3; //獲取AD轉化值
到此結束!開始你的代碼快樂之旅吧~~~~
評論