使用dma通道配置adc,2个通道采集怎么打印的数据是avg_adc=65484 avg_adc=460 呀?
#include "config.h"
// adc3:p1.3 adc14:p3.6
#define ADC_SPEED 15 /* 0~15, ADC转换时间(CPU时钟数) = (n+1)*32ADCCFG */
#define RES_FMT (1<<5)/* ADC结果格式 0: 左对齐, ADC_RES: D11 D10 D9 D8 D7 D6 D5 D4, ADC_RESL: D3 D2 D1 D0 0 0 0 0 */
/* ADCCFG 1: 右对齐, ADC_RES: 0 0 0 0 D11 D10 D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */
#define ADC_CH 2 /* 1~16, ADC转换通道数, 需同步修改 DMA_ADC_CHSW 转换通道 */
#define ADC_DATA 256 /* 6~n, 每个通道ADC转换数据总数, 2*转换次数+4, 需同步修改 DMA_ADC_CFG2 转换次数 */
bit DmaFlag=0;
#define DMA_ADDR 0x80
uint8_t xdata ADCDMABuffer_at_ DMA_ADDR; // ADC DMA接收缓冲区数组
void DMA_ADC_Init(void)
{
// 设置adc引脚
P1M0 = 0x00; // P1.3高阻输入
P1M1 = ((1)<<3);
P3M0 = 0x00; // P3.6高阻输入
P3M1 = ((1)<<6);
ADCTIM = 0x3f;//设置adc内部时序
ADCCFG = RES_FMT + ADC_SPEED;//设置adc时钟
// delay_ms(1);
ADC_CONTR = 0x80;//使能adc模块和adc通道:0011 1110
DMA_ADC_STA = 0x00;
DMA_ADC_CFG = (1<<7) + (0<<2) + 0; // bit7 1:Enable Interrupt
DMA_ADC_RXAH = (uint8_t)(DMA_ADDR >> 8); // ADC转换数据存储地址
DMA_ADC_RXAL = (uint8_t)(DMA_ADDR);
DMA_ADC_CFG2 = 0x0f;// 每个通道ADC转换次数:256
DMA_ADC_CHSW0 = 0x08; // ADC通道使能寄存器 ADC3
DMA_ADC_CHSW1 = 0x40; // ADC通道使能寄存器 ADC14
DMA_ADC_CR = 0xc0; // bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
}
// adc 中断
void ADC_DMA_Interrupt(void) interrupt 13
{
DMA_ADC_STA = 0;
DmaFlag = 1;
}
void adc_read(void)
{
uint16 i,n;
float adc3_sum,adc3_avg,adc14_sum,adc14_avg,adc3_v,adc14_v;
adc3_sum=adc3_avg=adc14_sum=adc14_avg=adc3_v=adc14_v=0;
if(DmaFlag)
{
DmaFlag=0;
for(i=0;i<ADC_CH;i++){
// for(n=0;n<ADC_DATA;n+=2)
// {
// if((ADCDMABuffer << 8) | ADCDMABuffer)
// // printf("%02x\n",(ADCDMABuffer << 8) | ADCDMABuffer);
// if(i==0)
// adc3_sum+=(ADCDMABuffer << 8) | ADCDMABuffer;
// else
// adc14_sum+=(ADCDMABuffer << 8) | ADCDMABuffer;
// }
printf("avg_adc=%u \n",(ADCDMABuffer<<8)|(ADCDMABuffer));
}
// adc3_avg=adc3_sum/ADC_DATA;
// adc3_v=adc_cacal(adc3_avg);
// adc14_avg=adc14_v/ADC_DATA;
// adc14_v=adc_cacal(adc14_avg);
// printf("adc3_value=%f,adc3_v=%f\n",adc3_avg,adc3_v);
// printf("adc14_value=%f,adc14_v=%f\n",adc14_avg,adc14_v);
DMA_ADC_CR = 0xc0;
}
else
printf("adc 没有中断\n");
}
参考32G库函数例程:
https://www.stcaimcu.com/data/download/DemoCode/STC32G-SOFTWARE-LIB.zip
页:
[1]