微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于STM32AD多通道采样问题

基于STM32AD多通道采样问题

时间:10-02 整理:3721RD 点击:

                    基于STM32AD多通道采样问题

使用DMA实现AD两个通道采样,通过串口打印结果,分别开启一个通道能够正确打印结果。而开启两个通道串口调试串口不显示任何数据。求高手指点如何解决。谢谢。

下面为主要的程序给程序配置应该没有问题,测试了一段时间。就是无法同时开启2个通道。不明白问题出在哪。望做过AD多道采样的高手给出解决的办法。谢谢。

#define ADC1_DR_Address   ((uint32_t)0x4001244C)     //ADC1 DR寄存器基地址

#define N             128          //ADC采样点数        

#define M                  2        //ADC采样通道数

vu16 AD_Value[N][M];      //存放ADC采样值,即DMA目标地址

u16 table[];

void ad_init()

{

       ADC_InitTypeDefADC_InitStructure;

       DMA_InitTypeDefDMA_InitStructure;

       RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

       DMA_DeInit(DMA1_Channel1);

       DMA_InitStructure.DMA_PeripheralBaseAddr= ADC1_DR_Address;    //DMA对应的外设基地址

       DMA_InitStructure.DMA_MemoryBaseAddr= (uint32_t)&AD_Value;   //内存存储基地址

       //DMA_InitStructure.DMA_MemoryBaseAddr= (uint32_t)&ADConvertedValue;

       DMA_InitStructure.DMA_DIR= DMA_DIR_PeripheralSRC;   //DMA的转换模式为SRC模式,由外设搬移到内存

       DMA_InitStructure.DMA_BufferSize=2*128;              //DMA缓存大小,2个,单位为DMA_MemoryDataSize

       DMA_InitStructure.DMA_PeripheralInc= DMA_PeripheralInc_Disable;  //接收一次数据后,设备地址禁止后移

       DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //关闭接收一次数据后,目标内存地址后移

       //DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;

       DMA_InitStructure.DMA_PeripheralDataSize= DMA_PeripheralDataSize_HalfWord;  //定义外设数据宽度为16位

       DMA_InitStructure.DMA_MemoryDataSize= DMA_MemoryDataSize_HalfWord;  //DMA搬数据尺寸,HalfWord就是为16位

       DMA_InitStructure.DMA_Mode= DMA_Mode_Circular;   //转换模式,循环缓存模式。

       DMA_InitStructure.DMA_Priority= DMA_Priority_High;       //DMA优先级高

       DMA_InitStructure.DMA_M2M= DMA_M2M_Disable;           //M2M模式禁用

       DMA_Init(DMA1_Channel1,&DMA_InitStructure);         

      

      

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

       RCC_ADCCLKConfig(RCC_PCLK2_Div6);

       ADC_DeInit(ADC1);

       ADC_InitStructure.ADC_Mode= ADC_Mode_Independent;  //独立的转换模式

       ADC_InitStructure.ADC_ScanConvMode=ENABLE;                //开启扫描模式

       //ADC_InitStructure.ADC_ScanConvMode=DISABLE;

       ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;   //开启连续转换模式

       //ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;

       ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None; //ADC外部开关,关闭状态

       ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;   //对齐方式,ADC为12位中,右对齐方式

       ADC_InitStructure.ADC_NbrOfChannel=2;        //开启通道数,2个

       ADC_Init(ADC1,&ADC_InitStructure);

      

       ADC_DMACmd(ADC1,ENABLE);                                      //ADC命令,使能

       ADC_Cmd(ADC1,ENABLE);                                       //开启ADC1

       ADC_ResetCalibration(ADC1);                                      //重新校准

       while(ADC_GetResetCalibrationStatus(ADC1));       //等待重新校准完成

       ADC_StartCalibration(ADC1);                                        //开始校准

       while(ADC_GetCalibrationStatus(ADC1));              //等待校准完成

       ADC_SoftwareStartConvCmd(ADC1,ENABLE);      //连续转换开始,ADC通过DMA方式不断的更新RAM区。

       DMA_Cmd(DMA1_Channel1,ENABLE);

       //设置ADC1规则通道组,设置转化顺序和采样时间

       //ADC1,ADC通道,规则采样顺序值,采样时间(具体计算)

       ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);

       ADC_RegularChannelConfig(ADC1,ADC_Channel_12,2,ADC_SampleTime_239Cycles5);

      

}

u16 GetVolt(u16 advalue)            //获得AD采样电压值调用函数

{

       return(u16)(advalue*330/4096);

}

u16 value[];

void filter_2()      //2个通道均值

{

       intsum=0;

       u8count;

       u8j;

      

       for(j=0;j<2;j++)

       {

              for(count=0;count<128;count++)

              {

                     sum+=AD_Value[count][j];

              }

       while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);

       table[j]=sum/128;

       value[j]=GetVolt(table[j]);

       sum=0;

       }

}

void filter_printf_2()            //2个通`道打印

{

       //u16value[2];

       u8k;

       for(k=0;k<2;k++)

       {

       //value[k]=GetVolt(table[k]);

       while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);

       printf("value[%d]:\t%d.%dv\n",k,value[k]/100,value[k]%100);

       printf("\n");

       }

}


谢谢小编!

深圳市硅宇电子科技有限公司成立于2002年,是国内有良好商誉的一家电子元器件专业独立分销商。
经营范畴★主营ADI、TI、ST、ALTERA、MARVELL等原厂原装IC批发零售及工厂配单业务。
周先生:15671465200

我也遇到了相同问题,你解决了吗

我也遇到了相同的问题,一直不知道怎么解决

研究一下这个看看有没帮助。http://bbs.elecfans.com/jishu_789236_1_1.html

Altium Designer 多通道设计

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top