模數轉換器(ADC)的主要功能是將模擬量轉換為數字量,方便MCU進行處理。下面以CW32L083為例介紹CW系列的模數轉換器的特點和功能,并提供演示實例。
一、概述
CW32L083 內部集成一個 12 位精度、最高 1M SPS 轉換速度的逐次逼近型模數轉換器 (SAR ADC),最多可將 16 路模擬信號轉換為數字信號。現實世界中的絕大多數信號都是模擬量,如光、電、聲、圖像信號等,都要由 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
+關注
關注
100文章
7511瀏覽量
555912 -
模數轉換器
+關注
關注
26文章
4013瀏覽量
130100
發布評論請先 登錄
模數轉換器ADC充電樁解決方案
深入剖析ADC080x系列8位模數轉換器
ADC121S101 模數轉換器技術規格與應用總結
分享Sigma Delta型模數轉換器(高精度ADC工作原理)
ADC3569 單通道高速模數轉換器(ADC)產品文檔總結
Texas Instruments ADS868xW 16 位 SAR 模數轉換器數據手冊
Analog Devices Inc. AD9217射頻模數轉換器數據手冊
Analog Devices Inc. AD4116模數轉換器 (ADC)數據手冊
淺談CW32系列模數轉換器(ADC)
評論