找回密码
 立即注册
查看: 59|回复: 1

使用dma通道配置adc,2个通道采集怎么打印的数据是avg_adc=65484 avg_adc=460 呀?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-10-20 00:49:01
已绑定手机

0

主题

0

回帖

12

积分

新手上路

积分
12
发表于 2025-10-20 00:49:01 | 显示全部楼层 |阅读模式


#include "config.h"

// adc3:p1.3 adc14:p3.6
#define ADC_SPEED   15          /* 0~15, ADC转换时间(CPU时钟数) = (n+1)*32  ADCCFG */
#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[ADC_CH][ADC_DATA*2+4]  _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[n+1] << 8) | ADCDMABuffer[n])
            //    // printf("%02x\n",(ADCDMABuffer[n+1] << 8) | ADCDMABuffer[n]);
            //     if(i==0)
            //      adc3_sum+=(ADCDMABuffer[n+1] << 8) | ADCDMABuffer[n];
            //     else
            //         adc14_sum+=(ADCDMABuffer[n+1] << 8) | ADCDMABuffer[n];
            // }
            printf("avg_adc=%u \n",(ADCDMABuffer[2*ADC_DATA+2]<<8)|(ADCDMABuffer[2*ADC_DATA+3]));
        }
        // 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");
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-11-02 14:55:10
已绑定手机

90

主题

3357

回帖

7523

积分

荣誉版主

无情的代码机器

积分
7523
发表于 2025-10-20 13:32:22 | 显示全部楼层
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-3 02:57 , Processed in 0.110328 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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