ADC用TI的官方例程总是转换一两次之后就停了,求可能原因

2019-07-21 18:28发布

ADC用TI的官方例程总是转换一两次之后就停了,求可能原因

转换的程序是放在while循环里面的,求指导

11111.png (36.79 KB, 下载次数: 0) 下载附件  保存到相册 2016-8-17 21:16 上传

程序如图



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
jimmhu
1楼-- · 2019-07-21 23:42
你是怎么看出来不能转换的?
jimmhu
2楼-- · 2019-07-22 02:13
楼主试过单步调试了吗?
火山LF
3楼-- · 2019-07-22 03:49
 精彩回答 2  元偷偷看……
dirtwillfly
4楼-- · 2019-07-22 04:40
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?
火山LF
5楼-- · 2019-07-22 06:43
dirtwillfly 发表于 2016-8-18 10:40
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?
  1. #include <msp430.h>
  2. #include "driverlib.h"


  3. void main(void)
  4. {
  5.     // stop watchdog
  6.     WDT_A_hold(WDT_A_BASE);

  7.     PMM_unlockLPM5();
  8.     // 设置内部DCO频率为1MHz
  9.     CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_0);
  10.     // 设置SMCLK时钟源来自DCO
  11.     CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);


  12.     GPIO_setAsOutputPin(
  13.             GPIO_PORT_P1,
  14.             GPIO_PIN0
  15.             );

  16.         //Set P1.0 as Output Low.
  17.         /*

  18.          * Select Port 1
  19.          * Set Pin 0 to output Low.
  20.          */
  21.         GPIO_setOutputLowOnPin(
  22.             GPIO_PORT_P1,
  23.             GPIO_PIN0
  24.             );
  25.         //Set P1.1 as Ternary Module Function Output.
  26.         /*

  27.          * Select Port 1
  28.          * Set Pin 1 to output Ternary Module Function, (A1, C1, VREF+, VeREF+).
  29.          */


  30.         GPIO_setAsPeripheralModuleFunctionOutputPin(
  31.             GPIO_PORT_P1,
  32.             GPIO_PIN1,
  33.             GPIO_TERNARY_MODULE_FUNCTION
  34.             );


  35.         //Initialize the ADC12B Module
  36.         /*
  37.          * Base address of ADC12B Module
  38.          * Use internal ADC12B bit as sample/hold signal to start conversion
  39.          * USE MODOSC 5MHZ Digital Oscillator as clock source
  40.          * Use default clock divider/pre-divider of 1
  41.          * Not use internal channel
  42.          */
  43.         ADC12_B_initParam initParam = {0};
  44.         initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
  45.         initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
  46.         initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
  47.         initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
  48.         initParam.internalChannelMap = ADC12_B_NOINTCH;
  49.         ADC12_B_init(ADC12_B_BASE, &initParam);

  50.         //Enable the ADC12B module
  51.         ADC12_B_enable(ADC12_B_BASE);

  52.         /*
  53.          * Base address of ADC12B Module
  54.          * For memory buffers 0-7 sample/hold for 64 clock cycles
  55.          * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
  56.          * Disable Multiple Sampling
  57.          */
  58.         ADC12_B_setupSamplingTimer(ADC12_B_BASE,
  59.                                    ADC12_B_CYCLEHOLD_16_CYCLES,
  60.                                    ADC12_B_CYCLEHOLD_4_CYCLES,
  61.                                    ADC12_B_MULTIPLESAMPLESDISABLE);

  62.         //Configure Memory Buffer
  63.         /*
  64.          * Base address of the ADC12B Module
  65.          * Configure memory buffer 0
  66.          * Map input A1 to memory buffer 0
  67.          * Vref+ = AVcc
  68.          * Vref- = AVss
  69.          * Memory buffer 0 is not the end of a sequence
  70.          */
  71.         ADC12_B_configureMemoryParam configureMemoryParam = {0};
  72.         configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
  73.         configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A1;
  74.         configureMemoryParam.refVoltageSourceSelect =
  75.             ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
  76.         configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
  77.         configureMemoryParam.windowComparatorSelect =
  78.             ADC12_B_WINDOW_COMPARATOR_DISABLE;
  79.         configureMemoryParam.differentialModeSelect =
  80.             ADC12_B_DIFFERENTIAL_MODE_DISABLE;
  81.         ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

  82.         ADC12_B_clearInterrupt(ADC12_B_BASE,
  83.                                0,
  84.                                ADC12_B_IFG0
  85.                                );

  86.         //Enable memory buffer 0 interrupt
  87.         ADC12_B_enableInterrupt(ADC12_B_BASE,
  88.                                 ADC12_B_IE0,
  89.                                 0,
  90.                                 0);

  91.         while(1)
  92.         {
  93.             __delay_cycles(5000);

  94.             //Enable/Start sampling and conversion
  95.             /*
  96.              * Base address of ADC12B Module
  97.              * Start the conversion into memory buffer 0
  98.              * Use the single-channel, single-conversion mode
  99.              */
  100.             ADC12_B_startConversion(ADC12_B_BASE,
  101.                                     ADC12_B_MEMORY_0,
  102.                                     ADC12_B_SINGLECHANNEL);

  103.             __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_B_ISR will force exit
  104.             __no_operation();                       // For debugger
  105.         }



  106. }


  107. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  108. #pragma vector=ADC12_VECTOR
  109. __interrupt
  110. #elif defined(__GNUC__)
  111. __attribute__((interrupt(ADC12_VECTOR)))
  112. #endif
  113. void ADC12_ISR(void)
  114. {
  115.     switch(__even_in_range(ADC12IV,12))
  116.     {
  117.     case  0: break;                         // Vector  0:  No interrupt
  118.     case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
  119.     case  4: break;                         // Vector  4:  Conversion time overflow
  120.     case  6: break;                         // Vector  6:  ADC12BHI
  121.     case  8: break;                         // Vector  8:  ADC12BLO
  122.     case 10: break;                         // Vector 10:  ADC12BIN
  123.     case 12:                                // Vector 12:  ADC12BMEM0 Interrupt


  124.         if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
  125.         {
  126.             //Set P1.0 LED on
  127.             /*

  128.              * Select Port 1
  129.              * Set Pin 0 to output high.
  130.              */
  131.             GPIO_setOutputHighOnPin(
  132.                 GPIO_PORT_P1,
  133.                 GPIO_PIN0
  134.                 );
  135.         }
  136.         else
  137.         {
  138.             //Set P1.0 LED off
  139.             /*

  140.              * Select Port 1
  141.              * Set Pin 0 to output high.
  142.              */
  143.             GPIO_setOutputLowOnPin(
  144.                 GPIO_PORT_P1,
  145.                 GPIO_PIN0
  146.                 );
  147.         }
  148. //        __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
  149.         break;                              // Clear CPUOFF bit from 0(SR)
  150.     case 14: break;                         // Vector 14:  ADC12BMEM1
  151.     case 16: break;                         // Vector 16:  ADC12BMEM2
  152.     case 18: break;                         // Vector 18:  ADC12BMEM3
  153.     case 20: break;                         // Vector 20:  ADC12BMEM4
  154.     case 22: break;                         // Vector 22:  ADC12BMEM5
  155.     case 24: break;                         // Vector 24:  ADC12BMEM6
  156.     case 26: break;                         // Vector 26:  ADC12BMEM7
  157.     case 28: break;                         // Vector 28:  ADC12BMEM8
  158.     case 30: break;                         // Vector 30:  ADC12BMEM9
  159.     case 32: break;                         // Vector 32:  ADC12BMEM10
  160.     case 34: break;                         // Vector 34:  ADC12BMEM11
  161.     case 36: break;                         // Vector 36:  ADC12BMEM12
  162.     case 38: break;                         // Vector 38:  ADC12BMEM13
  163.     case 40: break;                         // Vector 40:  ADC12BMEM14
  164.     case 42: break;                         // Vector 42:  ADC12BMEM15
  165.     case 44: break;                         // Vector 44:  ADC12BMEM16
  166.     case 46: break;                         // Vector 46:  ADC12BMEM17
  167.     case 48: break;                         // Vector 48:  ADC12BMEM18
  168.     case 50: break;                         // Vector 50:  ADC12BMEM19
  169.     case 52: break;                         // Vector 52:  ADC12BMEM20
  170.     case 54: break;                         // Vector 54:  ADC12BMEM21
  171.     case 56: break;                         // Vector 56:  ADC12BMEM22
  172.     case 58: break;                         // Vector 58:  ADC12BMEM23
  173.     case 60: break;                         // Vector 60:  ADC12BMEM24
  174.     case 62: break;                         // Vector 62:  ADC12BMEM25
  175.     case 64: break;                         // Vector 64:  ADC12BMEM26
  176.     case 66: break;                         // Vector 66:  ADC12BMEM27
  177.     case 68: break;                         // Vector 68:  ADC12BMEM28
  178.     case 70: break;                         // Vector 70:  ADC12BMEM29
  179.     case 72: break;                         // Vector 72:  ADC12BMEM30
  180.     case 74: break;                         // Vector 74:  ADC12BMEM31
  181.     case 76: break;                         // Vector 76:  ADC12BRDY
  182.     default: break;
  183.     }
  184. }
复制代码

就是官方的例程,前面的时钟是我配给uart,怕有干扰,就删掉uart的函数了
火山LF
6楼-- · 2019-07-22 10:13
dirtwillfly 发表于 2016-8-18 10:40
不好意思啊,刚看到这个帖子。
adc是怎么初始化的?

群主大人,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。

捕获.PNG (43.01 KB, 下载次数: 0)

下载附件  保存到相册

2016-8-18 16:19 上传


我的问题是:为什么会一直停在是 __bis_SR_register(LPM0_bits + GIE); 这个地方,而不会进入while循环?进入不了while循环就没有开始采样的条件,所以就不会进行采样中断去唤醒MCU。

代码已经在原帖的回帖中贴出。

麻烦指导一下,谢谢。

一周热门 更多>