AI8051U的ADC13通道转存数据到DMA中如何格式数据
AI8051U的ADC13通道转存数据到DMA中如何格式数据,使用串口打印数据uint8_t xdata ADCDMABuffer; //ADC DMA接收缓冲区数组
次项目是使用AiCube创建项目,以上 ADCDMABuffer 数据如何格式化,请大家赐教,感谢!
建议像这样声明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 #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前要先判断为空闲
}
谢谢,梁工和大佬们的解答!
页:
[1]