學習STM32的ADC轉(zhuǎn)換,在開發(fā)板上寫程序調(diào)試。
四個任務(wù):
四個任務(wù):
1.AD以中斷方式(單次)采集一路
2.AD以中斷方式連續(xù)采集四路
3.ADC多路采集,DMA傳輸,DMA深度為一級
4.ADC以DMA方式采集四路,每路DMA深度為28級,并濾波,說明濾波原理
總結(jié):
第一個任務(wù)
:ADC以中斷方式采集一路ADC,通過配置ADC_InitStructure結(jié)構(gòu)體中的ADC_ScanConvMode,它規(guī)定模數(shù)轉(zhuǎn)換工作在掃描模式(多通道)還是單次模式(單通道),
ADC_InitStructure.ADC_ScanConvMode=DISABLE,為單通道單次模式。
ADC_ContinuousConvMode,定轉(zhuǎn)換是連續(xù)還是單次,ADC_ContinuousConvMode=DISABLE
為單次,ADC_NbrOfChangnel規(guī)定ADC規(guī)則轉(zhuǎn)換的通道數(shù)。ADC_NbrOfChannel=1;//開啟1個通道數(shù)。
ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_55Cycles5);設(shè)置指定規(guī)則組的通道的采樣順序和轉(zhuǎn)換時間。這里以為只有一路通道,采用的是PC3引腳,對應(yīng)的通道數(shù)是13通道,采樣順序也就是1,。
ADC_Cmd(ADC1,ENABLE);使能ADC
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);開啟ADC轉(zhuǎn)換結(jié)束中斷。
ADC_ResetCalibration(ADC1);//重置校驗寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置校驗成功
ADC_StartCalibration(ADC1);//開始ADC校驗
while(ADC_GetCalibrationStatus(ADC1));//等待ADC校驗好
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//軟件觸發(fā)開始轉(zhuǎn)換
因為ADC有一個16位的規(guī)則組數(shù)據(jù)寄存器(ADC_DR),采用一路轉(zhuǎn)換時可以不用通過DMA傳輸。這里就沒有配置DMA。
void ADC_IRQHandler(void)
{
ADCConvertedValue=ADC_GetConversionValue(ADC1);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}
當一次轉(zhuǎn)換結(jié)束,DAC產(chǎn)生中斷,在中斷函數(shù)里,讀取ADC_DR寄存器中的值,一定清除中斷標志位。
采集出來的數(shù)據(jù)是16進制數(shù),要經(jīng)過處理,變成10進制數(shù),具體如下:
(value*100/4096)*33,value是從寄存器讀出來的十六進制的數(shù)據(jù),經(jīng)過此變換后就變成10進制數(shù),是個整數(shù),我們通過串口顯示的時候要把小樹部分也要顯示出來則有:((value*100/4096)*33)/1000,整數(shù)部分。
((value*100/4096)*33)00/100,((value*100/4096)*33)0/10),小數(shù)部分,
串口配置,我是通過STM32上的串口1與PC機通訊的,具體配置如下:
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;波特率9600
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位數(shù)據(jù)位
USART_InitStructure.USART_StopBits=USART_StopBits_1;1個停止位
USART_InitStructure.USART_Parity=USART_Parity_No;無奇偶校驗
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStructure);初始化串口配置
USART_Cmd(USART1,ENABLE);使能串口
}
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, (u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)//檢查發(fā)送是否完成
{
}
return ch;
}此函數(shù),是把printf輸出函數(shù)定向到USART。
第一個任務(wù)大概就是這個過程,在后面的任務(wù)有相同之處,就不重復敘述了。
第二個任務(wù):ADC以中斷方式連續(xù)采集四路。
首先配置4路模擬輸入,我配置的是PC0、PC1、PC2、PC3四個IO口,輸入方式為模擬輸入,速度采用2M,它們對應(yīng)的ADC通道分別是10、11、12、13通道。
在第一個任務(wù)說了,ADC規(guī)則轉(zhuǎn)換多路采樣時,ADC的數(shù)據(jù)寄存器只有一個16位寄存器,所以必須采用DMA來傳輸數(shù)據(jù),DMA配置如下:
DMA_InitStructure.DMA_PeripheralBaseAddr=DR_ADDRESS; //DMA對應(yīng)的外設(shè)基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&Buf; //內(nèi)存存儲基地址,定義的一個數(shù)組
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //DMA轉(zhuǎn)換模式為SRC模式,由外設(shè)搬移到內(nèi)存
DMA_InitStructure.DMA_BufferSize=4; // DMA緩存大小,4個(設(shè)置DMA在傳輸時緩沖區(qū)的長度)
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //接收一次數(shù)據(jù)后,設(shè)備地址禁止后移(設(shè)置DMA的外設(shè)遞增模式)
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //關(guān)閉接收一次數(shù)據(jù)后,目標內(nèi)存地址后移(設(shè)置DMA的內(nèi)存遞增模式)
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)長度
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
//循環(huán)模式開啟,Buf寫滿后,自動回到初始地址開始傳輸
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//優(yōu)先級高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
ADC配置:
//ADC配置
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//獨立轉(zhuǎn)換模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE;//開啟掃描模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//開啟連續(xù)轉(zhuǎn)換模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//ADC外部開關(guān),關(guān)閉狀態(tài)
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//對齊方式,右對齊方式
ADC_InitStructure.ADC_NbrOfChannel=4;//開啟通道數(shù),4個
ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12,3,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_55Cycles5);;
//ADC通道組,第10、11、12、13個通道,采樣順序分別是1,2,3,4轉(zhuǎn)換時間55.5個周期
ADC_DMACmd(ADC1, ENABLE);//使能ADC1模塊DMA
ADC_Cmd(ADC1, ENABLE);//打開ADC1
ADC_ResetCalibration(ADC1);//重置ADC1校準寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準重置完成
ADC_StartCalibration(ADC1);//開始ADC1校準
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準完成
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1軟件開始轉(zhuǎn)換
中斷是采用DMA中斷,當DMA第一輪傳輸結(jié)束時,設(shè)一個標志位,當標志位為1時,表明第一輪轉(zhuǎn)化和傳輸完成,此時就可以讀取數(shù)組中的數(shù)據(jù),經(jīng)過處理就可以通過串口顯示出來。
void DMAChannel1_IRQHandler(void)
{
ADC_DMA_OK=1;
DMA_ClearITPendingBit(DMA1_IT_TC1);
}中斷函數(shù)。
第二個任務(wù)大概就這樣子。
第三個任務(wù):AD以DMA方式采集一路,DMA深度為一級。
這個任務(wù)不難,關(guān)鍵要理解到DMA深度,用自己的語言來理解哈DMA深度吧,當ADC以一路采集時,ADC轉(zhuǎn)換完成就自動把轉(zhuǎn)換結(jié)果通過DMA傳給目的地址,如果傳輸一次結(jié)束DMA就產(chǎn)生中斷的話,DMA的深度就為一級,如果連續(xù)傳輸N次,DMA的深度就位N級,當然這個N是又范圍的,因為受目的地址的內(nèi)存大小控制和數(shù)據(jù)寬度,這個大家應(yīng)該豆明白的。
這個任務(wù)在第一個任務(wù)的基礎(chǔ)上我通過DMA傳輸,意思是AD配置沒什么區(qū)別。DMA配置和第二個任務(wù)的區(qū)別就是DMA_BufferSize的寬度不同。
#define DR_ADDRESS (u32)0x4001244c ADC的地址
#define DMA_Count 1 DMA深度,也就是連續(xù)傳輸?shù)拇螖?shù)
#define ADC_Channle 1 ADC通道
數(shù)據(jù)處理和串口通訊這里不重復敘述。DMA中斷和任務(wù)二的類似。
第四個任務(wù):AD以DMA方式采集四路,每路DMA深度為128級,并濾波,說明濾波原理。
這個任務(wù)和是個綜合性任務(wù),只要弄懂前面三個任務(wù),難點是再如何濾波,開始的時候我也不知道怎么濾波,同事提醒我才知道怎么濾波的,我大概說哈我的理解,把四路通道采集的數(shù)據(jù)分別放到四個數(shù)組中,然后給他來個排序,降序,升序都行,把首位兩個數(shù)丟掉,然后加起來求平均值。但是我這里因為DMA的深度為128級,也就是四個通道分別采樣了128次,大家都知道,數(shù)據(jù)越多,求平均值就越準確,所以我就沒有采用什么排序法了,直接給他們分別求平均值,具體如下:
#define DR_ADDRESS (u32)0x4001244c ADC的地址
#define DMA_Count 128 DMA深度,也就是連續(xù)傳輸?shù)拇螖?shù)
#define ADC_Channle 4 ADC通道
for(i=0;i<(ADC_Channle*DMA_Count);i+=4)
{
Value1[j]=Buf[i+0];
Sum1+=Value1[j];
Value2[j]=Buf[i+1];
Sum2+=Value2[j];
Value3[j]=Buf[i+2];
Sum3+=Value3[j];
Value4[j]=Buf[i+3];
Sum4+=Value4[j];
j++;
}
Valu1=Sum1/DMA_Count;
Valu2=Sum2/DMA_Count;
Valu3=Sum3/DMA_Count;
Valu4=Sum4/DMA_Count;
Delay(100000);
printf("rn當前AD_0值:0x%x,電壓值:%d.%d%dVnr",
Valu1,((Valu1*100/4096)*33)/1000,((Valu1*100/4096)*33)00/100,((Valu1*100/4096)*33)0/10);
上一篇:教你如何使用stm32發(fā)送一幀數(shù)據(jù)(結(jié)構(gòu)體中的數(shù)據(jù))
下一篇:Stm32-SWD下載調(diào)試配置
推薦閱讀
史海拾趣
D1 International Inc公司深知,持續(xù)的技術(shù)創(chuàng)新是企業(yè)發(fā)展的核心動力。因此,公司不斷加大研發(fā)投入,積極引進和培養(yǎng)高素質(zhì)的研發(fā)人才。通過不斷的創(chuàng)新實踐,D1 International Inc公司在多個領(lǐng)域取得了重要的技術(shù)突破,為公司的發(fā)展注入了新的活力。
Abundance Enterprise Company注重品牌建設(shè)和市場推廣工作。公司通過多種渠道加強品牌宣傳和推廣,提高品牌知名度和美譽度。同時,公司還積極參與社會公益活動,履行企業(yè)社會責任,樹立了良好的企業(yè)形象。這些舉措有效提升了公司的市場競爭力,為公司的快速發(fā)展提供了有力保障。
2001年對BURGESS來說是具有重要意義的一年。在這一年,BURGESS榮獲了女皇賞,這是對其卓越業(yè)績和貢獻的極高認可。同時,BURGESS還售出了由Lurssen船廠制造的當時世界上最大的私人超級游艇,這一成就再次證明了其在游艇經(jīng)紀行業(yè)的卓越地位。
輝芒微(FMD)成立于2005年6月,作為一家新興的芯片設(shè)計企業(yè),其成立之初便專注于EEPROM(電可擦除可編程只讀存儲芯片)的研發(fā)與生產(chǎn)。在成立的同一年,輝芒微便成功實現(xiàn)了EEPROM芯片的量產(chǎn)銷售,這一里程碑式的成就為公司后續(xù)的快速發(fā)展奠定了堅實的基礎(chǔ)。隨著技術(shù)的不斷積累和市場的持續(xù)拓展,輝芒微在集成電路設(shè)計領(lǐng)域逐漸嶄露頭角。
隨著技術(shù)的不斷進步和市場的不斷變化,Boundary Devices不斷拓展其產(chǎn)品線,推出了包括開發(fā)板、OEM板和調(diào)制解調(diào)器等在內(nèi)的多種產(chǎn)品。這些產(chǎn)品不僅滿足了客戶多樣化的需求,也進一步提升了公司在行業(yè)中的競爭力。同時,公司注重創(chuàng)新,不斷投入研發(fā)力量,推出了一系列具有自主知識產(chǎn)權(quán)的產(chǎn)品,為公司的長期發(fā)展注入了新的動力。
Cynergy 3一直將客戶需求放在首位,致力于為客戶提供定制化的產(chǎn)品解決方案。公司擁有一支經(jīng)驗豐富的工程師團隊,他們與客戶緊密合作,深入了解客戶的實際需求。在此基礎(chǔ)上,Cynergy 3不斷推出符合客戶需求的新產(chǎn)品和新技術(shù)。這種以客戶需求為導向的產(chǎn)品創(chuàng)新策略使得Cynergy 3能夠不斷滿足市場的變化需求,保持其在行業(yè)中的領(lǐng)先地位。
雙端口SRAM在數(shù)據(jù)采集系統(tǒng)中的應(yīng)用 介紹一個實際使用中的數(shù)據(jù)采集系統(tǒng).本系統(tǒng)通過雙端口SRAM的應(yīng)用,解決了主機與外設(shè)(這里指數(shù)據(jù)采集板)之間由于速度不一致造成的系統(tǒng)運行的"瓶頸"問題.… 查看全部問答∨ |
|
做DSP最應(yīng)該懂得157個問題(精華轉(zhuǎn)) 文章寫得挺不錯的,采用一問一答的形式,都是些使用DSP進行系統(tǒng)設(shè)計時常見問題的歸納!和大家分享一下!… 查看全部問答∨ |
單片機第八課(尋址方式與指令系統(tǒng)) 通過前面的學習,我們已經(jīng)了解了單片機內(nèi)部的結(jié)構(gòu),并且也已經(jīng)知道,要控制單片機,讓它為我們干學,要用指令,我們已學了幾條指令,但很零散,從現(xiàn)在開始,我們將要系統(tǒng)地學習8051的指令部份。 一、概述 1 ...… 查看全部問答∨ |
書上好象說是依次工作的,比如程序計數(shù)器先指向并讀取第n條指令后,后面的電路才會解釋執(zhí)行該命令.但從另一方面說,似乎微機的各個部件是基于同一個時鐘脈沖觸發(fā)而工作的,這又意味著各個數(shù)字部件是同時(同步)工作的.那么,各個部件到底是同時還是依次工 ...… 查看全部問答∨ |
|
第一次做東西的本科小弟求救:有關(guān)GPRS通信問題 系統(tǒng)實現(xiàn)的功能:將位置信息和指令通過GPRS發(fā)送給PC,pc根據(jù)收到的信息返回相關(guān)信息。實現(xiàn)這些功能至少需要哪些硬件?開發(fā)價格大概在多少?需要準備哪些知識(我現(xiàn)在只有數(shù)模電基礎(chǔ):(我會加油學的))? 由于實在是水平和知識所限,以前有沒有經(jīng) ...… 查看全部問答∨ |
修改的USB虛擬串口程序,只給PC發(fā)數(shù)據(jù),如何提高速度? 我的程序只修改了,keil例子中USB虛擬串口程序的main()函數(shù),請問怎么才能獲得100k/s以上的速度啊?我的只有10k左右。 CDC類的極限速度是多少啊? keil是3.5版本的,例子中的緩沖區(qū)參數(shù)應(yīng)該是64。 main()如下: int main(void) { ...… 查看全部問答∨ |
設(shè)計資源 培訓 開發(fā)板 精華推薦
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 迅為IMX8MM開發(fā)板Linux系統(tǒng)修改默認屏幕
- 意法半導體推出創(chuàng)新的、帶有可改變存儲配置存儲器的車規(guī)微控制器解決方案
- 若虛假宣傳自動駕駛致嚴重后果,責任人可面臨 2 年以下有期徒刑或拘役
- 安富利推出S32M2智能EOP控制器解決方案
- 人形機器人 3D 視覺路線之爭:激光雷達、雙目和 3D - ToF 誰更勝一籌?
- Akamai成為首家提供云端VPU的服務(wù)商
- 新型水性電池能穩(wěn)定循環(huán)兩千次,有望用于電動汽車等領(lǐng)域
- 如何為工業(yè)物聯(lián)網(wǎng)選擇最節(jié)能的通信方案?
- 國數(shù)集聯(lián)加入阿里云發(fā)起的ALink,全面布局GPU Scale-Up互聯(lián)
- HBM4 內(nèi)存正式標準化,JEDEC 發(fā)布 JESD270-4 規(guī)范
- 意法半導體披露公司全球計劃細節(jié),重塑制造布局和調(diào)整全球成本基數(shù)
- TI 工業(yè)月,靈感不設(shè)限!21天習慣養(yǎng)成記!打卡贏好禮啦!
- 有獎直播:TI 的故事—— IC 創(chuàng)世紀
- Littelfuse 碳化硅(SiC) MOSFET和肖特基二極管產(chǎn)品介紹及相關(guān)應(yīng)用
- 有獎直播報名中|基于英飛凌AIROC™ CYW20829低功耗藍牙芯片的無線組網(wǎng)解決方案
- 100%獲獎,EE新年福利!
- 極簡主義,足不出戶,看東芝在線展會,安心答題送好禮!
- EE大學堂新年游戲之\\
- 為你點贊——我最愛有“干貨”的博文
- TI即將直播【 MSP430 系列最新超聲波流量測量方案】,你會錯過?報名看直播贏雙重好禮嘍!
- 建設(shè)泛在電力物聯(lián)網(wǎng) 打造能源互聯(lián)網(wǎng)生態(tài)圈
- 電力有償輔助服務(wù)劃分標準的再認識
- 戶用系統(tǒng)強制要求安裝智能逆變器,7月1日起澳大利亞維州實施新規(guī)定
- STM32 CUBEMX UART+DMA
- JZ2440開發(fā)板直連電腦實現(xiàn)三者互PING
- 杰和機器視覺新品ISC-661助力產(chǎn)業(yè)智能化升級
- 新移動時代下的IC設(shè)計
- 地平線余凱:未來要拿到全球1/3市場,助力國產(chǎn)汽車崛起
- 心理咨詢用上高科技,連信科技聯(lián)合余杭區(qū)衛(wèi)健局推出醫(yī)護版心理健康服務(wù)機器人
- 劉作虎劇透一加8系列發(fā)布會:準備了很久