打印
[开发板]

CW32L010+ADC

[复制链接]
75|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
meiyaolei|  楼主 | 2024-12-10 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GPIO, IO, gp, pi, AD, ADC, cw
一、CW32L010_ADC特性概述
分辨率与采样率:CW32L010的ADC具有12位分辨率,这意味着它能够提供较高的精度。同时,其采样率可达2M,这使得ADC能够快速地采集模拟信号,并将其转换为数字信号进行处理。
输入通道:CW32L010的ADC提供了多达16路的输入通道,这为用户提供了更多的选择,可以根据需要采集不同模拟信号。
采样保持时间:ADC的采样保持时间可以独立配置,这为用户提供了更大的灵活性,可以根据具体的应用场景来优化采样保持时间。
外部触发功能:CW32L010的ADC还支持外部触发功能,这意味着它可以在外部信号的触发下开始采样,这对于需要同步采样多个信号的应用场景非常有用。

模拟数字转换器(ADC)内置12位模数转换器具有多达14个外部通道和2个内部通道(温度传感器、BGR        1.2V电压基准),支持序列通道转换模式。在序列通道模式下,对选定的一组模拟输入自动转换。模拟看门狗功能可以精确地监控多个选定通道的转换电压。当转换电压位于所设定的阈值范围时会产生中断.

主要特性
● 12位精度
● 各序列通道转换速度可单独配置,最高达2M        SPS
● 16路输入转换通道‒ 14路外部引脚输入‒ 内置温度传感器‒ 内置BGR        1.2V基准
● VDD电源电压作为参考电压源(Vref)
● 采样电压输入范围:0        ~        Vref
● 支持序列通道转换模式‒ 支持单次和连续转换‒ 支持最多8个转换通道,每个通道可选16个转换源之一
● 支持输入通道电压阈值监测
● 支持片内外设自动触发ADC转换

二、框架


框图的说明:
触发方式:
软件触发:通过发送一个START信号来启动ADC的转换过程。同时,还需要一个名为ADC_TRIGGER的硬件触发信号来辅助完成触发。
硬件触发:仅需要设置ADC的一个标志位ADC_CR.EN为“1”,即可启动ADC的转换。

寄存器配置:
ADC_SQRCFR.SQRCH0~7:这些寄存器用于配置ADC的模拟输入通道。用户可以根据需要选择相应的通道进行采样。
ADC_SAMPLE:该寄存器用于读取ADC转换后的结果。
ADC_INO:用于控制ADC的启动过程。

关键组件:
ADC_IN13:作为温度传感器的一个输入端,用于采集温度信息。
SAR ADC:逐次逼近型模数转换器,是ADC的核心部分,负责将模拟信号转换为数字信号。
ADC_RESULT0~7:存储ADC转换后的结果,用户可以通过读取这些寄存器来获取转换后的数字值。

参考电压与电源:
1.2V基准电压:为ADC提供一个稳定的参考电压,用于确保转换的精度。
VDD:为整个ADC电路提供电源。

温度传感器与参考电压生成器:
温度传感器:图中展示了两个温度传感器,分别通过ADC_CR.TSEN和ADC_CR.BGREN进行控制。它们用于采集环境温度信息,并将模拟信号输入到ADC中进行转换。
参考电压生成器BGR:用于生成稳定的参考电压,该电压与1.2V基准电压一起,为ADC的转换过程提供稳定的参考。

时钟信号:
PCLK:为ADC提供时钟信号。图中还展示了时钟信号的分频选项,/1、/2、/4、/8等,用户可以根据需要选择合适的分频比例。
ADCCLK:ADC的工作时钟,其频率由PCLK经过分频后得到。


ADC的时序图:

三,代码
int main(void)
{
    ADC_InitTypeDef ADC_InitStructure = {0};

    // 系统时钟配置为8MHz
    SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV6);
    //LED初始化
    LED_Init();

    //使用sysTick作为1ms
    InitTick(8000000);

    //配置ADC测试IO口
    ADC_PortInit();
   
    ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div1;
    ADC_InitStructure.ADC_ConvertMode = ADC_ConvertMode_Once;    // 单次采样
    ADC_InitStructure.ADC_SQREns = ADC_SqrEns0to0;     // 单通道
    ADC_InitStructure.ADC_IN0.ADC_InputChannel = ADC_InputCH1;
    ADC_InitStructure.ADC_IN0.ADC_SampTime = ADC_SampTime9Clk;
   
    ADC_Init(&ADC_InitStructure);

    ADC_ClearITPendingAll();

#if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_INTERRUPTION)
  
    ADC_ITConfig(ADC_IT_EOC, ENABLE);  
    NVIC_EnableIRQ(ADC_IRQn);
#endif

    //ADC使能
    ADC_Enable();
    ADC_SoftwareStartConvCmd(ENABLE);

    while (1)
    {
#if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_POLLING)  
        while (!(CW_ADC->ISR & ADC_ISR_EOC_Msk));
        ADC_ClearITPendingBit(ADC_IT_EOC);
        valueAdc = ADC_GetConversionValue(0);
#ifndef SGL_CONTINUOUS_MODE_EN
        ADC_SoftwareStartConvCmd(ENABLE); //启动下一次ADC转换
#endif        
#endif
        
#if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_INTERRUPTION)
        if (gFlagIrq & ADC_ISR_EOC_Msk)
        {
            valueAdc = ADC_GetConversionValue(0);
            gFlagIrq = 0;
#ifndef SGL_CONTINUOUS_MODE_EN            
            ADC_SoftwareStartConvCmd(ENABLE); //启动下一次ADC转换
#endif
        }
#endif
        
        PB02_TOG();
        SysTickDelay(300);
    }
}

/**
* [url=home.php?mod=space&uid=247401]@brief[/url] LED I/O初始化
*
*/
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = { 0 };

    //打开GPIO时钟
    REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOB_Msk);

    /* Configure the GPIO_LED pin */
    GPIO_InitStructure.Pins = GPIO_PIN_2;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init(CW_GPIOB, &GPIO_InitStructure);

    //LEDs are off.
    PB02_SETLOW();   
}
四、ADC输出




使用特权

评论回复
沙发
LOVEEVER| | 2024-12-11 17:23 | 只看该作者
ADC的采样保持时间可以独立配置,这为用户提供了更大的灵活性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

171

主题

666

帖子

4

粉丝