uefcmicz 发表于 2025-10-20 00:49:01

使用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");
}

ercircle 发表于 2025-10-20 13:32:22

参考32G库函数例程:

https://www.stcaimcu.com/data/download/DemoCode/STC32G-SOFTWARE-LIB.zip

页: [1]
查看完整版本: 使用dma通道配置adc,2个通道采集怎么打印的数据是avg_adc=65484 avg_adc=460 呀?