模數(shù)轉(zhuǎn)換器(ADC)的主要功能是將模擬量轉(zhuǎn)換為數(shù)字量,方便MCU進(jìn)行處理。下面以CW32L083為例介紹CW系列的模數(shù)轉(zhuǎn)換器的特點(diǎn)和功能,并提供演示實(shí)例。
一、概述
CW32L083 內(nèi)部集成一個(gè) 12 位精度、最高 1M SPS 轉(zhuǎn)換速度的逐次逼近型模數(shù)轉(zhuǎn)換器 (SAR ADC),最多可將 16 路模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)?,F(xiàn)實(shí)世界中的絕大多數(shù)信號(hào)都是模擬量,如光、電、聲、圖像信號(hào)等,都要由 ADC 轉(zhuǎn)換成數(shù)字信號(hào),才能由 MCU 進(jìn)行數(shù)字化處理。
二、主要特性
? 12 位精度
? 可編程轉(zhuǎn)換速度,最高達(dá) 1M SPS
? 16 路輸入轉(zhuǎn)換通道:13 路外部引腳輸入 - 內(nèi)置溫度傳感器 - 內(nèi)置 BGR 1.2V 基準(zhǔn) - 1/3 VDDA 電源電壓
? 4 路參考電壓源(Vref):- VDDA 電源電壓 - ExRef(PB00)引腳電壓 - 內(nèi)置 1.5V 參考電壓 - 內(nèi)置 2.5V 參考電壓
? 采樣電壓輸入范圍:0 ~ Vref
多種轉(zhuǎn)換模式,全部支持轉(zhuǎn)換累加功能 - 單次轉(zhuǎn)換 - 多次轉(zhuǎn)換 - 連續(xù)轉(zhuǎn)換 - 序列掃描轉(zhuǎn)換 - 序列斷續(xù)轉(zhuǎn)換
? 支持單通道、序列通道兩種通道選擇,最大同時(shí)支持 8 個(gè)序列
? 支持輸入通道電壓閾值監(jiān)測(cè)
? 內(nèi)置信號(hào)跟隨器,可轉(zhuǎn)換高阻抗輸入信號(hào)
? 支持片內(nèi)外設(shè)自動(dòng)觸發(fā) ADC 轉(zhuǎn)換
? 支持 ADC 轉(zhuǎn)換完成觸發(fā) DMA
三、轉(zhuǎn)換時(shí)序
ADC 的轉(zhuǎn)換時(shí)序如下圖所示:
向 ADC 控制寄存器 ADC_CR0 的 EN 位域?qū)懭?1,使能 ADC 模塊。
ADC_CR0.EN 由 0 變?yōu)?1 約 40μs 后 ADC_ISR.READY 標(biāo)志位置 1,表示模擬電路初始化完成,可以開始進(jìn)行 ADC 轉(zhuǎn)換。
向 ADC 啟動(dòng)寄存器 ADC_START 的 START 位域?qū)懭?1,啟動(dòng) ADC 轉(zhuǎn)換,轉(zhuǎn)換完成后硬件自動(dòng)清零。
ADC 工作時(shí)鐘 ADCCLK,由系統(tǒng)時(shí)鐘 PCLK 經(jīng)預(yù)分頻器分頻得到,通過控制寄存器 ADC_CR0 的 CLK 位域可選擇 1 ~ 128 分頻
四、工作模式
ADC 控制寄存器 ADC_CR0 的 MODE 位域配置 ADC 工作模式
啟動(dòng) ADC 轉(zhuǎn)換,可通過向 ADC 啟動(dòng)寄存器 ADC_START 的 START 位域?qū)?1;也可通過其他外設(shè)來觸發(fā)。
五、實(shí)際案例
GTIM1定時(shí)器定時(shí)1S,定時(shí)器1S中斷觸發(fā)啟動(dòng)ADC轉(zhuǎn)換,采樣AIN1,并通過GTIM2以PWM方波輸出ADC采樣值:PWM占空比50%,周期為1Hz-5000Hz,對(duì)應(yīng)ADC的0-4095采樣值。
1.配置ADC測(cè)試IO口
voidADC_PortInit(void) { REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk);//打開GPIO時(shí)鐘 REGBITS_SET(CW_SYSCTRL->APBEN2,SYSCTRL_APBEN2_ADC_Msk);//打開ADC時(shí)鐘 PA01_ANALOG_ENABLE();//setPA01asAIN1INPUT }
2.LED初始化
voidLED_Init(void) { GPIO_InitTypeDefGPIO_InitStructure={0}; REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOC_Msk);//打開GPIO時(shí)鐘 /*ConfiguretheGPIO_LEDpin*/ GPIO_InitStructure.Pins=GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Init(CW_GPIOC, GPIO_InitStructure); PC02_SETLOW();//LEDsareoff.PC03_SETLOW(); }
3.PWM IO初始化
voidPWM_PortInit(void) { GPIO_InitTypeDefGPIO_InitStructure={0}; /*PA5PWM輸出*/ __RCC_GPIOA_CLK_ENABLE(); /*ConfigurethePWMoutputpin*/ GPIO_InitStructure.Pins=GPIO_PIN_5; GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Init(CW_GPIOA, GPIO_InitStructure); PA05_AFx_GTIM2CH1(); }
4.GTIM初始化
voidGTIM_Init(void) { GTIM_InitTypeDefGTIM_InitStruct={0}; //REGBITS_SET(CW_SYSCTRL->APBEN1,SYSCTRL_APBEN1_GTIM1_Msk);//打開GTIM1 __RCC_GTIM1_CLK_ENABLE();//打開GTIM1時(shí)鐘GTIM_InitStruct.Mode=GTIM_MODE_TIME; GTIM_InitStruct.OneShotMode=GTIM_COUNT_CONTINUE; GTIM_InitStruct.Prescaler=GTIM_PRESCALER_DIV1024; GTIM_InitStruct.ReloadValue=62499ul;//T=1s. GTIM_InitStruct.ToggleOutState=DISABLE; GTIM_TimeBaseInit(CW_GTIM1, GTIM_InitStruct); GTIM_ITConfig(CW_GTIM1,GTIM_IT_OV,ENABLE); NVIC_ClearPendingIRQ(GTIM1_IRQn); NVIC_EnableIRQ(GTIM1_IRQn); NVIC_SetPriority(GTIM1_IRQn,0x03); __RCC_GTIM2_CLK_ENABLE();//打開GTIM2時(shí)鐘 GTIM_InitStruct.ReloadValue=0xFFFFu; GTIM_InitStruct.ToggleOutState=ENABLE; GTIM_TimeBaseInit(CW_GTIM2, GTIM_InitStruct); valuePeriod=GTIM_InitStruct.ReloadValue; valuePosWidth=valuePeriod>>1u; GTIM_OCInit(CW_GTIM2,GTIM_CHANNEL1,GTIM_OC_OUTPUT_PWM_HIGH); GTIM_SetCompare1(CW_GTIM2,valuePosWidth); GTIM_Cmd(CW_GTIM2,ENABLE); }
5.主程序main
uint16_tvalueAdc; uint32_tvalueAdcAcc; volatileuint8_tgFlagIrq; uint16_tgCntEoc=0; uint8_tcntSample; floatfTsDegree; uint32_tvaluePeriod; uint32_tvaluePosWidth; uint32_tvalueReload=0xFFFFu; intmain(void) { uint8_tres; ADC_InitTypeDefADC_InitStructure={0}; ADC_WdtTypeDefADC_WdtStructure={0}; ADC_SingleChTypeDefADC_SingleChStructure={0}; RCC_HSI_Enable(RCC_HSIOSC_DIV6);//以下從HSI切換到PLL RCC_PLL_Enable(RCC_PLLSOURCE_HSI,8000000UL,RCC_PLL_MUL_8); //開啟PLL,PLL源為HSI __RCC_FLASH_CLK_ENABLE();//打開FLASH時(shí)鐘 FLASH_SetLatency(FLASH_Latency_3); res=RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);//切換系統(tǒng)時(shí)鐘到PLL:64MHz。 ADC_PortInit();//配置ADC測(cè)試IO口 LED_Init();//LED初始化 PWM_PortInit(); GTIM_Init(); ADC_StructInit( ADC_InitStructure);//ADC默認(rèn)值初始化 ADC_WdtInit( ADC_WdtStructure);//ADC模擬看門狗通道初始化 ADC_InitStructure.ADC_ClkDiv=ADC_Clk_Div128;//ADCCLK:500KHz. ADC_InitStructure.ADC_InBufEn=ADC_BufEnable; ADC_InitStructure.ADC_SampleTime=ADC_SampTime10Clk; ADC_SingleChStructure.ADC_DiscardEn=ADC_DiscardNull;//配置單通道轉(zhuǎn)換模式 ADC_SingleChStructure.ADC_Chmux=ADC_ExInputCH1;//選擇ADC轉(zhuǎn)換通道 ADC_SingleChStructure.ADC_InitStruct=ADC_InitStructure; ADC_SingleChStructure.ADC_WdtStruct=ADC_WdtStructure; ADC_SingleChOneModeCfg( ADC_SingleChStructure); ADC_ITConfig(ADC_IT_EOC,ENABLE); ADC_EnableIrq(ADC_INT_PRIORITY); ADC_ClearITPendingAll(); ADC_Enable();//ADC使能 ADC_ExtTrigCfg(ADC_TRIG_GTIM1,ENABLE);//ADC外部中斷觸發(fā)源配置 GTIM_Cmd(CW_GTIM1,ENABLE); while(1) { while(!(gFlagIrq ADC_ISR_EOC_Msk)); gFlagIrq=0u;PC03_TOG(); valueAdc=ADC_GetConversionValue(); valueReload=((4095u*125000ul)/(4999u*valueAdc+4095u)+1)>>1; GTIM_SetCounterValue(CW_GTIM2,0u);//reset. GTIM_SetReloadValue(CW_GTIM2,valueReload); GTIM_SetCompare1(CW_GTIM2,valuePosWidth);//等待ADC外部中斷觸發(fā)源啟動(dòng)下一次ADC轉(zhuǎn)換 } }
6.實(shí)驗(yàn)展示
通用定時(shí)器GTIM1定時(shí)1s自動(dòng)觸發(fā)ADC模塊進(jìn)行轉(zhuǎn)換,ADC通道為AIN1:PA01。
通用定時(shí)器GTIM2將AIN1的ADC采樣值轉(zhuǎn)換成頻率可變的PWM方波,占空比50%,使用PA05作為PWM輸出。ADC采樣值為0時(shí),PWM方波頻率為1Hz;ADC采樣值為4095時(shí),PWM方波頻率為5KHz。
來源:武漢芯源半導(dǎo)體
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
adc
+關(guān)注
關(guān)注
98文章
6495瀏覽量
544460 -
模數(shù)轉(zhuǎn)換器
+關(guān)注
關(guān)注
26文章
3200瀏覽量
126810
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論