模數轉換器(ADC)的主要功能是將模擬量轉換為數字量,方便MCU進行處理。下面以CW32L083為例介紹CW系列的模數轉換器的特點和功能,并提供演示實例。
一、概述
CW32L083 內部集成一個 12 位精度、最高 1M SPS 轉換速度的逐次逼近型模數轉換器 (SAR ADC),最多可將 16 路模擬信號轉換為數字信號?,F實世界中的絕大多數信號都是模擬量,如光、電、聲、圖像信號等,都要由 ADC 轉換成數字信號,才能由 MCU 進行數字化處理。
二、主要特性
? 12 位精度
? 可編程轉換速度,最高達 1M SPS
? 16 路輸入轉換通道:13 路外部引腳輸入 - 內置溫度傳感器 - 內置 BGR 1.2V 基準 - 1/3 VDDA 電源電壓
? 4 路參考電壓源(Vref):- VDDA 電源電壓 - ExRef(PB00)引腳電壓 - 內置 1.5V 參考電壓 - 內置 2.5V 參考電壓
? 采樣電壓輸入范圍:0 ~ Vref
多種轉換模式,全部支持轉換累加功能 - 單次轉換 - 多次轉換 - 連續轉換 - 序列掃描轉換 - 序列斷續轉換
? 支持單通道、序列通道兩種通道選擇,最大同時支持 8 個序列
? 支持輸入通道電壓閾值監測
? 內置信號跟隨器,可轉換高阻抗輸入信號
? 支持片內外設自動觸發 ADC 轉換
? 支持 ADC 轉換完成觸發 DMA
三、轉換時序
ADC 的轉換時序如下圖所示:
向 ADC 控制寄存器 ADC_CR0 的 EN 位域寫入 1,使能 ADC 模塊。
ADC_CR0.EN 由 0 變為 1 約 40μs 后 ADC_ISR.READY 標志位置 1,表示模擬電路初始化完成,可以開始進行 ADC 轉換。
向 ADC 啟動寄存器 ADC_START 的 START 位域寫入 1,啟動 ADC 轉換,轉換完成后硬件自動清零。
ADC 工作時鐘 ADCCLK,由系統時鐘 PCLK 經預分頻器分頻得到,通過控制寄存器 ADC_CR0 的 CLK 位域可選擇 1 ~ 128 分頻
四、工作模式
ADC 控制寄存器 ADC_CR0 的 MODE 位域配置 ADC 工作模式
啟動 ADC 轉換,可通過向 ADC 啟動寄存器 ADC_START 的 START 位域寫 1;也可通過其他外設來觸發。
五、實際案例
GTIM1定時器定時1S,定時器1S中斷觸發啟動ADC轉換,采樣AIN1,并通過GTIM2以PWM方波輸出ADC采樣值:PWM占空比50%,周期為1Hz-5000Hz,對應ADC的0-4095采樣值。
1.配置ADC測試IO口
voidADC_PortInit(void) { REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk);//打開GPIO時鐘 REGBITS_SET(CW_SYSCTRL->APBEN2,SYSCTRL_APBEN2_ADC_Msk);//打開ADC時鐘 PA01_ANALOG_ENABLE();//setPA01asAIN1INPUT }
2.LED初始化
voidLED_Init(void) { GPIO_InitTypeDefGPIO_InitStructure={0}; REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOC_Msk);//打開GPIO時鐘 /*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時鐘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時鐘 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時鐘 FLASH_SetLatency(FLASH_Latency_3); res=RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);//切換系統時鐘到PLL:64MHz。 ADC_PortInit();//配置ADC測試IO口 LED_Init();//LED初始化 PWM_PortInit(); GTIM_Init(); ADC_StructInit( ADC_InitStructure);//ADC默認值初始化 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;//配置單通道轉換模式 ADC_SingleChStructure.ADC_Chmux=ADC_ExInputCH1;//選擇ADC轉換通道 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外部中斷觸發源配置 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外部中斷觸發源啟動下一次ADC轉換 } }
6.實驗展示
通用定時器GTIM1定時1s自動觸發ADC模塊進行轉換,ADC通道為AIN1:PA01。
通用定時器GTIM2將AIN1的ADC采樣值轉換成頻率可變的PWM方波,占空比50%,使用PA05作為PWM輸出。ADC采樣值為0時,PWM方波頻率為1Hz;ADC采樣值為4095時,PWM方波頻率為5KHz。
來源:武漢芯源半導體
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
adc
+關注
關注
98文章
6495瀏覽量
544461 -
模數轉換器
+關注
關注
26文章
3200瀏覽量
126810
發布評論請先 登錄
相關推薦
評論