一、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输出
|