日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 模擬 > 模擬
[導(dǎo)讀] 學(xué)習(xí)STM32的ADC轉(zhuǎn)換,在開發(fā)板上寫程序調(diào)試。 四個(gè)任務(wù):1.AD以中斷方式(單次)采集一路2.AD以中斷方式連續(xù)采集四路3.AD以DMA方式采集一路,DMA深度為一級(jí)4.AD以DMA方式采集四路,每路DMA深度為28級(jí),并濾波,說(shuō)明濾

 

學(xué)習(xí)STM32ADC轉(zhuǎn)換,在開發(fā)板上寫程序調(diào)試。

四個(gè)任務(wù):

1.AD以中斷方式(單次)采集一路

2.AD以中斷方式連續(xù)采集四路

3.AD以DMA方式采集一路,DMA深度為一級(jí)

4.AD以DMA方式采集四路,每路DMA深度為28級(jí),并濾波,說(shuō)明濾波原理。

總結(jié):

第一個(gè)任務(wù):ADC以中斷方式采集一路ADC,通過(guò)配置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個(gè)通道數(shù)。

ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_55Cycles5);設(shè)置指定規(guī)則組的通道的采樣順序和轉(zhuǎn)換時(shí)間。這里以為只有一路通道,采用的是PC3引腳,對(duì)應(yīng)的通道數(shù)是13通道,采樣順序也就是1,。

ADC_Cmd(ADC1,ENABLE);使能ADC

ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);開啟ADC轉(zhuǎn)換結(jié)束中斷。

ADC_ResetCalibration(ADC1);//重置校驗(yàn)寄存器

while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置校驗(yàn)成功

ADC_StartCalibration(ADC1);//開始ADC校驗(yàn)

while(ADC_GetCalibrationStatus(ADC1));//等待ADC校驗(yàn)好

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//軟件觸發(fā)開始轉(zhuǎn)換

因?yàn)锳DC有一個(gè)16位的規(guī)則組數(shù)據(jù)寄存器(ADC_DR),采用一路轉(zhuǎn)換時(shí)可以不用通過(guò)DMA傳輸。這里就沒(méi)有配置DMA。

void ADC_IRQHandler(void)

{

ADCConvertedValue=ADC_GetConversionValue(ADC1);

ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);

}

當(dāng)一次轉(zhuǎn)換結(jié)束,DAC產(chǎn)生中斷,在中斷函數(shù)里,讀取ADC_DR寄存器中的值,一定清除中斷標(biāo)志位。

采集出來(lái)的數(shù)據(jù)是16進(jìn)制數(shù),要經(jīng)過(guò)處理,變成10進(jìn)制數(shù),具體如下:

(value*100/4096)*33,value是從寄存器讀出來(lái)的十六進(jìn)制的數(shù)據(jù),經(jīng)過(guò)此變換后就變成10進(jìn)制數(shù),是個(gè)整數(shù),我們通過(guò)串口顯示的時(shí)候要把小樹部分也要顯示出來(lái)則有:((value*100/4096)*33)/1000,整數(shù)部分。

((value*100/4096)*33)%1000/100,((value*100/4096)*33)%100/10),小數(shù)部分,

串口配置,我是通過(guò)STM32上的串口1與PC機(jī)通訊的,具體配置如下:

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個(gè)停止位

USART_InitStructure.USART_Parity=USART_Parity_No;無(wú)奇偶校驗(yàn)

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

第一個(gè)任務(wù)大概就是這個(gè)過(guò)程,在后面的任務(wù)有相同之處,就不重復(fù)敘述了。

第二個(gè)任務(wù):ADC以中斷方式連續(xù)采集四路。

首先配置4路模擬輸入,我配置的是PC0、PC1、PC2、PC3四個(gè)IO口,輸入方式為模擬輸入,速度采用2M,它們對(duì)應(yīng)的ADC通道分別是10、11、12、13通道。

在第一個(gè)任務(wù)說(shuō)了,ADC規(guī)則轉(zhuǎn)換多路采樣時(shí),ADC的數(shù)據(jù)寄存器只有一個(gè)16位寄存器,所以必須采用DMA來(lái)傳輸數(shù)據(jù),DMA配置如下:

DMA_InitStructure.DMA_PeripheralBaseAddr=DR_ADDRESS; //DMA對(duì)應(yīng)的外設(shè)基地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&Buf; //內(nèi)存存儲(chǔ)基地址,定義的一個(gè)數(shù)組

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //DMA轉(zhuǎn)換模式為SRC模式,由外設(shè)搬移到內(nèi)存

DMA_InitStructure.DMA_BufferSize=4; // DMA緩存大小,4個(gè)(設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長(zhǎng)度)

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //接收一次數(shù)據(jù)后,設(shè)備地址禁止后移(設(shè)置DMA的外設(shè)遞增模式)

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //關(guān)閉接收一次數(shù)據(jù)后,目標(biāo)內(nèi)存地址后移(設(shè)置DMA的內(nèi)存遞增模式)

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)長(zhǎng)度

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;

//循環(huán)模式開啟,Buf寫滿后,自動(dòng)回到初始地址開始傳輸

DMA_InitStructure.DMA_Priority=DMA_Priority_High;//優(yōu)先級(jí)高

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

ADC配置:

//ADC配置

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//獨(dú)立轉(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;//對(duì)齊方式,右對(duì)齊方式

ADC_InitStructure.ADC_NbrOfChannel=4;//開啟通道數(shù),4個(gè)

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個(gè)通道,采樣順序分別是1,2,3,4轉(zhuǎn)換時(shí)間55.5個(gè)周期

ADC_DMACmd(ADC1, ENABLE);//使能ADC1模塊DMA

ADC_Cmd(ADC1, ENABLE);//打開ADC1

ADC_ResetCalibration(ADC1);//重置ADC1校準(zhǔn)寄存器

while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)重置完成

ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)

while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成

ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1軟件開始轉(zhuǎn)換

中斷是采用DMA中斷,當(dāng)DMA第一輪傳輸結(jié)束時(shí),設(shè)一個(gè)標(biāo)志位,當(dāng)標(biāo)志位為1時(shí),表明第一輪轉(zhuǎn)化和傳輸完成,此時(shí)就可以讀取數(shù)組中的數(shù)據(jù),經(jīng)過(guò)處理就可以通過(guò)串口顯示出來(lái)。

void DMAChannel1_IRQHandler(void)

{

ADC_DMA_OK=1;

DMA_ClearITPendingBit(DMA1_IT_TC1);

}中斷函數(shù)。

第二個(gè)任務(wù)大概就這樣子

第三個(gè)任務(wù):AD以DMA方式采集一路,DMA深度為一級(jí)。

這個(gè)任務(wù)不難,關(guān)鍵要理解到DMA深度,用自己的語(yǔ)言來(lái)理解哈DMA深度吧,當(dāng)ADC以一路采集時(shí),ADC轉(zhuǎn)換完成就自動(dòng)把轉(zhuǎn)換結(jié)果通過(guò)DMA傳給目的地址,如果傳輸一次結(jié)束DMA就產(chǎn)生中斷的話,DMA的深度就為一級(jí),如果連續(xù)傳輸N次,DMA的深度就位N級(jí),當(dāng)然這個(gè)N是又范圍的,因?yàn)槭苣康牡刂返膬?nèi)存大小控制和數(shù)據(jù)寬度,這個(gè)大家應(yīng)該豆明白的。

這個(gè)任務(wù)在第一個(gè)任務(wù)的基礎(chǔ)上我通過(guò)DMA傳輸,意思是AD配置沒(méi)什么區(qū)別。DMA配置和第二個(gè)任務(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ù)處理和串口通訊這里不重復(fù)敘述。DMA中斷和任務(wù)二的類似。

第四個(gè)任務(wù):AD以DMA方式采集四路,每路DMA深度為128級(jí),并濾波,說(shuō)明濾波原理。

這個(gè)任務(wù)和是個(gè)綜合性任務(wù),只要弄懂前面三個(gè)任務(wù),難點(diǎn)是再如何濾波,開始的時(shí)候我也不知道怎么濾波,同事提醒我才知道怎么濾波的,我大概說(shuō)哈我的理解,把四路通道采集的數(shù)據(jù)分別放到四個(gè)數(shù)組中,然后給他來(lái)個(gè)排序,降序,升序都行,把首位兩個(gè)數(shù)丟掉,然后加起來(lái)求平均值。但是我這里因?yàn)镈MA的深度為128級(jí),也就是四個(gè)通道分別采樣了128次,大家都知道,數(shù)據(jù)越多,求平均值就越準(zhǔn)確,所以我就沒(méi)有采用什么排序法了,直接給他們分別求平均值,具體如下:

#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當(dāng)前AD_0值:0x%x,電壓值:%d.%d%dVnr",

Valu1,((Valu1*100/4096)*33)/1000,((Valu1*100/4096)*33)%1000/100,((Valu1*100/4096)*33)%100/10);

Delay(100000);

printf("rn當(dāng)前AD_1值:0x%x,電壓值:%d.%d%dVnr",

Valu2,((Valu2*100/4096)*33)/1000,((Valu2*100/4096)*33)%1000/100,((Valu2*100/4096)*33)%100/10);

Delay(100000);

printf("rn當(dāng)前AD_2值:0x%x,電壓值:%d.%d%dVnr",

Valu3,((Valu3*100/4096)*33)/1000,((Valu3*100/4096)*33)%1000/100,((Valu3*100/4096)*33)%100/10);

Delay(100000);

printf("rn當(dāng)前AD_3值:0x%x,電壓值:%d.%d%dVnr",

Valu4,((Valu4*100/4096)*33)/1000,((Valu4*100/4096)*33)%1000/100,((Valu4*100/4096)*33)%100/10);

Delay(100000);

 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在嵌入式開發(fā)中,STM32的時(shí)鐘系統(tǒng)因其靈活性和復(fù)雜性成為開發(fā)者關(guān)注的焦點(diǎn)。然而,看似簡(jiǎn)單的時(shí)鐘配置背后,隱藏著諸多易被忽視的陷阱,輕則導(dǎo)致系統(tǒng)不穩(wěn)定,重則引發(fā)硬件損壞。本文從時(shí)鐘源選擇、PLL配置、總線時(shí)鐘分配等關(guān)鍵環(huán)...

關(guān)鍵字: STM32 時(shí)鐘系統(tǒng)

在嵌入式系統(tǒng)開發(fā)中,STM32系列微控制器的內(nèi)部溫度傳感器因其低成本、高集成度特性,廣泛應(yīng)用于設(shè)備自檢、環(huán)境監(jiān)測(cè)等場(chǎng)景。然而,受芯片工藝差異和電源噪聲影響,其原始數(shù)據(jù)存在±1.5℃的固有誤差。本文從硬件配置、校準(zhǔn)算法、軟...

關(guān)鍵字: STM32 溫度傳感器

在能源效率與智能化需求雙重驅(qū)動(dòng)下,AC-DC轉(zhuǎn)換器的數(shù)字控制技術(shù)正經(jīng)歷從傳統(tǒng)模擬方案向全數(shù)字架構(gòu)的深刻變革?;赟TM32微控制器的PFM(脈沖頻率調(diào)制)+PWM(脈沖寬度調(diào)制)混合調(diào)制策略,結(jié)合動(dòng)態(tài)電壓調(diào)整(Dynam...

關(guān)鍵字: AC-DC STM32

《帶得走的智能制造》暑期課程圓滿落幕 北京2025年7月25日 /美通社/ -- 近日,由國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證機(jī)構(gòu)德國(guó)萊茵TÜV大中華區(qū)(以下簡(jiǎn)稱"TÜV萊茵")與北京...

關(guān)鍵字: 智能制造 BSP DMA 信息安全

當(dāng)前智能家居產(chǎn)品需求不斷增長(zhǎng) ,在這一背景下 ,對(duì)現(xiàn)有澆花裝置缺陷進(jìn)行了改進(jìn) ,設(shè)計(jì)出基于STM32單片機(jī)的全 自動(dòng)家用澆花機(jī)器人。該設(shè)計(jì)主要由機(jī)械結(jié)構(gòu)和控制系統(tǒng)構(gòu)成 ,機(jī)械結(jié)構(gòu)通過(guò)麥克納姆輪底盤與噴灑裝置的結(jié)合實(shí)現(xiàn)機(jī)器...

關(guān)鍵字: STM32 麥克納姆輪 安全可靠 通過(guò)性強(qiáng)

用c++編程似乎是讓你的Arduino項(xiàng)目起步的障礙嗎?您想要一種更直觀的微控制器編程方式嗎?那你需要了解一下Visuino!這個(gè)圖形化編程平臺(tái)將復(fù)雜電子項(xiàng)目的創(chuàng)建變成了拖動(dòng)和連接塊的簡(jiǎn)單任務(wù)。在本文中,我們將帶您完成使...

關(guān)鍵字: Visuino Arduino ESP32 STM32

基于STM32與LoRa技術(shù)的無(wú)線傳感網(wǎng)絡(luò)憑借其低功耗、廣覆蓋、抗干擾等特性,成為環(huán)境監(jiān)測(cè)、工業(yè)自動(dòng)化等場(chǎng)景的核心解決方案。然而,如何在復(fù)雜電磁環(huán)境中實(shí)現(xiàn)高效休眠調(diào)度與動(dòng)態(tài)信道優(yōu)化,成為提升網(wǎng)絡(luò)能效與可靠性的關(guān)鍵挑戰(zhàn)。本...

關(guān)鍵字: STM32 LoRa

在實(shí)時(shí)控制系統(tǒng)、高速通信協(xié)議處理及高精度數(shù)據(jù)采集等對(duì)時(shí)間敏感的應(yīng)用場(chǎng)景中,中斷響應(yīng)延遲的優(yōu)化直接決定了系統(tǒng)的可靠性與性能上限。STM32系列微控制器憑借其靈活的嵌套向量中斷控制器(NVIC)、多通道直接內(nèi)存訪問(wèn)(DMA)...

關(guān)鍵字: STM32 DMA

數(shù)字電源技術(shù)向高功率密度、高效率與高動(dòng)態(tài)響應(yīng)方向加速演進(jìn),STM32微控制器憑借其基于DSP庫(kù)的算法加速能力與對(duì)LLC諧振變換器的精準(zhǔn)控制架構(gòu),成為優(yōu)化電源動(dòng)態(tài)性能的核心平臺(tái)。相較于傳統(tǒng)模擬控制或通用型數(shù)字控制器,STM...

關(guān)鍵字: STM32 數(shù)字電源

STM32微控制器憑借其針對(duì)電機(jī)控制場(chǎng)景的深度優(yōu)化,成為高精度、高可靠性驅(qū)動(dòng)系統(tǒng)的核心選擇。相較于通用型MCU,STM32在電機(jī)控制領(lǐng)域的核心優(yōu)勢(shì)集中體現(xiàn)在FOC(磁場(chǎng)定向控制)算法的硬件加速引擎與PWM死區(qū)時(shí)間的動(dòng)態(tài)補(bǔ)...

關(guān)鍵字: STM32 電機(jī)控制
關(guān)閉