查看: 6355|回复: 2

[提问] 双ADC模式出现的奇怪的问题

[复制链接]
发表于 2011-12-15 14:35:51 | 显示全部楼层 |阅读模式
我在做一个表,我想用AD1和AD2同时测量2路电压值,当没时能AD2时,AD1测得的正弦波为正常波形,当时能了AD2时,两路测得的同一信号正弦波形峰峰值偏大了,直接导致测得的有效值偏大了,这个会是什么原因呢
1122.JPG
 楼主| 发表于 2011-12-15 14:37:05 | 显示全部楼层
/*******************************************************************************
* 函数名 : DMA_configuration  说明 : DMA通道1初始化配置,用于ADC结果传输保存
*******************************************************************************/
void DMA_Configuration(void)
{
// DMA_ISR = 0x00000000;
/*DMA中断状态寄存器,可通过设置IFCR对应位清除
              |||||||+---GIF1 =0:通道1没产生TE、HT或TC事件全局中断标志
              |||||||+---TCIF1=0:通道1没产生传输完成中断标志
              |||||||+---HTIF1=0:通道1没产生半传输中断标志
              |||||||+---TEIF1=0:通道1没产生传输错误中断标志
              ||||||+----通道2中断标志组
              ||||++-----通道3中断标志组
              ||||++-----通道4中断标志组
              |||+-------通道5中断标志组
              ||+--------通道6中断标志组
              ||+--------通道7中断标志组
              +----------保留*/
// DMA_IFCR= 0x00000000;
/*DMA中断标志清除寄存器,可由软件设置或清除
              |||||||+---CGIF1 =1:清除通道1的TE、HT或TC事件全局中断标志
              |||||||+---CTCIF1=1:清除通道1的传输完成中断标志
              |||||||+---CHTIF1=1:清除通道1的半传输中断标志
              |||||||+---CTEIF1=1:清除通道1的传输错误中断标志
              ||||||+----清除通道2中断标志组
              ||||++-----清除通道3中断标志组
              ||||++-----清除通道4中断标志组
              |||+-------清除通道5中断标志组
              ||+--------清除通道6中断标志组
              ||+--------清除通道7中断标志组
              +----------保留*/
  DMA_CCR1=  0x00003A80;/*0011 1010 1000 0000  
               ||||       |||| |||| |||| |||+--EN = 0:通道关闭,1:通道开启
               ||||       |||| |||| |||| ||+---TCIE=0:不允许传输完成中断
               ||||       |||| |||| |||| |+----HTIE=0:禁止半传输中断
               ||||       |||| |||| |||| +-----TEIE=0:禁止传输错误中断
               ||||       |||| |||| |||+-------DIR =0:数据传输方向(从外设读)
               ||||       |||| |||| ||+--------CIRC=0:不执行循环操作
               ||||       |||| |||| |+---------PINC=0:不执行外设地址增量模式
               ||||       |||| |||| +----------MINC=1:执行存储器地址增量模式
               ||||       |||| ||++------------PSIZE=10:32位外设数据宽度
               ||||       |||| ++--------------MSIZE=10:32位存储器数据宽度
               ||||       ||++-----------------PL=11:最高通道优先级
               ||||       |+-------------------MEM2MEM=0:非存储器到存储器模式
               ++++-------+--------------------保留*/

  DMA_CNDTR1=40;//0x00001000;          //DMA通道1传输数量寄存器(4096*2 Bytes)  
  DMA_CPAR1 = (uint32_t)ADC1_DR_ADDR;       //DMA通道1的外设数据寄存器基地址
  DMA_CMAR1 =(uint32_t)&(Scan_Buffer[0]);//DMA通道1的源或目标的存储器地址
//  DMA_CCR1 |= 0x00000001;         // EN = 1:DMA通道1开启
}

/*******************************************************************************
* 函数名    : ADC_configuration  说明  : ADC初始化,采样完成后自动DMA到缓冲区
*******************************************************************************/
void ADC_Configuration(void)
{
  ADC2_CR1 =0x00000000;
  ADC1_CR1 =0x00060000;/*
              ||||||++---AWDCH[4:0]:模拟看门狗通道选择位
              ||||||+----=000:不允许EOC、AWD、JEOC中断
              |||||+-----Nib8_SCAN=1:使用扫描模式
              ||||++-----保持复位值
              |||+-------DUALMOD=6:规则同步模式
              ||+--------规则通道和注入通道禁用模拟看门狗
              ++---------保留*/
  ADC2_CR2 =0x001E0000;
  ADC1_CR2 =0x00100100;/*
              |||||||+---ADON=0:关闭ADC转换/校准,=1:开启ADC并启动转换
              |||||||+---CONT=0:1:连续转换模式
              |||||||+---CAL=0,=1:A/D校开始准,校准后该位将被硬件清除
              |||||||+---RSTCAL=0,=1:初始化校准寄存器,校准后该位将被硬件清除
              ||||||+----保留
              |||||+-----ALIGN=0 & DMA=1:数据右对齐和使用DMA模式
              ||||+------注入通道设置,这里未使用,设置为默认值
              |||+-------=0000:规则通道使用定时器1的CC1事件启动转换,=1110:SWSTART
              ||+--------=1:使用外部触发信号启动转换
              ++---------保留*/
  ADC2_SQR1=0x00000000;
  ADC1_SQR1=0x00000000;/*ADC规则序列寄存器 1
              |||||||+---SQ13[4:0]规则序列中的第13个转换通道编号(0-17)。
                          ||||||+----SQ14[4:0]规则序列中的第14个转换通道编号(0-17)。
                          ||||+------SQ15[4:0]规则序列中的第15个转换通道编号(0-17)。
                          |||+-------SQ16[4:0]规则序列中的第16个转换通道编号(0-17)。
                          ||+--------L[3:0]:规则转换序列通道长度:00001个转换)...1111(16个转换)
              ++---------保留*/
  ADC2_SQR3 =0x00000001; //----------------------
  ADC1_SQR3 =0x00000000;/*ADC规则序列寄存器 3
               ||||||++---SQ1=00000:转换序列中的第1个转换通道的编号(0)
               +++++++----SQ2-6=00000:转换序列中第2-6个转换通道编号(5Bits*5)
               +----------保留*/
  ADC2_SMPR2=0x00000001;
  ADC1_SMPR2=0x00000001;/*ADC采样时间寄存器 1   
               |||||||+---SMP01=000(3Bits):使通道00的采样时间 1.5T   
               ||||||+----SMP02=000(3Bits):使通道01的采样时间 1.5T
               |+++++++---SMP11-17=000(3Bits*7):通道11-17的采样时间 1.5T
               ++---------保留*/
  ADC1_CR2 |=0x00000001;
  ADC2_CR2 |=0x00000001;       //ADON=1:开启ADC1、ADC2

  ADC1_CR2 |=0x00000008;
  while(ADC1_CR2 & 0x00000008);//初始化ADC1校准寄存器

  ADC2_CR2 |=0x00000008;
while(ADC2_CR2 & 0x00000008);//初始化ADC2校准寄存器

  ADC1_CR2 |=0x00000004;
  while(ADC1_CR2 & 0x00000004);//ADC1校准

  ADC2_CR2 |=0x00000004;
  while(ADC2_CR2 & 0x00000004);//ADC2校准
}
/*******************************************************************************
* 函数名 : Timer_configuration    说明 : 系统定时器初始化配置
*******************************************************************************/
void Timer_Configuration(void)
{
//---------------TIM1用于定时触发ADC采样-------------------
// Set_Base(Item_Index[2]);
  TIM1_PSC = 4;
  TIM1_ARR = 7199;
  TIM1_CCR1=(7199+1)/2;
  TIM1_CR1 = 0x0094;/*0000 0000 1001 0100  
                      |||| |||| |||| |||+---CEN=0,禁止计数器
                      |||| |||| |||| ||+----UDIS=0,允许UEV更新
                      |||| |||| |||| |+-----URS=1:只有计数器溢出产生中断或DMA请求
                      |||| |||| |||| +------OPM=0:在发生更新事件时,计数器不停止
                      |||| |||| |||+--------DIR=1,计数器向下计数
                      |||| |||| |++---------CMS=00,选择边沿对齐模式
                      |||| |||| +-----------ARPE=1,TIM1_ARR寄存器被装入缓冲器
                      |||| ||++-------------CKD=00,CK_INT分频比为1
                      ++++-++---------------保留*/
  TIM1_RCR = 0x0000;/*0000 0000 0000 0001  
                      |||| |||| ++++ ++++---在边沿对齐模式下,PWM周期的数目+1
                      ++++-++++-------------保留*/
  TIM1_CCER =0x0001;/*0000 0000 0000 0001  
                      |||| |||| |||| |||+---CC1E=1,OC1信号输出到对应的输出引脚
                      |||| |||| |||| ||+----CC1P=0,OC1高电平有效
                      |||| |||| |||| |+-----CC1NE=0,OC1N禁止输出
                      |||| |||| |||| +------CC1NP=0,OC1N高电平有效
                      ++++-++++-++++--------CC2、CC3、CC4配置为复位值*/
  TIM1_CCMR1=0x0078;/*0000 0000 0111 1100  
                      |||| |||| |||| ||++---CC1S=00,CC1通道被配置为输出
                      |||| |||| |||| |+-----OC1FE=1,允输出比较1 快速使能?
                      |||| |||| |||| +------OC1PE=1,输出比较1预装载使能
                      |||| |||| |+++--------0C1M=111,PWM模式2
                      |||| |||| +-----------OC1CE=0,OC1REF 不受ETRF输入的影响
                      ++++-++++-------------CC2通道配置为复位值*/
  TIM1_BDTR =0x8000;/*1000 0000 0000 0000  
                      |+++-++++-++++-++++---其它位保持不变
                      +---------------------MOE=0,主输出使能*/
  TIM1_DIER =0x4200;/*0100 0011 0000 0000  DMA和中断使能寄存器
                       |     ||        +----CC1IE=0:不允许捕获/比较1中断
                       |     |+-------------UDE=1:允许更新的DMA请求
                       |     +--------------CC1DE=1:允许捕获/比较1的DMA请求
                       +--------------------TDE=1:允许触发DMA请求*/
  TIM1_CR1 |=0x0001;//CEN=1,使能TIMER1计数器
}
发表于 2011-12-16 10:31:23 | 显示全部楼层
信号在接入ad端口之前要加驱动缓冲电路,你有没有做啊 回复2楼eposar
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表