找回密码
 立即注册
查看: 99|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-05 10:02:19
已绑定手机

1

主题

1

回帖

25

积分

新手上路

积分
25
发表于 2025-7-26 12:09:55 | 显示全部楼层 |阅读模式
AI8051U的ADC13通道转存数据到DMA中如何格式数据,使用串口打印数据


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

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

ADC_DMA1.png
ADC_DMA11.png
ADC_DMA.png








回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-08-11 07:16:53
已绑定手机

86

主题

5879

回帖

1万

积分

超级版主

积分
10609
发表于 2025-7-26 13:32:57 | 显示全部楼层
建议像这样声明DMA Buffer,多个通道的数据和累加和:
unsigned char xdata DMA_Buffer[ADC_CH][ADC_NUM*2+4] _at_ DMA_ADDR;
超采样数据拼接:
for(channel=0;channel<ADC_CH;channel++)
{
        ADC_Value[channel]=DMA_Buffer[channel][2*ADC_NUM+2];
        ADC_Value[channel]<<=8;
        ADC_Value[channel]|=DMA_Buffer[channel][2*ADC_NUM+3];
        ADC_Value[channel]<<=8;
        ADC_Value[channel]|=DMA_Buffer[channel][2*ADC_NUM+1];
        ADC_Value[channel]>>=4;        //20bit结果右移4位得16位结果
}
串口收发和printf程序:
https://www.stcaimcu.com/thread-16321-1-1.html
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:147
  • 最近打卡:2025-08-11 00:11:03

76

主题

6608

回帖

1万

积分

超级版主

积分
13759
发表于 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[CHANNELS][COUNTS+2];        //ADC结果存放的数组, [n][0~(COUNTS-1)]为每次转换的值, [n][COUNTS]高字节为ADC通道号,低字节为取平均值后的余数,  [n][COUNTS+1)]为平均值
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前要先判断为空闲
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-08-05 10:02:19
已绑定手机

1

主题

1

回帖

25

积分

新手上路

积分
25
发表于 6 天前 | 显示全部楼层
谢谢,梁工和大佬们的解答!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-11 13:18 , Processed in 0.108195 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表