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