[开发板] CW32L010+ADC

[复制链接]
1669|7
 楼主| 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的时序图:

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

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

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

  10.     //配置ADC测试IO口
  11.     ADC_PortInit();
  12.    
  13.     ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div1;
  14.     ADC_InitStructure.ADC_ConvertMode = ADC_ConvertMode_Once;    // 单次采样
  15.     ADC_InitStructure.ADC_SQREns = ADC_SqrEns0to0;     // 单通道
  16.     ADC_InitStructure.ADC_IN0.ADC_InputChannel = ADC_InputCH1;
  17.     ADC_InitStructure.ADC_IN0.ADC_SampTime = ADC_SampTime9Clk;
  18.    
  19.     ADC_Init(&ADC_InitStructure);

  20.     ADC_ClearITPendingAll();

  21. #if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_INTERRUPTION)
  22.   
  23.     ADC_ITConfig(ADC_IT_EOC, ENABLE);  
  24.     NVIC_EnableIRQ(ADC_IRQn);
  25. #endif

  26.     //ADC使能
  27.     ADC_Enable();
  28.     ADC_SoftwareStartConvCmd(ENABLE);

  29.     while (1)
  30.     {
  31. #if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_POLLING)  
  32.         while (!(CW_ADC->ISR & ADC_ISR_EOC_Msk));
  33.         ADC_ClearITPendingBit(ADC_IT_EOC);
  34.         valueAdc = ADC_GetConversionValue(0);
  35. #ifndef SGL_CONTINUOUS_MODE_EN
  36.         ADC_SoftwareStartConvCmd(ENABLE); //启动下一次ADC转换
  37. #endif        
  38. #endif
  39.         
  40. #if (ADC_RETRIEVE_MODE == ADC_RETRIEVE_INTERRUPTION)
  41.         if (gFlagIrq & ADC_ISR_EOC_Msk)
  42.         {
  43.             valueAdc = ADC_GetConversionValue(0);
  44.             gFlagIrq = 0;
  45. #ifndef SGL_CONTINUOUS_MODE_EN            
  46.             ADC_SoftwareStartConvCmd(ENABLE); //启动下一次ADC转换
  47. #endif
  48.         }
  49. #endif
  50.         
  51.         PB02_TOG();
  52.         SysTickDelay(300);
  53.     }
  54. }

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

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

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

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




LOVEEVER 发表于 2024-12-11 17:23 | 显示全部楼层
ADC的采样保持时间可以独立配置,这为用户提供了更大的灵活性
tpgf 发表于 2025-1-7 08:40 | 显示全部楼层
CW32L010是一款基于M0+核的MCU,主频最高可达48MHz,最大64K flash,4K RAM
xiaoqizi 发表于 2025-1-8 15:45 | 显示全部楼层
该芯片内置了一个12位精度、最高2M SPS转换速度的逐次逼近型模数转换器,最多可将16路模拟信号转换为数字信号
木木guainv 发表于 2025-1-8 19:19 | 显示全部楼层
将用于ADC采集的GPIO引脚配置为模拟输入模式
Jiangxiaopi 发表于 2025-1-8 23:07 | 显示全部楼层
可以使用[size=0.875]ADC_InitTypeDef结构体来配置参考电压、采样时间、转换模式
荣陶陶 发表于 2025-1-9 11:23 | 显示全部楼层
在启动ADC转换后,需要等待转换完成。可以通过查询[size=0.875]ADC_GetFlagStatus函数的状态来判断转换是否完成
Zhiniaocun 发表于 2025-1-9 15:18 | 显示全部楼层
根据实际应用场景对采集到的数据进行处理,例如滤波、放大等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

263

主题

836

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部