mhklnibw 发表于 2025-7-26 12:09:55

AI8051U的ADC13通道转存数据到DMA中如何格式数据

AI8051U的ADC13通道转存数据到DMA中如何格式数据,使用串口打印数据


uint8_t xdata ADCDMABuffer;          //ADC DMA接收缓冲区数组

次项目是使用AiCube创建项目,以上 ADCDMABuffer 数据如何格式化,请大家赐教,感谢!












DebugLab 发表于 2025-7-26 13:32:57

建议像这样声明DMA Buffer,多个通道的数据和累加和:
unsigned char xdata DMA_Buffer _at_ DMA_ADDR;
超采样数据拼接:
for(channel=0;channel<ADC_CH;channel++)
{
        ADC_Value=DMA_Buffer;
        ADC_Value<<=8;
        ADC_Value|=DMA_Buffer;
        ADC_Value<<=8;
        ADC_Value|=DMA_Buffer;
        ADC_Value>>=4;        //20bit结果右移4位得16位结果
}
串口收发和printf程序:
https://www.stcaimcu.com/thread-16321-1-1.html

梁工 发表于 2025-7-26 16:40:08

#define        CHANNELS        16                //定义DMA要扫描的ADC通道数
#define        COUNTS                16                //定义每个ADC通道转换的次数, 数值只能是1、2、4、8、16、32、64、128、256次之一, 其余值将会得到不可知的错误
u16        xdata adc_buf;        //ADC结果存放的数组, 为每次转换的值, 高字节为ADC通道号,低字节为取平均值后的余数,为平均值
bit        B_ADC_DMA_ok;        //ADC DMA已完成标志(用户标志), 用户清零
bit        B_ADC_DMA_busy;        //ADC DMA忙标志,用户层只可查询,但不可操作。

void        ADC_DMA_config(void)        //初始化ADC DMA函数
{
#if (COUNTS == 1)
        DMA_ADC_CFG2 = 0;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 2)
        DMA_ADC_CFG2 = 8;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 4)
        DMA_ADC_CFG2 = 9;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 8)
        DMA_ADC_CFG2 = 10;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 16)
        DMA_ADC_CFG2 = 11;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 32)
        DMA_ADC_CFG2 = 12;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 64)
        DMA_ADC_CFG2 = 13;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 128)
        DMA_ADC_CFG2 = 14;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#elif (COUNTS == 256)
        DMA_ADC_CFG2 = 15;                //每个通道转换的次数, 0-->1次, 8-->2次, 9-->4次, 10-->8次, 11-->16次, 12-->32次, 13-->64次, 14-->128次, 15-->256次.
#endif
        DMA_ADC_CFG= (1<<7) + (0<<2) + 0;        //bit7=1: 允许ADC_DMA中断, 0:禁止.bit3 bit2: ADC_DMA中断优先级(低0~3高), bit1 bit0: ADC_DMA数据总线访问优先级(低0~3高)
        DMA_ADC_STA= 0;                //bit0: ADC_DMA完成(中断请求)标志, 需要软件清0.
        DMA_ADC_AMTH = 0;                //重复次数 = 9DMA_ADC_AMTH*256+DMA_ADC_AMT)+1
        DMA_ADC_AMT= 0;                //
        DMA_ADC_CHSW1 = 0xff;        //ADC通道使能, bit7~bit0对应通道15~8.
        DMA_ADC_CHSW0 = 0xff;        //ADC通道使能, bit7~bit0对应通道7~0.
        DMA_ADC_ITVH = 0;                // ADC_DMA时间间隔寄存器高字节
        DMA_ADC_ITVL = 0;                // ADC_DMA时间间隔寄存器低字节
        DMA_ADC_RXAH = (u8)((u16)(&adc_buf) /256);        //存放的地址
        DMA_ADC_RXAL = (u8)((u16)(&adc_buf) %256);        //存放的地址
        DMA_ADC_CR   = (1<<7) + (1<<6);                //启动ADC_DMA,bit7=1:允许ADC_DMA功能, 0:禁止.   bit6=1:触发ADC_DMA功能.
        B_ADC_DMA_busy = 1;        //ADC DMA忙, 触发ADC DMA前要先判断为空闲
}

mhklnibw 发表于 2025-8-5 10:02:19

谢谢,梁工和大佬们的解答!
页: [1]
查看完整版本: AI8051U的ADC13通道转存数据到DMA中如何格式数据