ADC用TI的官方例程总是转换一两次之后就停了

2019-07-21 18:04发布

ADC用TI的官方例程总是转换一两次之后就停了,求可能原因
转换程序是放在while循环里面的,求指导,无论打断点还是串口打印,循环不过3次
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
火山LF
2019-07-22 01:36
本帖最后由 火山LF 于 2016-8-24 08:25 编辑

恭喜你,跟我情况一样,刚看到这帖子的时候,我还以为是我发的那个呢

可能的原因:
1、 没有配置低速时钟造成休眠后无法唤醒的情况

2、 单步调试遇到进入低功耗状态,还有延时循环等等,不要和编译器耗着,该跳过跳过,或者注释掉

3、 调试的时候你可以把进入低功耗状态注释掉,或者用几个NOP指令代替
下面是我修改的例程,你要是不行的话,用用我的(MSP430RF5969)我的板子是这块

  1. #include "driverlib.h"

  2. uint16_t Value_AD = 0;
  3. uint16_t ADC_Get_Value = 0; // ADC采到的原始数据
  4. uint16_t ADV_Get_Aver_Value = 0; //用于计算采ADC100次的平均值


  5. void main(void)
  6. {
  7.     // Stop WDT
  8.     WDT_A_hold(WDT_A_BASE);

  9.     //Set P1.0 as an output pin.
  10.     /*

  11.      * Select Port 1
  12.      * Set Pin 0 as output
  13.      */
  14.     GPIO_setAsOutputPin(
  15.         GPIO_PORT_P1,
  16.         GPIO_PIN0
  17.         );

  18.     //Set P1.0 as Output Low.
  19.     /*

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

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


  32.     GPIO_setAsPeripheralModuleFunctionOutputPin(
  33.         GPIO_PORT_P3,
  34.         GPIO_PIN0,
  35.         GPIO_TERNARY_MODULE_FUNCTION
  36.         );

  37.     /*
  38.      * Disable the GPIO power-on default high-impedance mode to activate
  39.      * previously configured port settings
  40.      */
  41.     PMM_unlockLPM5();

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

  57.     //Enable the ADC12B module
  58.     ADC12_B_enable(ADC12_B_BASE);

  59.     /*
  60.      * Base address of ADC12B Module
  61.      * For memory buffers 0-7 sample/hold for 64 clock cycles
  62.      * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
  63.      * Disable Multiple Sampling
  64.      */
  65.     ADC12_B_setupSamplingTimer(ADC12_B_BASE,
  66.                                ADC12_B_CYCLEHOLD_64_CYCLES,
  67.                                ADC12_B_CYCLEHOLD_64_CYCLES,
  68.                                ADC12_B_MULTIPLESAMPLESDISABLE);

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

  89.     ADC12_B_clearInterrupt(ADC12_B_BASE,
  90.                            0,
  91.                            ADC12_B_IFG0
  92.                            );

  93.     //Enable memory buffer 0 interrupt
  94.     ADC12_B_enableInterrupt(ADC12_B_BASE,
  95.                             ADC12_B_IE0,
  96.                             0,
  97.                             0);

  98.     while(1)
  99.     {
  100.         __delay_cycles(5000);

  101.         //Enable/Start sampling and conversion
  102.         /*
  103.          * Base address of ADC12B Module
  104.          * Start the conversion into memory buffer 0
  105.          * Use the single-channel, single-conversion mode
  106.          */
  107.         ADC12_B_startConversion(ADC12_B_BASE,
  108.                                 ADC12_B_MEMORY_0,
  109.                                 ADC12_B_SINGLECHANNEL);

  110. __no_operation();                       // For debugger
  111.     }
  112. }

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

  130.              Value_AD =  ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);

  131.                  ADC_Get_Value = ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);

  132.                  if (ADV_Get_Aver_Value == 0) {
  133.                          ADV_Get_Aver_Value = ADC_Get_Value;
  134.                  }

  135.                  ADC_Get_Value = (ADV_Get_Aver_Value + ADC_Get_Value) / 2;
  136.                  ADV_Get_Aver_Value = ADC_Get_Value;


  137.         if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
  138.         {
  139.             //Set P1.0 LED on
  140.             /*

  141.              * Select Port 1
  142.              * Set Pin 0 to output high.
  143.              */
  144.             GPIO_setOutputHighOnPin(
  145.                 GPIO_PORT_P1,
  146.                 GPIO_PIN0
  147.                 );
  148.         }
  149.         else
  150.         {
  151.             //Set P1.0 LED off
  152.             /*

  153.              * Select Port 1
  154.              * Set Pin 0 to output high.
  155.              */
  156.             GPIO_setOutputLowOnPin(
  157.                 GPIO_PORT_P1,
  158.                 GPIO_PIN0
  159.                 );
  160.         }

复制代码
后面我发现其实有低功耗的模式也是可以的,你也可以尝试把你的CCS关闭,重新打开再试一试,之前不可以,过了一天发现又可以了
你所选择的通道外接了电压没有?



一周热门 更多>