




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六到飛起活動方案
- 蘭州新區(qū)活動方案
- 關(guān)于減肥活動方案
- 關(guān)于地球活動日活動方案
- 青少年數(shù)字化環(huán)境中的心理健康變化特征
- 基于大數(shù)據(jù)與人工智能的網(wǎng)絡(luò)素養(yǎng)教育創(chuàng)新
- 激發(fā)鄉(xiāng)村居民參與調(diào)解的積極性與主動性
- 鄉(xiāng)村人才引進與本土資源的協(xié)同發(fā)展路徑
- 推進海綿城市建設(shè)實施方案
- 市場經(jīng)濟背景下審計監(jiān)督機制的應(yīng)對策略
- 國家公務(wù)員考試準(zhǔn)考證模板
- 設(shè)備采購質(zhì)量保證措施
- 機房設(shè)備安裝工程及移動通信工程施工工藝圖解
- 國內(nèi)生態(tài)工業(yè)園區(qū)發(fā)展分析
- YY/T 0292.1-1997醫(yī)用診斷X射線輻射防護器具第1部分:材料衰減性能的測定
- LY/T 1697-2017飾面木質(zhì)墻板
- GB/T 97.1-2002平墊圈A級
- GB/T 5121.27-2008銅及銅合金化學(xué)分析方法第27部分:電感耦合等離子體原子發(fā)射光譜法
- GB/T 1449-2005纖維增強塑料彎曲性能試驗方法
- 【空間分析】01基于ArcGIS污水處理廠選址分析
- 疊合板監(jiān)理實施細(xì)則
評論
0/150
提交評論