打印

ADC12遇到了一个问题!!!采集不到信号

[复制链接]
3830|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gesper3187|  楼主 | 2017-3-27 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gesper3187 于 2017-4-6 14:26 编辑

用msp430f5438A的P6.4管脚,模拟输入A4,初始化后,使用ADC转换,不管是A4接地(实际也测量为0左右)还是采集实际电压,采集回来的AD值在2000左右。
void Init_Timer_A1()
{

  TA1CCTL0 = CCIE;                              // CCR0 interrupt enabled
  TA1CCR0 = 30000;                              //设置时钟中断周期为30ms
  //TA1CCTL2 = OUTMOD_7 + CCIE;                   // CCR2 set/reset  Interrupt enabled
  TA1CTL = TASSEL_1 + MC_1 + TACLR;             // ACLK, upmode, clear TAR
}
void InitADC12()
{
  P6SEL |= 0x10;                                                          // Enable P6.4 as A/D channel input
  
  
  ADC12CTL0 = ADC12ON + ADC12SHT0_2;                           // Turn on ADC12, set sampling time, 16ADC12CLK cycles
  ADC12CTL1 = ADC12SHP + ADC12CONSEQ_0 + ADC12SSEL_2;       //MEM0,IFG0
       // Use sampling timer, single time single channel,MCLK=4M
  ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_4;                                 // ref+ = VeREF+, ref- = AVSS, channel = A4                                   
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER_A0(void)

{

  //P6OUT ^= 0x01;                             // Toggle触发 P11.0

  ADC12IE = ADC12IE0;
  ADC12CTL0 |= ADC12SC + ADC12ENC;                          //开始ADC转换  
  while((ADC12IFG & 0x0001) == 0);
  Point_now = ADC12MEM0;                                                
__no_operation();  

相关帖子

沙发
dirtwillfly| | 2017-3-27 16:07 | 只看该作者
本帖最后由 dirtwillfly 于 2017-3-27 17:24 编辑

~~~~

使用特权

评论回复
板凳
gesper3187|  楼主 | 2017-3-27 17:03 | 只看该作者
dirtwillfly 发表于 2017-3-27 16:07
因为你读的是ADC12MEM0,而不是A4对应通道的寄存器。

未设定ADC12CSTARTADD,不是默认是存在MEM0里吗, 转换存储的寄存器跟采样的通道不需要一样吧

使用特权

评论回复
地板
dirtwillfly| | 2017-3-27 17:23 | 只看该作者
gesper3187 发表于 2017-3-27 17:03
未设定ADC12CSTARTADD,不是默认是存在MEM0里吗, 转换存储的寄存器跟采样的通道不需要一样吧 ...

刚翻了下手册,是我弄错了

使用特权

评论回复
5
dirtwillfly| | 2017-3-27 17:24 | 只看该作者
能否上传完整程序,我晚上试一下

使用特权

评论回复
6
dirtwillfly| | 2017-3-27 19:49 | 只看该作者
adc配置前要先ADC12CTL0 &= ~ADC12ENC。只有在ADC12ENC复位的情况下才可以正确配置adc

使用特权

评论回复
7
gesper3187|  楼主 | 2017-3-27 20:18 | 只看该作者
dirtwillfly 发表于 2017-3-27 19:49
adc配置前要先ADC12CTL0 &= ~ADC12ENC。只有在ADC12ENC复位的情况下才可以正确配置adc ...

我查了下ADCCTL0的值,应该是配置的没问题,刚才出去了,我整理下程序,发上来

使用特权

评论回复
8
gesper3187|  楼主 | 2017-3-27 20:27 | 只看该作者
本帖最后由 gesper3187 于 2017-4-6 14:27 编辑
gesper3187 发表于 2017-3-27 20:18
我查了下ADCCTL0的值,应该是配置的没问题,刚才出去了,我整理下程序,发上来 ...

#include "msp430x54x.h"

/*初始化电源*/
/*void Init_Power()
{
  P10DIR |= BIT0;     //15,-15使能端
  P10OUT |= BIT0;
  P10DIR |= BIT2;
  P10OUT |= BIT2;

  
}*/
//这里用来使能DC-DC芯片,产生放大器的双供电电源

void InitClock()
{

  P1DIR |= BIT0;
  P1SEL |= BIT0;                                                      //ACLK output,这时候可以使用示波器观察时钟信号

  UCSCTL3 |= SELREF_2;                                                // FLLref = REFO
  UCSCTL4 = SELM__DCOCLKDIV + SELS__DCOCLKDIV + SELA__DCOCLKDIV;      // 时钟来源:主系统时钟来源DCOCLKDIV;子系统时钟来源DCOCLKDIV;辅助系统时钟来源DCOCLKDIV
  UCSCTL5 |= DIVM__1 + DIVS__1 + DIVA__4;                            // 分频:主系统时钟1分频;子系统时钟1分频;辅助系统时钟4分频
  __bis_SR_register(SCG0);                                            // Disable FLL
  UCSCTL1 = DCORSEL_6;                                                // 10.7MHz<Fdco<39MHz
  UCSCTL2 |= FLLD__2 +121 ;                                           // 约4MHz DCOCLKDIV Fdco/4
  __bic_SR_register(SCG0);                                            // Enable FLL

// 等待错误标志清除,振动器稳定
  do{                                                       // 循环检测直到XT1,XT2和DCO稳定
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除XT1,XT2,DCO故障标志
    SFRIFG1 &= ~OFIFG;                                    // 清除故障标志
   }while (SFRIFG1&OFIFG);
}
void InitADC12()
{
  P6SEL |= 0x10;                                                          // Enable P6.4 as A/D channel input

  
  ADC12CTL0 = ADC12ON + ADC12SHT0_2;                              // Turn on ADC12, set sampling time, 16ADC12CLK cycles,这里我用的2.5V外接基准电压
  ADC12CTL1 = ADC12SHP + ADC12CONSEQ_0 + ADC12SSEL_2;        //MEM0,IFG0
       // Use sampling timer, single time single channel,MCLK=4M
  ADC12MCTL0 = ADC12SREF_2 + ADC12INCH_4;                                 // ref+ = VeREF+, ref- = AVSS, channel = A4
}
//初始化Timer_A1
void Init_Timer_A1()
{
  TA1CCTL0 = CCIE;                              // CCR0 interrupt enabled
  TA1CCR0 = 30000;                              //设置时钟中断周期为30ms
  //TA1CCTL2 = OUTMOD_7 + CCIE;                   // CCR2 set/reset  Interrupt enabled
  TA1CTL = TASSEL_1 + MC_1 + TACLR;             // ACLK, upmode, clear TAR
}


double Point_now ;

#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER_A0(void)

{

  //P6OUT ^= 0x01;                             // Toggle触发 P11.0

  ADC12IE = ADC12IE0;
  ADC12CTL0 |= ADC12SC + ADC12ENC;                          //开始ADC转换  
  while((ADC12IFG & 0x0001) == 0);
  Point_now = ADC12MEM0;                                               
__no_operation();  

}
void main(void)

{



  WDTCTL = WDTPW + WDTHOLD;              // Stop WDT

  //Init_Power();
   
  InitClock();                           //初始化时钟
  
  Init_Timer_A1();                       //初始化定时器A1
   
  InitADC12();                           //初始化ADC12
  
  //Init_UART_3();                         //初始化UART
  
  while(1)
  {
    __bis_SR_register(LPM0_bits + GIE);
    __no_operation();
   }
  
}
debug时发现MEM0里的值是2000左右,难道是我得eVREF有问题。。

使用特权

评论回复
9
gesper3187|  楼主 | 2017-3-27 20:27 | 只看该作者
还有Init_UART_3()我没有发上来,不过应该不影响的

使用特权

评论回复
10
firstblood| | 2017-3-27 22:54 | 只看该作者
采集到的数据的村道对应的寄存器中的是关键。

使用特权

评论回复
11
gesper3187|  楼主 | 2017-3-28 16:59 | 只看该作者
本帖最后由 gesper3187 于 2017-3-28 17:15 编辑

今天发现P6.4口电压什么也不接是1.5V,怪不得ADC采集出来是2200,这是为什么,测了好几个开发板,凡是有ADC采样的IO都是1.5V。。。。。迷茫。。。。。我试了一下,把一个100mV的信号输入P6.4,结果此时P6.4IO口的电压变为0.5V,难道不能直接将待测量信号加在ADC输入端?

使用特权

评论回复
12
dirtwillfly| | 2017-3-29 08:04 | 只看该作者
gesper3187 发表于 2017-3-28 16:59
今天发现P6.4口电压什么也不接是1.5V,怪不得ADC采集出来是2200,这是为什么,测了好几个开发板,凡是有ADC ...

能否上传下你ad采样部分的原理图,这个现象比较像阻抗匹配的问题

使用特权

评论回复
13
candysnape| | 2017-3-29 08:25 | 只看该作者
好像没开启内部参考电压?
    // 选择内部2.5V参考电压,ADC12参考电压打开//
    ADC12CTL0 |=  (ADC12REF2_5V + ADC12REFON);

使用特权

评论回复
14
candysnape| | 2017-3-29 08:27 | 只看该作者
传一份我在用的代码给你,可以参考下,希望有帮助。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gesper3187 + 1 谢谢哈~问题已经解决,阻抗没有匹配
15
candysnape| | 2017-3-29 08:28 | 只看该作者
// 硬件接口配置//
// 开启全部ADC12通道的引脚//
#define ADC12_CH_EN         {P6SEL |= 0xFF; P7SEL |= 0xF0; P6DIR &= ~0xFF; \
P7DIR &= ~0xF0;}
// 关闭全部ADC12通道的引脚//
#define ADC12_CH_DIS        {P6SEL &= ~0xFF; P7SEL &= ~0xF0; P6DIR |= 0xFF; \
P7DIR |= 0xF0;}

// 寄存器相关定义//
// 打开ADC12模块内核//
#define ADC12_FUNC_EN                   ADC12CTL0 |= ADC12ON
// 关闭ADC12模块内核//
#define ADC12_FUNC_DIS                  ADC12CTL0 &= ~ADC12ON
// ADC12模块内核开启状态//
#define ADC12_FUNC_STA                  ((ADC12CTL0 & ADC12ON) >> 4)
// 禁止ADC12转换,可进行控制寄存器配置//
#define ADC12_CONFIG_EN                 ADC12CTL0 &= ~ADC12ENC
// 使能ADC12转换,不可进行控制寄存器配置//
#define ADC12_CONFIG_DIS                ADC12CTL0 |= ADC12ENC
// 启动采样转换//
#define ADC12_SAMPLE_START              ADC12CTL0 |= ADC12SC
// 停止采样转换//
#define ADC12_SAMPLE_END                ADC12CTL0 &= ~ADC12SC
// 开启ADC12温度传感器//
#define ADC12_TEMP_EN                   ADC12CTL2 &= ~ADC12TCOFF
// 关闭ADC12温度传感器//
#define ADC12_TEMP_DIS                  ADC12CTL2 |= ~ADC12TCOFF

void AiInit()
{
    // 开启全部ADC12通道的引脚//
    ADC12_CH_EN;
    // 配置ADC12寄存器//
    ADC12_CONFIG_EN;

    // 复位REFMSTR控制位,以修改ADC12参考电压控制寄存器//
    REFCTL0 &= ~REFMSTR;
   
    // 配置采样保持时间为8×ADC12CLK,采集模式为序列转换//
    // ADC12CTL0 |= (ADC12SHT0_1 + ADC12SHT1_1 + ADC12MSC);
    // 如果需要采集温度数据,则采样保持时间最少为128×ADC12CLK//
    ADC12CTL0 |= (ADC12SHT0_6 + ADC12SHT1_6 + ADC12MSC);
    // 选择内部2.5V参考电压,ADC12参考电压打开//
    ADC12CTL0 |=  (ADC12REF2_5V + ADC12REFON);
    // 序列转换从ADC12MEM0开始,采样通过ADC12SC控制位触发,采样保持信号来自采样定时器//
    // ADC12时钟源为SMCLK,不分频,采样模式为序列通道多次转换模式//
    ADC12CTL1 =  ADC12CSTARTADD_0 + ADC12SHS_0 + ADC12SHP +
                 ADC12SSEL_3 + ADC12CONSEQ_3;   
    // 参考电压输出打开(测试语句)//
    // ADC12CTL2 |=  ADC12REFOUT;
   
    // 开启ADC12温度传感器//
    ADC12_TEMP_EN;
   
    // 延时一段时间,保证参考电压稳定//
    DELAY_US(500);
   
    // 停止配置ADC寄存器//
    ADC12_CONFIG_DIS;
}

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
dirtwillfly + 5 很给力!
16
dirtwillfly| | 2017-3-29 08:38 | 只看该作者
candysnape 发表于 2017-3-29 08:25
好像没开启内部参考电压?
    // 选择内部2.5V参考电压,ADC12参考电压打开//
    ADC12CTL0 |=  (ADC12RE ...

楼主用的外部参考电压

使用特权

评论回复
17
candysnape| | 2017-3-29 09:34 | 只看该作者
dirtwillfly 发表于 2017-3-29 08:38
楼主用的外部参考电压

外部参考电压引脚应该是P5.0和P5.1吧,也没看到相关的配置呀

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
dirtwillfly + 5 赞一个!
18
sdlls| | 2017-4-1 21:08 | 只看该作者
使用ADC中断采集呢。

使用特权

评论回复
19
sdlls| | 2017-4-1 21:09 | 只看该作者
选择P6.5作为模拟信号的输入端呢?

使用特权

评论回复
20
iyoum| | 2017-4-4 19:09 | 只看该作者
电压数值不变化不稳定?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

18

帖子

0

粉丝