This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F427A SD16 A/D转换为什么无结果

Other Parts Discussed in Thread: MSP430F427

使用427A芯片学习做一个电子称系统,包括AD转换、键盘输入和12864显示,硬件焊接完成后键盘和显示调试成功。SD16AD转换使用外部参考电压1.4V,单步进行到SD16CCTL0 |= SD16SC; SD16控制寄存器值全部=0,转换无结果,改用内部1.2V参考电压时发现VREF脚电压为0V,单步到SD16CCTL0 |= SD16SC; SD16控制寄存器值全部=0,转换仍无结果,请各位老师赐教!不会是单片机有问题吧!程序如下:

#include <msp430x42x.h>
//void init_SD16();
int i;
//unsigned int results;
#define   Num_of_Results   8

static unsigned int results[Num_of_Results];
void main(void)
{
  WDTCTL=WDTPW+WDTHOLD;
  IE2 |=BTIE;
  FLL_CTL0 |=XCAP14PF;
  BTCTL=BTDIV+BTIP2+BTIP1;

  _EINT();
  for(;;)
  {
    _BIS_SR(LPM3_bits+GIE);
   _NOP();
  }
}
#pragma vector =BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{
  _BIC_SR_IRQ(LPM3_bits);
  for(i=0;i<10000;i++);
  SD16CTL=SD16SSEL0;
  SD16CCTL0 |= SD16IE ;                     // 使能中断
  SD16CCTL2 |= SD16SNGL;                    // Single conv   dl
  for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref startup
    SD16CCTL0 |= SD16SC;                    // Set bit to start conversion
  _NOP();
}
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  static unsigned int index = 0;
  switch (SD16IV)
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // SD16MEM0 IFG
     results[index] = SD16MEM0;              // Save CH2 results (clears IFG)


    if (++index == Num_of_Results)
    {
      index = 0;                            // SET BREAKPOINT HERE   dl
    }
    break;
  case 6:                                   // SD16MEM1 IFG
    break;
  case 8:                                   // SD16MEM2 IFG
    break;
  }
  //_BIC_SR_IRQ(LPM3_bits);                   // Exit LPM0
}

  • 你先用官方的程序测试下单片机,看看能不能读取出数据,

    #include <msp430.h>

    /* Array to store SD16 conversion results  */
    /* NOTE: array needs to be global to       */
    /*       prevent removal by compiler       */
    static unsigned int results[3];

    int main(void)
    {
      volatile unsigned int i;                  // Use volatile to prevent removal
                                                // by compiler optimization

      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      FLL_CTL0 |= XCAP14PF;                     // Configure load caps
      for (i = 0; i < 10000; i++);              // Delay for 32 kHz crystal to
                                                // stabilize

      SD16CTL   = SD16REFON+SD16SSEL0;          // 1.2V ref, SMCLK
      SD16CCTL0 = SD16SNGL+SD16GRP;             // Single conv, group with CH1
      SD16CCTL1 = SD16SNGL+SD16GRP;             // Single conv, group with CH2
      SD16CCTL2 = SD16SNGL+SD16IE;              // Single conv, enable interrupt
      for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref startup

      _EINT();                                  // Enable general interrupts

      while (1)
      {
        SD16CCTL2 |= SD16SC;                    // SET BREAKPOINT HERE
                                                // Set bit to start conversion
        _BIS_SR(LPM0_bits);                     // Enter LPM0
      }
    }

    #pragma vector=SD16_VECTOR
    __interrupt void SD16ISR(void)
    {
      switch (SD16IV)
      {
      case 2:                                   // SD16MEM Overflow
        break;
      case 4:                                   // SD16MEM0 IFG
        break;
      case 6:                                   // SD16MEM1 IFG
        break;
      case 8:                                   // SD16MEM2 IFG
        results[0] = SD16MEM0;                  // Save CH0 results (clears IFG)
        results[1] = SD16MEM1;                  // Save CH1 results (clears IFG)
        results[2] = SD16MEM2;                  // Save CH2 results (clears IFG)
        break;
      }

      _BIC_SR_IRQ(LPM0_bits);                   // Exit LPM0
    }

  • 首先衷心感谢Xutong Han2老师的回复!

    按照您提供的官方SD16测试程序反复多次调试,通道A0.0输入5毫伏电压,程序单步运行到SD16CCTL2 |= SD16SC;  后SD16控制寄存器所有设置全部清零,跳到for (i = 0; i < 10000; i++); 执行。仍然读不出转换结果!请赐教!

  • 程序的功能描述如下,你用测试程序,在  Vin1+ -->|A0.0+  接一个固定电压比如1V电压 在 Vin1- -->|A0.0- 接地 然后用仿真器在      主循环中  

         SD16CCTL2 |= SD16SC;                    // SET BREAKPOINT HERE
                                                                           // Set bit to start conversion
        _BIS_SR(LPM0_bits);                           // Enter LPM0      在这等待ADC采集完成,查看results[0] = SD16MEM0;   中的ADC转换数值

    //  ACLK = LFXT1 = 32768 Hz, MCLK = SMCLK = DCO = 32 x ACLK = 1048576 Hz
    //  //* An external watch crystal on XIN XOUT is required for ACLK     *// 
    //  //* Minimum Vcc is required for SD16 module - see datasheet        *//
    //  //* 100nF cap btw Vref and AVss is recommended when using 1.2V ref *//
    //
    //                MSP430F427
    //            -----------------
    //         /|\|              XIN|-
    //          | |                 | 32kHz
    //          --|RST          XOUT|-
    //            |                 |
    //   Vin1+ -->|A0.0+            |
    //   Vin1- -->|A0.0-            |
    //   Vin2+ -->|A1.0+            |
    //   Vin2- -->|A1.0-            |
    //   Vin3+ -->|A2.0+            |
    //   Vin3- -->|A2.0-            |
    //            |                 |
    //            |            VREF |---+
    //            |                 |   |
    //            |                 |  -+- 100nF
    //            |                 |  -+-
    //            |                 |   |
    //            |            AVss |---+
    //            |                 |

  • 尊敬的Xutong Han2老师:

    您好!再次感谢您的赐教!按照您所赐的方法,我给芯片427A的 A0.0+加了1.1V电压,A0.0-接电压地,VREF和AVSS接了100uF电容。再次下载官方测试程序,调试结果任然读不出转换结果。单步运行到

    1. SD16CCTL0 = SD16SNGL+SD16GRP;    时  (SD16CCTL0=0x0401)

    2. SD16CCTL1 = SD16SNGL+SD16GRP;  时 SD16CCTL1 =0x0401

    3. SD16CCTL2 = SD16SNGL+SD16IE;   时 SD16CCTL2=0x0408

    运行到SD16CCTL2 |= SD16SC;  时SD16CCTL0、1、2全部等于0,程序跳到1....2...3...如此重复2次后有跳到main()前面

    SD16MEM0、SD16MEM1、SD16MEM2始终等于0,也无结果。是何原因?敬请赐教!  甘肃省平凉市 柳玉柱

  •  你直接在 这条语句前增加断点_BIS_SR(LPM0_bits); 然后让单片机全速运行,查看ADC的数值 不要单步运行 试试这样可以得到数据不,

  • Xutong Han2老师,您好!

    按照您的吩咐,在低功耗模式命令前面设置断点,程序全速运行多次仍然读不出转换结果。使用万用表测量出内部参考电压=1.2V。从SD16的控制寄存器工作正常,各引脚输出电压也正常,显示和键盘可以正常工作,参考电压正常来看,单片机应该是好的,SD16模块好像是好的,但是为什么读不出转换结果?

  • 你如果有其他的板子可以在其他的板子上试试,或者试试其他官方的程序,首先排除硬件问题~

  • 尊敬的Xutong Han2老师:

    非常感谢您的无私帮助!我手上有3片427芯片,2片已经焊接在BCP板上了,调试读不出转换结果。只好使用第三个芯片了。搞不明白149芯片很好用,为什么427芯片出现这么多问题。我是新手不知道官方SD16程序在哪里找?如果您手边有官方程序请给我发送一下。万分感谢!我的邮箱:lyz8421@163.com