一:ADC模数转换
STC32G系列单片机内部集成了一个12位高速A/D转换器。ADC的时钟频率为系统频率2分频再经过用户设置的分频系数进行再次分频(ADC的时钟频率范围为SYSck/2/1~SYSclk/2/16)。
ADC转换结果的数据格式有两种:左对齐和右对齐。可方便用户程序进行读取和引用。
STC32G 的 DMA 配合 ADC,核心价值在于“解放 CPU”。它可以自动完成多通道 ADC 转换并将结果存入内存,无需软件循环等待或频繁进入中断,非常适合需要连续、高速采集多路模拟信号的场景
二:软件编写流程:
2.1 配置ADC相关寄存器
I/O口模式:将所有要用作ADC输入的引脚(如P1.0-P1.7, P0.0-P0.6)设置为高阻输入模式(PxM1 = 0xff, PxM0 = 0x00)。
ADC时钟与采样时间:这是影响采样精度的关键。建议ADC时钟设置在3MHz左右,采样时间设置在5-10微秒之间。可通过ADCTIM(设置采样保持时间)和ADCCFG(设置ADC时钟速度 ADCCFG_SPEED)寄存器来配置。
使能ADC模块:设置ADC_CONTR寄存器的最高位(ADC_POWER)为1,开启ADC电源。
2.2配置DMA相关寄存器
设置存储地址:通过DMA_ADC_RXAL和DMA_ADC_RXAH寄存器,设置DMA在XRAM中存放转换结果的目标地址。
选择ADC通道:通过DMA_ADC_CHSW0和DMA_ADC_CHSW1寄存器来选择要扫描的ADC通道。每个位对应一个通道,置1使能。
设定转换次数:通过DMA_ADC_CFG2寄存器设置每个通道的转换次数。例如,设为0x09表示每个通道转换4次。
配置中断(可选):如需在DMA转换完成后自动处理数据,可在DMA_ADC_CFG寄存器中使能中断(DMA_ADC_IE = 1)。
2.3 启动DMA
最后,设置DMA_ADC_CR寄存器:DMA_ADC_CR = 0xC0,即同时使能DMA(DMA_ADC_ENABLE = 1)和启动传输(DMA_ADC_START = 1)
三:AI cube 软件配置
3.1 P10引脚配置如下:

3.2 ADC参数配置

四:软件代码
4.1 ADC初始化:
void ADC_Init(void)
{
ADC_SetClockDivider(0); //设置ADC时钟
ADC_ResultRightAlign(); //设置ADC结果右对齐(12位结果)
ADC_SetRepeat16Times(); //ADC自动重复转换16次并取平均值
ADC_SetCSSetupCycles(0); //设置ADC通道选择建立时间
ADC_SetCSHoldCycles(1); //设置ADC通道选择保持时间
ADC_SetSampleDutyCycles(9); //设置ADC通道采样时间
ADC_SetIntPriority(0); //设置中断为最低优先级
ADC_EnableInt(); //使能ADC中断
fADCConverted = 0; //初始化转换结束标志
ADC_ActiveChannel(0); //选择ADC通道
ADC_Enable(); //使能ADC功能
DMA_ADC_SetAddress(pu8ADCDMABuffer); //设置ADC DMA缓冲区地址
DMA_ADC_SetChannels(0x0001); //设置ADC DMA扫描通道
DMA_ADC_SetRepeat32Times(); //设置ADC DMA时每个通道重复转换次数
DMA_ADC_ClearFlag(); //清除ADC DMA中断标志
DMA_ADC_SetBusPriority(0); //设置总线访问为最低优先级
DMA_ADC_SetIntPriority(0); //设置中断为最低优先级
DMA_ADC_EnableInt(); //使能ADC DMA中断
DMA_ADC_Enable(); //使能ADC DMA功能
// DMA_ADC_Trigger(); //触发ADC DMA
//<<AICUBE_USER_ADC_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_ADC_INITIAL_END>>
}该代码配置好了,直接由AI cube 生成。
4.2 读取ADC通道函数功能
uint16_t ADC_Convert(uint8_t ch)
{
uint16_t res; //定义保存ADC结果的变量
ADC_ActiveChannel(ch); //选择ADC通道
ADC_Start(); //开始ADC转换
while (!fADCConverted); //等待ADC转换完成
fADCConverted = 0; //清除ADC转换结束标志
res = ADC_ReadResult(); //读取ADC转换结果
return res; //返回ADC结果
}该代码是轮询读取时候使用,并非DMA采集的ADC数据。
4.3 ADC数据通过串口发送到PC端
case 50: main_test();
count = ADC_Convert(0) ;
printf("AD=%04d\r\n",count);
break;五:实物验证图:

我要赚赏金
