本帖最后由 聪聪哥哥 于 2024-12-31 09:35 编辑
1:CW32模式转化器(ADC介绍)
CW32L010 内部集成一个 12 位精度、最高 2M SPS 转换速度的逐次逼近型模数转换器 (SAR ADC),最多可将 16路模拟信号转换为数字信号。现实世界中的绝大多数信号都是模拟量,如光、电、声、图像信号等,都要由 ADC转换成数字信号,才能由 MCU 进行数字化处理。
主要特性:
● 12 位精度
● 各序列通道转换速度可单独配置,最高达 2M SPS
● 16 路输入转换通道
‒ 14 路外部引脚输入
‒ 内置温度传感器
‒ 内置 BGR 1.2V 基准
● VDD 电源电压作为参考电压源(Vref)
● 采样电压输入范围:0 ~ Vcc
● 支持序列通道转换模式
‒ 支持单次和连续转换
‒ 支持最多 8 个转换通道,每个通道可选 16 个转换源之一
● 支持输入通道电压阈值监测
● 支持片内外设自动触发 ADC 转换
内部ADC框图结构:
查阅一下CW32得用户手册,我们可以看到该芯片的每个IO口都可以配置成ADC得输入口,如下图所示:
这样我们在使用内部ADC时候,有了更多的选择。
这里我使用PA02引脚作为ADC的输入检测引脚:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] ADC 配置
*
*/
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure = {0};
__SYSCTRL_ADC_CLK_ENABLE();
ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div2;
ADC_InitStructure.ADC_ConvertMode = ADC_ConvertMode_Once;
ADC_InitStructure.ADC_SQREns = ADC_SqrEns0to0;
ADC_InitStructure.ADC_IN0.ADC_InputChannel = ADC_InputCH2;
ADC_InitStructure.ADC_IN0.ADC_SampTime = ADC_SampTime9Clk;
ADC_Init(&ADC_InitStructure);
ADC_SetTs(ADC_TsEnable);
ADC_Enable();
}
使用普通定时GTIME作为ADC的触发来源:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] GTIM初始化
*
*/
void GTIM_Init(void)
{
GTIM_InitTypeDef GTIM_InitStruct = { 0 };
//打开GTIM时
__SYSCTRL_GTIM1_CLK_ENABLE();
GTIM_InitStruct.AlignMode = GTIM_ALIGN_MODE_EDGE;
GTIM_InitStruct.ARRBuffState = GTIM_ARR_BUFF_DIS;
GTIM_InitStruct.Direction = GTIM_DIRECTION_UP;
GTIM_InitStruct.EventOption = GTIM_EVENT_NORMAL;
GTIM_InitStruct.Prescaler = 8000-1; //实际分频为 Prescaler+1 = 8000, 频率为1kHz
GTIM_InitStruct.PulseMode = GTIM_PULSE_MODE_DIS;
GTIM_InitStruct.ReloadValue = 1000-1; // 1秒
GTIM_InitStruct.UpdateOption = GTIM_UPDATE_EN;
GTIM_TimeBaseInit(CW_GTIM1, >IM_InitStruct);
GTIM_MasterTRGOCfg(CW_GTIM1, GTIM_MASTER_TRGO_UPDATE);
}
在主程序中添加代码如下:
//LED初始化
LED_Init();
ADC_Configuration();
GTIM_Init();
//ADC外部中断触发源配置
ADC_ExtTrigCfg(ADC_TRIG_GTIM1TRGO, ENABLE);
GTIM_Cmd(CW_GTIM1, ENABLE);
实物验证图片如下:
|