0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈CW32系列模数转换器(ADC)

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-10-25 15:43 次阅读

模数转换器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 的转换时序如下图所示:

wKgZomUDxUWAZYCDAADC3UVV5Hc265.png

向 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;也可通过其他外设来触发。

wKgaomR4F26ATOmXAAEQE8ffK-g415.jpg

五、实际案例

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。

wKgZomR4F26AI9RnAABLqfkip4g331.jpg

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    95

    文章

    5651

    浏览量

    539458
  • 模数转换器
    +关注

    关注

    25

    文章

    2299

    浏览量

    126005
收藏 人收藏

    评论

    相关推荐

    【有那么点详细的CW32学习笔记】模数转换器

    本章为大家带来模数转换器ADC)的使用教学,按照惯例,我们先来说一下模数转换器本身。 首先是功能,模数转换器接收电压信号并输出一个数字信号,该数字信号是一个数字,这个数字指示了电压信
    的头像 发表于 02-29 09:41 222次阅读
    【有那么点详细的<b class='flag-5'>CW32</b>学习笔记】<b class='flag-5'>模数转换器</b>

    模数转换器结束信号的四种处理方式

    模数转换器结束信号的四种处理方式  模数转换器ADC)是将模拟信号转换为数字信号的设备。在ADC操作过程中,结束信号非常重要,它指示了
    的头像 发表于 02-03 16:41 370次阅读

    如何判断一个计量芯片是多路计量芯片? 是不是计量芯片中模数转换器ADC的个数多余两个就是多路的?

    1如何判断一个计量芯片是多路计量芯片? 是不是计量芯片中模数转换器ADC的个数多余两个就是多路的? 例如如果计量芯片中有三个模数转换器ADC是不是就是两路的?
    发表于 12-26 06:15

    AD4112模数转换器(ADC)手册

    电子发烧友网站提供《AD4112模数转换器(ADC)手册.pdf》资料免费下载
    发表于 11-22 15:05 1次下载
    AD4112<b class='flag-5'>模数转换器</b>(<b class='flag-5'>ADC</b>)手册

    AD4111模数转换器(ADC)手册

    电子发烧友网站提供《AD4111模数转换器(ADC)手册.pdf》资料免费下载
    发表于 11-22 15:03 0次下载
    AD4111<b class='flag-5'>模数转换器</b>(<b class='flag-5'>ADC</b>)手册

    ADC模数转换器的延时原理

    ADC模数转换器的延时原理主要与其内部的采样和保持电路、比较器、计数器等有关。以下是一般的ADC转换延时过程:
    的头像 发表于 11-16 15:59 398次阅读

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 335次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用

    直方图测试模数转换器(ADC)介绍

    直方图测试是确定模数转换器ADC)静态参数的最流行方法之一。
    的头像 发表于 10-17 15:58 920次阅读
    直方图测试<b class='flag-5'>模数转换器</b>(<b class='flag-5'>ADC</b>)介绍

    使用STM8S微控制模数转换器

    本应用说明的目的是解释如何使用模数转换器在许多STM8S微控制系列设备中实现。它提供了有用的关于如何配置ADC寄存和微控制
    发表于 10-10 07:48

    adc模数转换器的作用

    ADC模数转换器的作用 ADC,全称为Analog-to-Digital Converter,即模数转换器,是一种将模拟信号转换为数字信号的
    的头像 发表于 09-02 10:13 1431次阅读

    STM32模数转换器 (ADC)介绍

    STM32F4xx系列提供的12位ADC是逐次逼近型模数转换器
    发表于 07-22 16:37 1876次阅读
    STM32<b class='flag-5'>模数转换器</b> (<b class='flag-5'>ADC</b>)介绍

    ADC模数转换器介绍

    模数转换器(analog to Digital Converter,简称ADC)是一种数据转换器,它通过将模拟信号编码为二进制代码,使数字电路能够与现实世界进行接口。
    发表于 06-26 11:44 2942次阅读
    <b class='flag-5'>ADC</b><b class='flag-5'>模数转换器</b>介绍

    交错式模数转换器ADC的原理是什么?

    在当今的许多细分市场,交错式模数转换器(ADC)在许多应用中都具有多项优势。在通信基础设施中,存在着一种推动因素,使ADC的采样速率不断提高,以便支持多频段、多载波无线电
    发表于 06-02 10:37 397次阅读
    交错式<b class='flag-5'>模数转换器</b><b class='flag-5'>ADC</b>的原理是什么?

    CW32系列模数转换器ADC

    模数转换器ADC)的主要功能是将模拟量转换为数字量,方便MCU进行处理。下面以CW32L083为例介绍CW
    发表于 06-01 11:59

    CW32饭盒派开发板试用体验】一起来计算CW32内部温度

    本文主要读取CW32内部的温度传感数据,并将其转换成摄氏温度数据。 一、数据读取 (一)内部温度计ADC 根据芯片手册,CW32F030内
    发表于 05-15 23:29