stm32中ADC初始化程序


ADC是英文“Analog-to-digitalconverter”的簡寫,是指模擬數字轉換器,是用於將模擬形式的連續信號轉換為數字形式的離散信號的一類設備

void Adc_Init(void)
{
uint32_t tmpreg1 = 0;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道時鍾


RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時鍾不能超過14M

/* PC0 作為模擬通道輸入引腳 ->ADC_IN10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* ADC初始化*/
//CR1寄存器設置
tmpreg1 = ADC1->CR1;
tmpreg1 &= 0xfff0feff; //adc的DUALMOD和SCAN位清零
tmpreg1 |= ((uint32_t)0x00000000); //位19:16 0000:獨立模式
tmpreg1 |= ((uint32_t)0x00000000); //掃描模式設置
ADC1->CR1 = tmpreg1;

//CR2寄存器設置
tmpreg1 = ADC1->CR2;
tmpreg1 &= 0xfff1f7fd; //CONT、EXTSEL[2:0]清零
tmpreg1 |= (1<<20); //使用外部事件啟動轉換
tmpreg1 |= ((uint32_t)0x000E0000); //外部事件設置為軟件觸發
tmpreg1 |= ((uint32_t)0x00000000); //數據右對齊
tmpreg1 &= ~(1<<1); //單次轉換模式
ADC1->CR2 = tmpreg1;

//規則通道數量設置 1個
tmpreg1 = ADC1->SQR1;
tmpreg1 &= 0xff0fffff;
tmpreg1 |= 0x00000000; //位19~位23 0000 代表規則轉換組中只有一個通道
ADC1->SQR1 = tmpreg1;

//規則通道轉換順序 轉換AD通道10
tmpreg1 = ADC1->SQR3;
tmpreg1 &= 0xffffffe0;
tmpreg1 |= 0x0000000a;
ADC1->SQR3 = tmpreg1;

//采樣時間設置
ADC1->SMPR1 &= ~(7<<0); //通道10采樣時間設置,239.5周期,提高采樣時間可以提高精確度
ADC1->SMPR1 |= 7<<0;

//開啟AD

ADC1->CR2 |= (1<<0); //開AD轉換器

//AD校准

ADC1->CR2 |= (1<<3); //復位校准
while( ADC1->CR2 & (1<<3) );
ADC1->CR2 |= (1<<2); //AD校准
while( ADC1->CR2 & (1<<2) );

}

自己以前都是庫函數操作,沒有獨立對着參考手冊在寄存器層面上編寫代碼。所以自己寫的很艱難,中間還是參考了封裝的庫函數的定義。現在還只能寫的代碼還只是一個通道可以轉換,多開了幾個通道設置還是有問題。明日再繼續。

自己獨立寫代碼和做代碼搬運工區別真的很大,雖然過程艱難,但是只要能做好,還是能學到很多東西。對概念的理解也會更深。


比如自己對 ! 和 ~的理解不到位。就想當然的寫出了下面的程序


//等待AD轉換結束

while( !(ADC1->SR) & (1<<1) );
而這種顯然更合理 while(!(ADC1->SR&1<<1));

若自己只是做代碼搬運工,不獨立寫,就不會發現概念上的誤區,看書的時候也不會有那么深的體會。

所以我希望自己能夠在學習的時候能夠更獨立。
————————————————
版權聲明:本文為CSDN博主「ES丶行者」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xxz1014/article/details/40404779


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM