智能车制作

标题: K60 AD初始化代码 并求解决方案 [打印本页]

作者: 而而非无人    时间: 2012-2-18 18:54
标题: K60 AD初始化代码 并求解决方案
void ADC_cfg()
{
  //SIM_SOPT7|=SIM_SOPT7_ADC1ALTTRGEN_MASK;  //触发AD转换的触发方式由寄存器选择而不是PDB
  //SIM_SOPT7|=SIM_SOPT7_ADC1PRETRGSEL_MASK; //前触发选择
  //SIM_SOPT7|=SIM_SOPT7_ADC1TRGSEL(4);      //触发源选择PIT
  //SIM_SOPT7|=SIM_SOPT7_ADC0ALTTRGEN_MASK;  //触发AD转换的触发方式由寄存器选择而不是PDB
  //SIM_SOPT7|=SIM_SOPT7_ADC0PRETRGSEL_MASK; //前触发选择
  //SIM_SOPT7|=SIM_SOPT7_ADC0TRGSEL(4);      //触发源选择PIT
  
  enable_irq(57);
  enable_irq(58);
     
  SIM_SCGC3|=SIM_SCGC3_ADC1_MASK;          //开启模块时钟
  SIM_SCGC6|=SIM_SCGC6_ADC0_MASK;          //开启模块时钟
  
  SIM_SCGC5|=SIM_SCGC5_PORTE_MASK;
  SIM_SCGC5|=SIM_SCGC5_PORTE_MASK;
  SIM_SCGC5|=SIM_SCGC5_PORTE_MASK;
  SIM_SCGC5|=SIM_SCGC5_PORTE_MASK;
  SIM_SCGC5|=SIM_SCGC5_PORTE_MASK;
/*
  PORTB_PCR(0)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC0_SEL8  /ADC1_SEL8
  PORTB_PCR(1)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC0_SEL9  /ADC1_SEL9
  PORTB_PCR(2)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC0_SEL12
  PORTB_PCR(3)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC0_SEL13
  PORTB_PCR(4)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL10
  PORTB_PCR(5)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL11
  PORTB_PCR(6)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL12
  PORTB_PCR(7)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL13
  PORTB_PCR(11)|=PORT_PCR_MUX(0);          //引脚复用模块选为ADC1_SEL15
  PORTC_PCR(0)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC0_SEL14
  PORTC_PCR(8)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL4B
  PORTC_PCR(9)|=PORT_PCR_MUX(0);           //引脚复用模块选为ADC1_SEL5B
  PORTC_PCR(10)|=PORT_PCR_MUX(0);          //引脚复用模块选为ADC1_SEL6B
  PORTC_PCR(11)|=PORT_PCR_MUX(0);          //引脚复用模块选为ADC1_SEL7B
*/
  
  ADC0_SC2=0;
  ADC0_SC3=0;
  ADC0_SC2&=~ADC_SC2_ADTRG_MASK;           //软件激活转换
  ADC0_SC2|= ADC_SC2_REFSEL(0);            //电压参考选择
  
  ADC1_SC2&=~ADC_SC2_ADTRG_MASK;           //软件激活转换
  ADC1_SC2|= ADC_SC2_REFSEL(0);            //电压参考选择

  ADC0_SC3|= ADC_SC3_ADCO_MASK;            //持续转换
/*
  ADC0_SC3|= ADC_SC3_AVGE_MASK;            //启动硬件平均
  ADC0_SC3|= ADC_SC3_AVGS(3);              //取32个值平均
  */
  ADC1_SC3|= ADC_SC3_ADCO_MASK;            //持续转换
  /*
  ADC1_SC3|= ADC_SC3_AVGE_MASK;            //启动硬件平均
  ADC1_SC3|= ADC_SC3_AVGS(3);              //取32个值平均
  */
  ADC0_CFG1|= ADC_CFG1_ADIV(0);            //外部时钟分频为8
  ADC0_CFG1|= ADC_CFG1_MODE(3);            //16位转换
  ADC0_CFG1|= ADC_CFG1_ADICLK(0);          //选择输入时钟源:外部总线时钟/2
  ADC1_CFG1|= ADC_CFG1_ADIV(0);            //外部时钟分频为8
  ADC1_CFG1|= ADC_CFG1_MODE(3);            //16位转换
  ADC1_CFG1|= ADC_CFG1_ADICLK(0);          //选择输入时钟源:外部总线时钟/2
  
  ADC0_CFG2&=~ADC_CFG2_MUXSEL_MASK;        //选择通道复用A或B:选择为A
// ADC0_CFG2|= ADC_CFG2_ADACKEN_MASK;       //使能时钟输入,无论何时时钟都有效
  ADC0_CFG2&=~ADC_CFG2_ADHSC_MASK;         //选择常速转换
  
  ADC1_CFG2&=~ADC_CFG2_MUXSEL_MASK;        //选择通道复用A或B:选择为A
  //ADC1_CFG2|= ADC_CFG2_ADACKEN_MASK;       //使能时钟输入,无论何时时钟都有效
  ADC1_CFG2&=~ADC_CFG2_ADHSC_MASK;         //选择常速转换
  
  ADC0_SC1A=0;
  ADC0_SC1B=0;
  ADC1_SC1A=0;
  ADC1_SC1B=0;
  
  ADC0_SC1A&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
  ADC1_SC1A&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
  //ADC0_SC1B&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
  //ADC1_SC1B&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
  
  //ADC0_SC1B&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
// ADC1_SC1B&=~ADC_SC1_DIFF_MASK;           //选择为单工输入
  
  ADC0_SC1A|= ADC_SC1_ADCH(4);            //AD14为输入
  ADC1_SC1A|= ADC_SC1_ADCH(4);            //AD14为输入
  PORTE_PCR(0)|=PORT_PCR_MUX(0);          //引脚复用模块选为ADC1_SEL7B
  /*
  ADC0_SC1A|= ADC_SC1_ADCH(14);            //AD14为输入
  ADC1_SC1A|= ADC_SC1_ADCH(14);            //AD14为输入
  ADC0_SC1B|= ADC_SC1_ADCH(14);            //AD14为输入
  ADC1_SC1B|= ADC_SC1_ADCH(14);            //AD14为输入
  */
  
}
void ADC_init()
{ ADC_cfg();
  ADC_Cal(ADC0_BASE_PTR);
  ADC_cfg();
  ADC_Cal(ADC1_BASE_PTR);
  ADC_cfg();
  ADC0_SC1A|= ADC_SC1_AIEN_MASK;           //转换完成中断禁止使能
  ADC1_SC1A|= ADC_SC1_AIEN_MASK;           //转换完成中断禁止使能
  //ADC0_SC1B|= ADC_SC1_AIEN_MASK;           //转换完成中断禁止使能
  //ADC1_SC1B|= ADC_SC1_AIEN_MASK;           //转换完成中断禁止使能
}
void ADC0_ISR()
{a=ADC0_RA;}
void ADC1_ISR()
{b=ADC1_RA;}
出现的现象是: 得到的AD值有两种情况: 第一种是引脚什么也不接结果乱浮动,当引脚接上电压时,无路电压多少,AD值均为0
求大神指点呀。

作者: 而而非无人    时间: 2012-2-18 18:57
还有一点是 AD参考电压有没有内部参考,没有的话外部电压怎么接 VREFH和VREFL是怎么接的呢
作者: 洋葱圈    时间: 2012-2-18 21:53
不接的话浮动是正常的,但是为什么接上为0了呢,楼主的输入信号是哪里来得,输出阻抗是多少?
作者: 而而非无人    时间: 2012-2-18 23:41
找到问题所在了  接地的参考是浮空的 PCB没有做好呀




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2