STM32一般都擁有1~3個ADC,這些ADC可以獨立使用,也可以使用雙重/三重ADC采樣模式,本文使用STM32F103ZET6的雙重ADC模式,同步采集兩個通道的電壓信號。
一、注意事項
1、配置ADC的采樣模式為同步規則采樣
ADC1和ADC2采樣模式相同,但其中ADC1為主ADC,ADC2為從ADC。
該模式在ADC_CR1寄存器中配置:(具體資料請參詳STM32參考手冊)
2、使能DMA位
在雙ADC模式中,ADC1和ADC2的規則通道轉換數據均會保存到主數據寄存器,也就是ADC1數據寄存器(ADC1_DR)中。為了能在主寄存器中讀取從ADC的轉換數據,必須使能DMA位。** 無論是否使用DMA傳輸規則通道數據 **
在ADC_CR2寄存器中配置:
3、觸發方式配置
如果ADC1使用軟件觸發,ADC2則使用外部通道觸發;ADC1使用外部事件觸發時,ADC2設置成軟件觸發,這樣可以防止意外觸發從轉換。
二、代碼配置
1、adc.c
/****
* 程序功能:實現雙ADC同步采集,每路ADC各有1個通道(單通道)
*
******/
#include "adc.h"
#include "delay.h"
#include "usart.h"
#define M 128
#define N 8
uint16_t value[N][M];
u32 ADC_ConvertedValue;
//初始化ADC1
void Adc1_Multi_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_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //復位ADC1,將外設 ADC1 的全部寄存器重設為缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工作模式:ADC1同步規則組模式
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_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
// 開啟ADC的DMA支持
ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA位
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //使能ADC1
/* Enable ADC1 reset calibaration register 使能ADC1復位校準寄存器 */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register ADC1復位校準寄存器檢查結束*/
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration 啟動ADC1校準 */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration ADC1校準檢查結束 */
while(ADC_GetCalibrationStatus(ADC1));
}
//初始化ADC2
void Adc2_Multi_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC2 , ENABLE ); //使能ADC2通道時鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
//PB0,1 作為模擬通道輸入引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳
GPIO_Init(GPIOC, &GPIO_InitStructure);
ADC_DeInit(ADC2); //復位ADC2,將外設 ADC2 的全部寄存器重設為缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工作模式:ADC1同步規則組模式
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(ADC2, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器
ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 );
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //使能ADC2的外部觸發模式
/* Enable ADC2 */
ADC_Cmd(ADC2, ENABLE); //使能ADC2
/* Enable ADC1 reset calibaration register 使能ADC2復位校準寄存器 */
ADC_ResetCalibration(ADC2);
/* Check the end of ADC1 reset calibration register ADC2復位校準寄存器檢查結束*/
while(ADC_GetResetCalibrationStatus(ADC2));
/* Start ADC1 calibaration 啟動ADC2校準 */
ADC_StartCalibration(ADC2);
/* Check the end of ADC1 calibration ADC2校準檢查結束 */
while(ADC_GetCalibrationStatus(ADC2));
}
/*初始化ADC */
void MY_ADC_Init(void)
{
Adc1_Multi_Init();
Adc2_Multi_Init();
}
void task_adc(void)
{
int i;
printf("rn 采樣開始rn");
for(i=0;i /* Start ADC1 Software Conversion 啟動ADC1軟件轉換 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //開始轉換 ADC_ConvertedValue=ADC1->DR; value[0][i] = (ADC_ConvertedValue&0xffff); //獲取ADC的值 value[1][i] = ((ADC_ConvertedValue>> 16)&0xffff); //獲取ADC的值 printf("rn 編號%d t 編號%d t AD值: %drn", 0,i, value[0][i]); printf("rn 編號%d t 編號%d t AD值: %drn", 1,i, value[1][i]); } printf("rn 采樣結束rn"); } 2、adc.h #ifndef __ADC_H #define __ADC_H #include "sys.h" void Adc1_Multi_Init(void); void Adc2_Multi_Init(void); void MY_ADC_Init(void); void task_adc(void); #endif 3、main.c #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "adc.h" int main(void) { delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級 uart_init(115200); //串口初始化為115200 LED_Init(); //LED端口初始化 MY_ADC_Init(); //ADC初始化 while(1) { task_adc(); LED0=!LED0; delay_ms(250); } }
上一篇:STM32采集AD電壓
下一篇:記一次在STM32開發踩過得坑(ADC采集、電流大小的影響)
推薦閱讀
史海拾趣
面對日益激烈的市場競爭和環境保護的壓力,東晶電子堅持品質至上和綠色生產的理念。公司引進了先進的品質管理體系和環境管理體系,通過ISO9001、ISO14000等認證,確保產品質量的穩定性和可靠性。同時,公司還積極推廣綠色生產理念,采用環保材料和工藝,降低生產過程中的能耗和排放,實現可持續發展。
昭華公司一直注重品牌建設和市場拓展。他們通過參加各種行業展會、舉辦技術研討會等方式,積極宣傳公司的產品和技術優勢。同時,昭華公司還加強了與客戶的溝通和合作,深入了解客戶需求并提供定制化的解決方案。這些努力使得昭華公司的品牌知名度不斷提升,市場份額也逐漸擴大。
在1966年,Electro-Mech Components, Inc. (EMC)做出了一個重要的戰略決策——在墨西哥北下加利福尼亞州的蒂華納開設一家制造工廠。這個決定標志著EMC正式進軍國際市場,并開始了其在全球范圍內的業務布局。蒂華納工廠的建立為EMC帶來了更低的制造成本和更廣闊的市場前景。隨著工廠規模的逐漸擴大,EMC的產品線也日益豐富,從最初的發光按鈕開關逐漸擴展到指示燈和多開關互鎖組件等多個領域。
隨著數字化技術的不斷進步和應用領域的不斷擴大,Digital View公司也加快了數字化轉型和升級的步伐。公司加大了對云計算、大數據、人工智能等前沿技術的研發和應用力度,推出了一系列智能化、數字化的產品和服務。這些產品和服務不僅提高了客戶的運營效率和管理水平,還為公司帶來了新的增長點。
進入21世紀后,環保和可持續發展成為全球關注的焦點。Hokuriku Electric積極響應這一趨勢,將環保理念融入產品研發和生產過程中。公司投入大量資源研發綠色電子產品,減少生產過程中的能源消耗和廢棄物排放。同時,Hokuriku Electric還積極參與行業內的環保倡議和合作項目,推動整個電子行業的可持續發展。這一舉措不僅贏得了社會各界的廣泛贊譽,還為公司帶來了更多的商業機會和合作伙伴。
隨著電子行業的快速發展,Carlisle Interconnect Technologies不斷進行技術升級和產品創新。公司不斷引進先進的生產設備和技術,提升產品的質量和性能。同時,公司還積極拓展產品線,從最初的絕緣電線電纜擴展到連接器、傳感器等多個領域。這種多樣化的產品策略使得公司能夠更好地滿足客戶的多樣化需求,也在市場上取得了更大的成功。
長期供應信號源HP83640L/83622A/83752A/8247C/824 一、 綜合測試儀 R&S CMU200(可測GSM900/1800);Agilent8960 E5515B(可測GSM900/1800/1900/GPRS);Agilnet8960 E5515C(OPT:002、003,可測GSM、CDMA);R&S CMD55(可測900/1800);R&S CMD60(DECT測試儀);MT8801B(PHS測試儀); ...… 查看全部問答∨ |
公司批發零售奶粉:澳美多 澳優 寶樂康 葆嬰 貝因美 賜多利 多美滋 恩貝兒 飛鶴 華惠氏 慧聰 康維多 林貝兒 美可高特 美素 美贊臣 蒙牛 明治 親親寶貝 雀巢 三鹿 三元 森永 圣元 施恩 適寶康 完達山 味全 雅培 雅士利 伊利 優素 奶瓶 優幼 紙尿褲,好 ...… 查看全部問答∨ |
要求: a.本科或以上,電子相關專業;b.3年電子實際開發經驗,有一定的硬件設計經驗,了解EMC/EMI和相關測試;c.熟悉MCU應用和C語言, 了解Matlab等算法模型工具和操作系統優先;d.了解汽車電子系統,有其開發經驗優先;e.工作認真負責,勇于承擔責任, ...… 查看全部問答∨ |
|
為什么模擬地與數字地應有各自獨立的回路?大家都是地,為什么還分彼此? Link水平很低,常常會問一些低級問題。 幸蒙Perter指點,明白了少許,現在和大家分享一下。 其實本質是對的,就是數字地,模擬地都是地,并不是他們倆頭上長角,十分的怪 ...… 查看全部問答∨ |
|
筆者使用protel多年,積累了一些用其繪制電路圖的使用經驗和技巧,現將這些經驗和技巧成文,希望對大家用protel繪制電路圖有所幫助。 經驗一: 因為protel是專業電路設計軟件,可供電子類各專業設計人員和廣大電子愛好者使用,所提供的 ...… 查看全部問答∨ |
這幾天看到諾基亞新的廣告,記得一句話:互聯應用,中國創造。可以看得出諾基亞從全球擴張到主打某個地區市場的戰略轉移,也可以看得出諾基亞對移動互聯網的信心。記得2008年10月時諾基亞曾展示過了其基于下一站生活方式的全新通信技術與移動互聯網 ...… 查看全部問答∨ |
我在用真是還進調試的時候,程序中打了斷點,可是斷點不其作用。後來用其他同事的電腦調試卻可以。應該是我vs還進的問題吧,請高人指點,如何解決這個問題。… 查看全部問答∨ |
這個月一直有個問題讓我困擾著我. 在CE中是否可以真正意義上的實現相對于屏幕彈出的窗口或是圖片淡入淡出(彈出時)?就是說.在mobile屏幕上(而不是你自己寫的窗口或是其它你程序中的背景圖片上),一個窗口淡入淡出.或是一個 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 傳統晶體管的極限!臺積電3nm N3P已量產