嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo) 課件 第7-10章 模數(shù)轉(zhuǎn)換器ADC-直接存儲器存取DMA_第1頁
嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo) 課件 第7-10章 模數(shù)轉(zhuǎn)換器ADC-直接存儲器存取DMA_第2頁
嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo) 課件 第7-10章 模數(shù)轉(zhuǎn)換器ADC-直接存儲器存取DMA_第3頁
嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo) 課件 第7-10章 模數(shù)轉(zhuǎn)換器ADC-直接存儲器存取DMA_第4頁
嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo) 課件 第7-10章 模數(shù)轉(zhuǎn)換器ADC-直接存儲器存取DMA_第5頁
已閱讀5頁,還剩237頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介

☆7.2ADC配置

☆7.3ADC庫函數(shù)

☆7.3.1ADCHAL庫函數(shù)7.3.2ADCLL庫函數(shù)7.4ADC設(shè)計實例

7.4.1軟件設(shè)計與實現(xiàn)

7.4.2軟件調(diào)試與分析前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)2025/6/5第7章模數(shù)轉(zhuǎn)換器ADC模數(shù)轉(zhuǎn)換器ADC的主要功能是將模擬信號轉(zhuǎn)化為數(shù)字信號以便于微控制器進行數(shù)據(jù)處理ADC按轉(zhuǎn)換原理分為逐次比較型、雙積分型和S-D型逐次比較型ADC通過逐次比較將模擬信號轉(zhuǎn)化為數(shù)字信號轉(zhuǎn)換速度快,但精度較低,是最常用的ADC雙積分型ADC通過兩次積分將模擬信號轉(zhuǎn)化為數(shù)字信號,精度高,抗干擾能力強,但速度較慢,主要用于萬用表等測量儀器

S-D型ADC具有逐次比較型和雙積分型的雙重優(yōu)點,正在逐步廣泛地得到應(yīng)用前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介STM32ADC主要由輸入選擇和掃描控制、12位逐次逼近模數(shù)轉(zhuǎn)換器(SARADC)、觸發(fā)使能和邊沿選擇、數(shù)據(jù)寄存器、AHB接口和模擬看門狗等部分組成。輸入通道多達19個,可以實現(xiàn)單次、連續(xù)、掃描和不連續(xù)轉(zhuǎn)換,轉(zhuǎn)換結(jié)果存放在16位數(shù)據(jù)寄存器中,可以通過AHB接口讀取。轉(zhuǎn)換通道分為規(guī)則通道和注入通道兩組。規(guī)則通道由最多16個通道組成,按順序轉(zhuǎn)換,通道數(shù)和轉(zhuǎn)換順序存放在規(guī)則序列寄存器SQR1~SQR4中,轉(zhuǎn)換結(jié)果存放在規(guī)則通道數(shù)據(jù)寄存器DR中。前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介STM32ADC主要由輸入選擇和掃描控制、12位逐次逼近模數(shù)轉(zhuǎn)換器(SARADC)、觸發(fā)使能和邊沿選擇、數(shù)據(jù)寄存器、AHB接口和模擬看門狗等部分組成。輸入通道多達19個,可以實現(xiàn)單次、連續(xù)、掃描和不連續(xù)轉(zhuǎn)換,轉(zhuǎn)換結(jié)果存放在16位數(shù)據(jù)寄存器中,可以通過AHB接口讀取。轉(zhuǎn)換通道分為規(guī)則通道和注入通道兩組。注入通道由最多4個通道組成,可插入轉(zhuǎn)換,通道數(shù)和轉(zhuǎn)換順序存放在注入序列寄存器JSQR中,轉(zhuǎn)換結(jié)果分別存放在注入通道數(shù)據(jù)寄存器JDR1~JDR4中。前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC使用的GPIO引腳前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC使用的GPIO引腳(續(xù))前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC寄存器前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC寄存器(續(xù))前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC中斷和狀態(tài)寄存器(ISR)ADC控制寄存器(CR)前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC配置寄存器(CFGR)ADC采樣時間寄存器1(SMPR1)ADC采樣時間寄存器2(SMPR2)前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:34第7章模數(shù)轉(zhuǎn)換器ADC7.1ADC簡介ADC采樣時間周期數(shù)ADC規(guī)則序列寄存器1(SQR1)前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)08:59:347.2ADC配置PB12:ADC1_IN11,模擬模式,無上拉/下拉,接R38PB14:ADC1_IN5,模擬模式,無上拉/下拉,接MCP407嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置LowPowerAutoWait:Enable

(參見表7.5,僅用于HAL,LL不影響)NumberOfConversions:2

(ScanConversionMode變?yōu)镋nabled)Rank1的Channel:Channel11Rank2的SimplingTime:92.5Cycles

(過小時轉(zhuǎn)換結(jié)果將受Rank1影響)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:34

7.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:/*HAL工程*/hadc1.Instance=ADC1;hadc1.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;

hadc1.Init.Resolution=ADC_RESOLUTION_12B;hadc1.Init.DataAlign=ADC_DATAALIGN_RIGHT;hadc1.Init.ScanConvMode=ADC_SCAN_ENABLE;hadc1.Init.EOCSelection=ADC_EOC_SINGLE_CONV;

hadc1.Init.NbrOfConversion=2;

if(HAL_ADC_Init(&hadc1)!=HAL_OK)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:

/*HAL工程*/sConfig.Channel=ADC_CHANNEL_11;

sConfig.Rank=ADC_REGULAR_RANK_1;

sConfig.SamplingTime=ADC_SAMPLETIME_2CYCLES_5;

sConfig.SingleDiff=ADC_SINGLE_ENDED;

sConfig.OffsetNumber=ADC_OFFSET_NONE;

sConfig.Offset=0;

if(HAL_ADC_ConfigChannel(&hadc1,&sConfig)!=HAL_OK)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:

/*HAL工程*/__HAL_RCC_ADC12_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin=GPIO_PIN_12|GPIO_PIN_14;

GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull=GPIO_NOPULL;

HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:

/*LL工程*/LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);GPIO_InitStruct.Pin=LL_GPIO_PIN_12;GPIO_InitStruct.Mode=LL_GPIO_MODE_ANALOG;GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;LL_GPIO_Init(GPIOB,&GPIO_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:

/*LL工程*/ADC_InitStruct.Resolution=LL_ADC_RESOLUTION_12B;ADC_InitStruct.DataAlignment=LL_ADC_DATA_ALIGN_RIGHT;ADC_InitStruct.LowPowerMode=LL_ADC_LP_AUTOWAIT;

LL_ADC_Init(ADC1,&ADC_InitStruct);ADC_REG_InitStruct.TriggerSource=LL_ADC_REG_TRIG_SOFTWARE;ADC_REG_InitStruct.ContinuousMode=LL_ADC_REG_CONV_SINGLE;ADC_REG_InitStruct.DMATransfer=LL_ADC_REG_DMA_TRANSFER_NONE;ADC_REG_InitStruct.Overrun=LL_ADC_REG_OVR_DATA_PRESERVED;

LL_ADC_REG_Init(ADC1,&ADC_REG_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.2ADC配置ADC配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\adc.c和LL\Core\Src\adc.c中,其中主要代碼如下:

/*LL工程*/

LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,

LL_ADC_CHANNEL_11);

LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_11,

LL_ADC_SAMPLINGTIME_2CYCLES_5);

LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_11,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)基本的ADCHAL庫函數(shù)在stm32g4xx_hal_adc.h中聲明如下:HAL_StatusTypeDefHAL_ADC_Init(ADC_HandleTypeDef

*hadc);HAL_StatusTypeDefHAL_ADC_ConfigChannel(ADC_HandleTypeDef

*hadc,

ADC_ChannelConfTypeDef

*sConfig);HAL_StatusTypeDefHAL_ADCEx_Calibration_Start

(ADC_HandleTypeDef

*hadc,uint32_tSingleDiff);HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef*hadc);HAL_StatusTypeDefHAL_ADC_PollForConversion

(ADC_HandleTypeDef*hadc,

uint32_tTimeout);uint32_tHAL_ADC_GetValue(ADC_HandleTypeDef*hadc);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(1)初始化ADCHAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef

*hadc);參數(shù)說明:

★hadc:ADC句柄,在stm32g4xx_hal_adc.h中定義如下:

typedefstruct__ADC_HandleTypeDef

{

ADC_TypeDef *Instance; /*ADC名稱*/

ADC_InitTypeDef Init; /*ADC初始化參數(shù)*/

……………………

}ADC_HandleTypeDef;嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(1)初始化ADCHAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef

*hadc);其中ADC_InitTypeDef在stm32g4xx_hal_adc.h中定義如下:

typedefstruct

{

uint32_tClockPrescaler; /*時鐘預(yù)分頻*/uint32_tResolution; /*分辨率*/

uint32_tDataAlign; /*數(shù)據(jù)對齊*/

…………………

}ADC_InitTypeDef;返回值:HAL狀態(tài),HAL_OK等。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(2)配置ADC通道HAL_StatusTypeDefHAL_ADC_ConfigChannel(ADC_HandleTypeDef

*hadc,

ADC_ChannelConfTypeDef

*sConfig);參數(shù)說明:

★hadc:ADC句柄

★sConfig:ADC配置參數(shù),在stm32g4xx_hal_adc.h中定義如下:

typedefstruct

{

uint32_tChannel; /*通道號*/

uint32_tRank; /*順序號*/

uint32_tSamplingTime; /*采樣時間*/……………………

}ADC_ChannelConfTypeDef;嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(2)配置ADC通道HAL_StatusTypeDefHAL_ADC_ConfigChannel(ADC_HandleTypeDef

*hadc,

ADC_ChannelConfTypeDef

*sConfig);其中Channel、Rank和SamplingTime在stm32g4xx_hal_adc.h中定義如下:

#defineADC_CHANNEL_0 (LL_ADC_CHANNEL_0)

………………

#defineADC_CHANNEL_18 (LL_ADC_CHANNEL_18)

#defineADC_REGULAR_RANK_1 (LL_ADC_REG_RANK_1)

………………

#defineADC_REGULAR_RANK_16 (LL_ADC_REG_RANK_16)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(2)配置ADC通道HAL_StatusTypeDefHAL_ADC_ConfigChannel(ADC_HandleTypeDef

*hadc,

ADC_ChannelConfTypeDef

*sConfig);其中Channel、Rank和SamplingTime在stm32g4xx_hal_adc.h中定義如下:

#defineADC_SAMPLETIME_2CYCLE_5 (LL_ADC_SAMPLINGTIME_2CYCLES_5)

………………

#defineADC_SAMPLETIME_640CYCLES_5

(LL_ADC_SAMPLINGTIME_640CYCLES_5)返回值:HAL狀態(tài),HAL_OK等。從上述定義可以看出:ADCHAL使用了ADCLL。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(3)完成ADC校準(zhǔn)HAL_StatusTypeDefHAL_ADCEx_Calibration_Start

(ADC_HandleTypeDef*hadc,uint32_tSingleDiff);參數(shù)說明:

★hadc:ADC句柄

★SingleDiff:單端(ADC_SINGLE_ENDED)或差分(ADC_DIFFERENTIAL_ENDED)返回值:HAL狀態(tài),HAL_OK等。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(4)啟動ADC轉(zhuǎn)換HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef

*hadc);參數(shù)說明:

★hadc:ADC句柄。返回值:HAL狀態(tài),HAL_OK等。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(5)等待ADC轉(zhuǎn)換完成HAL_StatusTypeDefHAL_ADC_PollForConversion

(ADC_HandleTypeDef

*hadc,

uint32_tTimeout);參數(shù)說明:

★hadc:ADC句柄。

★Timeout:超時(ms)。返回值:HAL狀態(tài),HAL_OK等。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.1ADCHAL庫函數(shù)(6)獲取ADC轉(zhuǎn)換值uint32_tHAL_ADC_GetValue(ADC_HandleTypeDef

*hadc);參數(shù)說明:

★hadc:ADC句柄。返回值:ADC轉(zhuǎn)換值。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)基本的ADCLL庫函數(shù)在stm32g4xx_ll_adc.h中聲明如下:ErrorStatusLL_ADC_Init(ADC_TypeDef*ADCx,

LL_ADC_InitTypeDef*ADC_InitStruct);ErrorStatusLL_ADC_REG_Init(ADC_TypeDef*ADCx,

LL_ADC_REG_InitTypeDef*ADC_REG_InitStruct);voidLL_ADC_DisableDeepPowerDown(ADC_TypeDef*ADCx);voidLL_ADC_EnableInternalRegulator(ADC_TypeDef*ADCx);voidLL_ADC_REG_SetSequencerRanks(ADC_TypeDef*ADCx,

uint32_tRank,

uint32_tChannel);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)基本的ADCLL庫函數(shù)在stm32g4xx_ll_adc.h中聲明如下:voidLL_ADC_SetChannelSamplingTime(ADC_TypeDef*ADCx,

uint32_tChannel,uint32_tSamplingTime);voidLL_ADC_StartCalibration(ADC_TypeDef*ADCx,

uint32_tSingleDiff);uint32_tLL_ADC_IsCalibrationOnGoing(ADC_TypeDef*ADCx);voidLL_ADC_Enable(ADC_TypeDef*ADCx);voidLL_ADC_REG_StartConversion(ADC_TypeDef*ADCx);uint32_tLL_ADC_IsActiveFlag_EOC(ADC_TypeDef*ADCx);uint16_tLL_ADC_REG_ReadConversionData12(ADC_TypeDef*ADCx);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(1)初始化ADCErrorStatusLL_ADC_REG_Init(ADC_TypeDef

*ADCx,

LL_ADC_REG_InitTypeDef

*ADC_REG_InitStruct);參數(shù)說明:

★ADCx:ADC名稱,取值是ADC1或ADC2等

★ADC_REG_InitStruct:ADC規(guī)則通道初始化參數(shù)結(jié)構(gòu)體指針,初始化參數(shù)結(jié)構(gòu)體在stm32g40x_adc.h中定義如下:嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(1)初始化ADCErrorStatusLL_ADC_REG_Init(ADC_TypeDef

*ADCx,

LL_ADC_REG_InitTypeDef

*ADC_REG_InitStruct);

typedefstruct

{

uint32_tResolution; /*分辨率*/

uint32_tDataAlignment; /*數(shù)據(jù)對齊*/

uint32_tLowPowerMode; /*低功耗模式*/

}LL_ADC_InitTypeDef;返回值:錯誤狀態(tài),0-SUCCESS。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(2)初始化ADC規(guī)則通道ErrorStatusLL_ADC_REG_Init(ADC_TypeDef

*ADCx,

LL_ADC_REG_InitTypeDef

*ADC_REG_InitStruct);參數(shù)說明:

★ADCx:ADC名稱,取值是ADC1或ADC2等

★ADC_REG_InitStruct:ADC規(guī)則通道初始化參數(shù)結(jié)構(gòu)體指針,初始化參數(shù)結(jié)構(gòu)體在stm32g40x_adc.h中定義如下:嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(2)初始化ADC規(guī)則通道ErrorStatusLL_ADC_REG_Init(ADC_TypeDef

*ADCx,

LL_ADC_REG_InitTypeDef

*ADC_REG_InitStruct);

typedefstruct

{

uint32_tTriggerSource; /*觸發(fā)源*/

uint32_tSequencerLength; /*序列長度*/

uint32_tSequencerDiscont; /*序列不連續(xù)模式*/

………………}LL_ADC_REG_InitTypeDef;返回值:錯誤狀態(tài),0-SUCCESS。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(3)禁止深度關(guān)斷voidLL_ADC_DisableDeepPowerDown(ADC_TypeDef*ADCx);參數(shù)說明:

★ADCx:ADC名稱。

(4)允許內(nèi)部穩(wěn)壓器voidLL_ADC_EnableInternalRegulator(ADC_TypeDef*ADCx);參數(shù)說明:

★ADCx:ADC名稱。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(5)設(shè)置規(guī)則通道voidLL_ADC_SetSequencerRanks(ADC_TypeDef*ADCx,uint32_tRank,

uint32_tChannel);參數(shù)說明:

★ADCx:ADC名稱。

★Rank:順序(1~16)。

★Channel:ADC通道(0~18)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(6)設(shè)置采樣時間voidLL_ADC_SetChannelSamplingTime(ADC_TypeDef

*ADCx,

uint32_tChannel,uint32_tSamplingTime);參數(shù)說明:

★ADCx:ADC名稱。

★Channel:ADC通道(0~18)。

★SamplingTime:采樣時間。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)

(7)啟動校準(zhǔn)voidLL_ADC_StartCalibration(ADC_TypeDef*ADCx,

uint32_tSingleDiff);參數(shù)說明:

★ADCx:ADC名稱。

★SingleDiff:單端(LL_ADC_SINGLE_ENDED)

或差分(LL_ADC_DIFFERENTIAL_ENDED)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)

(8)獲取校準(zhǔn)狀態(tài)uint32_tLL_ADC_IsCalibrationOnGoing(ADC_TypeDef*ADCx);參數(shù)說明:

★ADCx:ADC名稱。返回值:0-校準(zhǔn)完成,1-校準(zhǔn)正在進行。(9)允許ADCvoidLL_ADC_Enable(ADC_TypeDef*ADCx);參數(shù)說明:

★ADCx:ADC名稱,取值是ADC1或ADC2等嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(10)啟動規(guī)則通道轉(zhuǎn)換voidLL_ADC_REG_StartConversion(ADC_TypeDef

*ADCx);參數(shù)說明:

★ADCx:ADC名稱(11)獲取EOC標(biāo)志uint32_tLL_ADC_IsActiveFlag_EOC(ADC_TypeDef

*ADCx);參數(shù)說明:

★ADCx:ADC名稱返回值:EOC標(biāo)志(0或1)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.3ADC庫函數(shù)7.3.2ADCLL庫函數(shù)(12)獲取轉(zhuǎn)換數(shù)據(jù)uint16_tLL_ADC_REG_ReadConversionData12(ADC_TypeDef*ADCx);參數(shù)說明:★ADCx:ADC名稱。返回值:轉(zhuǎn)換數(shù)據(jù)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例系統(tǒng)包括STM32MCU

(內(nèi)嵌SysTick定時器)按鍵、LEDLCD顯示屏UART接口24C02、MCP4017ADC1_IN5(PB14)

ADC1_IN11(PB12)

ADC2_IN15(PB15)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)下面編程實現(xiàn)用B1按鍵通過I2C1接口改變MCP4017的阻值,從而改變ADC1-IN5的輸入電壓,用R38改變ADC1-IN11的輸入電壓,用R37改變ADC2-IN15的輸入電壓,用ADC1采集兩路輸入電壓進行AD轉(zhuǎn)換,用ADC2采集一路輸入電壓進行AD轉(zhuǎn)換,轉(zhuǎn)換結(jié)果顯示在LCD上。ADC軟件設(shè)計與實現(xiàn)在I2C實現(xiàn)的基礎(chǔ)上修改完成:

●將“064_I2C”文件夾復(fù)制粘貼并重命名為“074_ADC”文件夾。

●將“Core/Src”文件夾中的“adc.c”復(fù)制粘貼到“074_ADC”文件夾,并在Keil中刪除“adc.c”前的路徑“../Core/Src/”,以方便修改。ADC的軟件設(shè)計與實現(xiàn)包括硬件接口設(shè)置、硬件接口函數(shù)和數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

CT117E-M4(V1.2)SPI接口和ADC公用PB12、PB14和PB15,為了保證系統(tǒng)正常工作,需要對硬件接口進行設(shè)置,具體步驟如下:

①將J11、J12和J15的1和2相連(PB14-ADC1_IN5,PB12-ADC1_IN11,PB15-ADC2_IN15)。

②對于HAL工程,在adc.c的MX_ADC1_Init()中將下列語句:

sConfig.Channel=ADC_CHANNEL_14;sConfig.Channel=ADC_CHANNEL_4;

修改為:sConfig.Channel=ADC_CHANNEL_11;sConfig.Channel=ADC_CHANNEL_5;嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置在adc.c的MX_ADC2_Init()中將下列語句:sConfig.Channel=ADC_CHANNEL_13;

修改為:sConfig.Channel=ADC_CHANNEL_15;在adc.c的HAL_ADC_MspInit()中注釋下列語句:

//GPIO_InitStruct.Pin=GPIO_PIN_3;

//GPIO_InitStruct.Mode=GPIO_MODE_ANALOG;

//GPIO_InitStruct.Pull=GPIO_NOPULL;

//HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

在adc.c的HAL_ADC_MspInit()中將下列語句:GPIO_InitStruct.Pin=GPIO_PIN_11;GPIO_InitStruct.Pin=GPIO_PIN_5;HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);

修改為(可以忽略,因為引腳的默認(rèn)模式是“模擬”):GPIO_InitStruct.Pin=GPIO_PIN_12|GPIO_PIN_14;GPIO_InitStruct.Pin=GPIO_PIN_15;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

③對于LL工程,在adc.c的MX_ADC1_Init()中注釋下列語句:

//GPIO_InitStruct.Pin=LL_GPIO_PIN_3;

//GPIO_InitStruct.Mode=LL_GPIO_MODE_ANALOG;

//GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;

//LL_GPIO_Init(GPIOA,&GPIO_InitStruct);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置在adc.c的MX_ADC1_Init()中將下列語句:

GPIO_InitStruct.Pin=LL_GPIO_PIN_11;LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,

LL_ADC_CHANNEL_14);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_14,LL_ADC_SAMPLINGTIME_2CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_14,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置在adc.c的MX_ADC1_Init()中將下列語句:

LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_2,

LL_ADC_CHANNEL_4);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_4,LL_ADC_SAMPLINGTIME_92CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_4,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

修改為:

GPIO_InitStruct.Pin=LL_GPIO_PIN_14;LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,

LL_ADC_CHANNEL_11);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_11,LL_ADC_SAMPLINGTIME_2CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_11,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_2,

LL_ADC_CHANNEL_5);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_5,LL_ADC_SAMPLINGTIME_92CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_5,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置在adc.c的MX_ADC2_Init()中將下列語句:

GPIO_InitStruct.Pin=LL_GPIO_PIN_5;LL_GPIO_Init(GPIOA,&GPIO_InitStruct);LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,

LL_ADC_CHANNEL_13);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_13,LL_ADC_SAMPLINGTIME_2CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_13,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(1)硬件接口設(shè)置

修改為:GPIO_InitStruct.Pin=LL_GPIO_PIN_15;LL_GPIO_Init(GPIOB,&GPIO_InitStruct);LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,

LL_ADC_CHANNEL_15);LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_15,LL_ADC_SAMPLINGTIME_2CYCLES_5);LL_ADC_SetChannelSingleDiff(ADC1,LL_ADC_CHANNEL_15,

LL_ADC_SINGLE_ENDED);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)接口函數(shù)設(shè)計與實現(xiàn)的步驟如下:

①在i2c.h中添加下列函數(shù)聲明:

voidMCP_Write(uint8_tucVal); /*MCP寫*/

②在i2c.c的EEPROM_Write()后添加下列代碼:

/*MCP寫*/

voidMCP_Write(uint8_tucVal)

{

/*HAL工程代碼*/

HAL_I2C_Master_Transmit(&hi2c1,0x5e,&ucVal,1,100);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

②在i2c.c的EEPROM_Write()后添加下列代碼:

/*MCP寫*/

voidMCP_Write(uint8_tucVal)

{

/*LL工程代碼*/

LL_I2C_HandleTransfer(I2C1,0x5e,LL_I2C_ADDRSLAVE_7BIT,1,

LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE);

while(!LL_I2C_IsActiveFlag_TXIS(I2C1)); /*等待發(fā)送就緒*/

LL_I2C_TransmitData8(I2C1,ucVal); /*發(fā)送數(shù)據(jù)*/

}嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

③在adc.h中添加下列代碼:

/*USERCODEBEGINPrototypes*/

voidADC1_Read(uint16_t*pusBuf); /*ADC1讀取*/

uint16_tADC2_Read(void); /*ADC2讀取*/

/*USERCODEENDPrototypes*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

④在adc.c中MX_ADC1_Init()的后部添加下列代碼:

/*USERCODEBEGINADC1_Init2*/

/*HAL工程代碼*/

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

/*LL工程代碼*/

LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);

while(LL_ADC_IsCalibrationOnGoing(ADC1));

LL_ADC_Enable(ADC1);

/*USERCODEENDADC1_Init2*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

⑤在adc.c中MX_ADC2_Init()的后部添加下列代碼:

/*USERCODEBEGINADC2_Init2*/

/*HAL工程代碼*/

HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);

/*LL工程代碼*/

LL_ADC_StartCalibration(ADC2,LL_ADC_SINGLE_ENDED);

while(LL_ADC_IsCalibrationOnGoing(ADC2));

LL_ADC_Enable(ADC2);/*USERCODEENDADC2_Init2*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

⑥在adc.c的后部添加下列代碼:

/*USERCODEBEGIN1*/

voidADC1_Read(uint16_t*pusBuf) /*ADC1讀取*/

{

/*HAL工程代碼*/

HAL_ADC_Start(&hadc1);

if(HAL_ADC_PollForConversion(&hadc1,10)==HAL_OK)

pusBuf[0]=HAL_ADC_GetValue(&hadc1);

if(HAL_ADC_PollForConversion(&hadc1,10)==HAL_OK)

pusBuf[1]=HAL_ADC_GetValue(&hadc1);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

⑥在adc.c的后部添加下列代碼:

/*USERCODEBEGIN1*/

voidADC1_Read(uint16_t*pusBuf) /*ADC1讀取*/

{

/*LL工程代碼*/

LL_ADC_REG_StartConversion(ADC1);

while(LL_ADC_IsActiveFlag_EOC(ADC1)==0);

pusBuf[0]=LL_ADC_REG_ReadConversionData12(ADC1);

while(LL_ADC_IsActiveFlag_EOC(ADC1)==0);

pusBuf[1]=LL_ADC_REG_ReadConversionData12(ADC1);

}嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

⑥在adc.c的后部添加下列代碼:

uint16_tADC2_Read(void) /*ADC2讀取*/

{

/*HAL工程代碼*/

HAL_ADC_Start(&hadc2);

if(HAL_ADC_PollForConversion(&hadc2,10)==HAL_OK)

returnHAL_ADC_GetValue(&hadc2);

else

return0;嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(2)接口函數(shù)設(shè)計與實現(xiàn)

⑥在adc.c的后部添加下列代碼:

uint16_tADC2_Read(void) /*ADC2讀取*/

{

/*LL工程代碼*/

LL_ADC_REG_StartConversion(ADC2);

while(LL_ADC_IsActiveFlag_EOC(ADC2)==0);

returnLL_ADC_REG_ReadConversionData12(ADC2);

}

/*USERCODEEND1*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

①在main.c中聲明下列全局變量:

uint8_tucMcp=0x0f; /*MCP值*/

uint16_tusAdc[3]; /*ADC轉(zhuǎn)換值*/

uint8_tucTadc; /*ADC刷新時間*/

②在main.c中聲明如下函數(shù):

voidADC_Proc(void); /*ADC處理*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

③在main()的初始化部分取消下列注釋:

//MX_ADC1_Init();

//MX_ADC2_Init();

④在main()的EEPROM_Write()后添加下列代碼:MCP_Write(ucMcp); /*MCP寫*/

⑤在while(1)中添加如下代碼:ADC_Proc(); /*ADC處理*/嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

⑥在KEY_Proc()的case1中添加下列代碼:ucMcp+=0x10;if(ucMcp==0x8f)ucMcp=0x0f;MCP_Write(ucMcp);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

⑦在LCD_Proc()中添加下列代碼:sprintf((char*)ucLcd,"R37:%04uB1:0x%02X",usAdc[2],ucMcp);LCD_DisplayStringLine(Line4,ucLcd);sprintf((char*)ucLcd,"R38:%04uMCP:%03u",usAdc[0],usAdc[1]);LCD_DisplayStringLine(Line5,ucLcd);嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

⑧在fputc()后添加下列代碼:

voidADC_Proc(void) /*ADC處理*/

{

if(ucTadc<100) /*100ms未到*/

return;

ucTadc=0;

ADC1_Read(usAdc);

usAdc[2]=ADC2_Read();

}嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.1軟件設(shè)計與實現(xiàn)(3)數(shù)據(jù)處理函數(shù)設(shè)計與實現(xiàn)處理函數(shù)設(shè)計與實現(xiàn)的步驟如下:

⑨在stm32g4xx_it.c中添加下列外部變量聲明:externuint8_tucTadc;

/*ADC刷新計時*/

在stm32g4xx_it.c的SysTick_Handler()中添加下列代碼:ucTadc++; /*ADC刷新計時*/編譯下載程序,旋轉(zhuǎn)電位器R37或R38,LCD上的顯示值從0000變化到4095。每按一下B1按鍵,B1后顯示值加0x10,加到0x7F返回0x0F,MCP后顯示值跟隨變化(2240~3730)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.2軟件調(diào)試與分析嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.2軟件調(diào)試與分析嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:347.4ADC設(shè)計實例7.4.2軟件調(diào)試與分析嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第7章模數(shù)轉(zhuǎn)換器ADC前頁

返回08:59:348.1TIM簡介

☆8.2TIM配置

☆8.3TIM庫函數(shù)

☆8.3.1TIMHAL庫函數(shù)8.3.2TIMLL庫函數(shù)8.4TIM設(shè)計實例

8.4.1軟件設(shè)計與實現(xiàn)

8.4.2軟件調(diào)試與分析前頁

返回第8章定時器TIM嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)2025/6/5STM32定時器除系統(tǒng)滴答定時器SysTick外,還有高級控制定時器TIM1/8、通用定時器TIM2~5、基本定時器TIM6/7、實時鐘RTC、獨立看門狗IWDG和窗口看門狗WWDG等高級控制定時器除了具有剎車輸入BKIN、互補輸出CHxN和重復(fù)次數(shù)計數(shù)器外與通用定時器的主要功能基本相同,兩者都包含基本定時器的功能實時鐘提供時鐘日歷的功能。獨立看門狗和窗口看門狗用來檢測和解決軟件錯誤引起的故障前頁

返回嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM08:59:348.1TIM簡介定時器主要由由時鐘控制、時基單元、輸入捕獲和輸出比較等部分組成時鐘控制包含觸發(fā)控制器、從模式控制器和編碼器接口等,可以選擇內(nèi)部時鐘(默認(rèn)值)、外部時鐘模式和內(nèi)部觸發(fā)

時基單元包含16位計數(shù)器CNT、預(yù)分頻器PSC、自動重裝載寄存器ARR和重復(fù)次數(shù)計數(shù)器RCR。計數(shù)器可以向上計數(shù)、向下計數(shù)或向上向下雙向計數(shù),計數(shù)器時鐘由預(yù)分頻器對多種時鐘源分頻得到,計數(shù)器初值來自自動重裝載寄存器,重復(fù)次數(shù)計數(shù)器實現(xiàn)重復(fù)計數(shù)。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:348.1TIM簡介時基單元是定時器的核心,也是基本定時器的主要功能單元。輸入捕獲包含輸入濾波器和邊沿檢測器、預(yù)分頻器和捕獲/比較寄存器等,可以捕獲計數(shù)器的值到捕獲/比較寄存器,也可以測量PWM信號的周期和脈沖寬度。輸出比較包含捕獲/比較寄存器、死區(qū)發(fā)生器DTG和輸出控制,可以輸出單脈沖,也可以輸出PWM信號。嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM使用的GPIO引腳嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM主要寄存器嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM主要寄存器(續(xù))嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM從模式控制寄存器(SMCR)TIM狀態(tài)寄存器(SR)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM捕獲/比較模式寄存器1(CCMR1,輸入捕獲模式)TIM捕獲/比較模式寄存器1(CCMR1,輸出比較模式)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:34第8章定時器TIM8.1TIM簡介TIM捕獲/比較使能寄存器(CCER)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)前頁

返回08:59:348.2TIM配置TIM1配置嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:348.2TIM配置TIM1配置

Prescaler(PSC-16bitsvalue):

169(170/(169+1)=1(MHz))

CounterPeriod(AutoReloadRegister-16bitsvalue):499(周期2kHz)

AutomaticOutputState: Enable(允許輸出)

PWMGenerationChannel1N的Pluse

(16bitsvalue):50(占空比10%)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:34

8.2TIM配置TIM2配置嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:348.2TIM配置TIM2配置嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:34

8.2TIM配置TIM2配置

Prescaler(PSC-16bitsvalue):

169(170/(169+1)=1(MHz))

CounterPeriod(AutoReloadRegister-32bitsvalue):4294967295

InputCaptureChannel1的PolaritySelection:FallingEdge

InputCaptureChannel2的PolaritySelection:RisingEdge嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:348.2TIM配置TIM3配置嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:348.2TIM配置TIM3配置

Prescaler(PSC-16bitsvalue):

169(170/(169+1)=1(MHz))

CounterPeriod(AutoReloadRegister-16bitsvalue):999(周期1kHz)

PWMGenerationChannel2的Pluse

(16bitsvalue):100(占空比10%)嵌入式設(shè)計與開發(fā)實訓(xùn)指導(dǎo)第8章定時器TIM前頁

返回08:59:34

8.2TIM配置TIM配置完成后生成的相應(yīng)HAL和LL初始化程序分別存放在HAL\Core\Src\tim.c和LL\Core\Src\tim.c中,其中主要代碼如下:/*HAL工程*/htim1.Instance=TIM1;

htim1.Init.Prescaler=169;htim1.Init.CounterMode=TIM_COUNTERMODE_UP;

htim1.Init.Period=499;htim1.Init.Clock

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論