CW32L012 16 路模拟信号转换为数字信号。现实世界中的绝大多数信号都是模拟量,如光、电、声、图像信号等,都要 内部集成 2 个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模数转换器(SAR ADC),最多可将 由 ADC 转换成数字信号,才能由 MCU 进行数字化处理。本篇将介绍如何能过饭盒派上的电位器进行ADC采集的验证。
1、饭盒派扩展板上的电位器接入的IO为PB0
2、先找到PB0对应的ADC通道,根据用户手册,其通道为8

【代码组织】
1、根据用户手,使用ADC的步骤如下:

2、根据以上步骤,我创建一个bsp_adc.c/h并添加进工程,代码如下:
#include "bsp_adc.h"
#include "cw32l012_sysctrl.h"
#include "cw32l012_gpio.h"
#include "cw32l012_adc.h"
void ADC_Port_Init(void)
{
/* 初始始PB0为输入 */
__SYSCTRL_GPIOB_CLK_ENABLE(); //使能GPIOB的时钟
__SYSCTRL_ADC_CLK_ENABLE(); //使能ADC的时钟
CW_GPIOB->ANALOG_f.PIN0 = 1; // 将PB0 设置为模拟输入 也可以使用PB00_ANALOG_ENABLE();
}
void ADC_Config(void)
{
CW_ADC1->CR_f.EN = 1; // 设置 ADCx_CR.EN 为 1,使能 ADC 模块;
__NOP(); //稍加延迟
CW_ADC1->CR_f.CONT = 0; //选择单次转换
CW_ADC1->SAMPLE_f.SQRCH0 = ADC_SampTime9Clk; // 转换时钟
CW_ADC1->CR_f.CLKSRC = 1; //PCLK/2 主频为96/2 为48M
CW_ADC1->CR_f.ENS =0; //转换数存放的寄存器为0
CW_ADC1->SQRCFR_f.SQRCH0 =8; //第8个通道
CW_ADC1->ICR =0; //清除中断
}
uint16_t get_adc_value(void)
{
uint16_t value;
CW_ADC1->ICR = 0; //清除中断 必须加入这个,要不采集的数据不会更新
CW_ADC1->START_f.START = 1; //开始转换
while(CW_ADC1->ISR_f.EOS != 1); //等待转换结束标志
value = CW_ADC1->RESULT0_f.RESULT; //读取结果
CW_ADC1->START_f.START = 0; //停止转换 其实也不用加,因为只转换1次
return value;
}3、在app.c中,编写获取ADC的值,并通过printf打印出来:
#include "app.h"
#include "bsp_adc.h"
#include "cw32l012_systick.h"
void Run(void)
{
ADC_Port_Init();
ADC_Config();
uint16_t adc_value;
while(1)
{
adc_value = get_adc_value();
printf("ADC value:%d\r\n",adc_value);
SysTickDelay(1000);
}
}【实验效果】
下载到开发板后,打开串口终端,就可以看到成功的得到了ADC转换的数据了。

【注意】
由于ADC的参考电压为VDD,因此需要插入开发板的外接电源。
【附件】源码:
我要赚赏金
