多个IO口采ADC的问题

[复制链接]
1217|9
 楼主| 火山LF 发表于 2016-9-13 16:38 | 显示全部楼层 |阅读模式
ADC, IO, ADC1, TE, se
请教各位: 使用MSP430FR5969


我使用P3.0  (A12) 、 P3.2  (A14)、P3.3 (A15 )  三个IO口,分别采三个ADC,但是都是以第一个采到的ADC的值为准,不会变化

P3.0采2.0V的电压,P3.2采0.5V的电压 P3.3采1.0V的电压,最后得到的结果总是以P3.0的值为准

但是单次分别采各自的电压是正确的,就是3个IO口一起采的时候,会出现这种情况。

请问是通道没有转换所以一直以第一个通道来采电压吗?还是有其他可能

请教大家,谢谢!

下面是ADC的初始化和采ADC函数代码
  1. void init_adc()
  2. {
  3.         //Initialize the ADC12B Module
  4.         /*
  5.          * Base address of ADC12B Module
  6.          * Use internal ADC12B bit as sample/hold signal to start conversion
  7.          * USE MODOSC 5MHZ Digital Oscillator as clock source
  8.          * Use default clock divider/pre-divider of 1
  9.          * Not use internal channel
  10.          */
  11.         ADC12_B_initParam initParam = {0};
  12.         initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
  13.         initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
  14.         initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
  15.         initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
  16.         initParam.internalChannelMap = ADC12_B_NOINTCH;
  17.         ADC12_B_init(ADC12_B_BASE, &initParam);

  18.         //Enable the ADC12B module
  19.         ADC12_B_enable(ADC12_B_BASE);

  20.         /*
  21.          * Base address of ADC12B Module
  22.          * For memory buffers 0-7 sample/hold for 64 clock cycles
  23.          * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
  24.          * Disable Multiple Sampling
  25.          */
  26.         ADC12_B_setupSamplingTimer(ADC12_B_BASE, ADC12_B_CYCLEHOLD_16_CYCLES,
  27.         ADC12_B_CYCLEHOLD_4_CYCLES, ADC12_B_MULTIPLESAMPLESDISABLE);

  28.         //Configure Memory Buffer
  29.         /*
  30.          * Base address of the ADC12B Module
  31.          * Configure memory buffer 0
  32.          * Map input A3 to memory buffer 0
  33.          * Vref+ = AVcc
  34.          * Vref- = AVss
  35.          * Memory buffer 0 is not the end of a sequence
  36.          */
  37.         ADC12_B_configureMemoryParam configureMemoryParam = {0};
  38.         configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
  39. //        configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A3;
  40.         configureMemoryParam.refVoltageSourceSelect =
  41.         ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
  42.         configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
  43.         configureMemoryParam.windowComparatorSelect =
  44.         ADC12_B_WINDOW_COMPARATOR_DISABLE;
  45.         configureMemoryParam.differentialModeSelect =
  46.         ADC12_B_DIFFERENTIAL_MODE_DISABLE;
  47.         ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

  48.         ADC12_B_clearInterrupt(ADC12_B_BASE, 0, ADC12_B_IFG0);
  49.         //Enable memory buffer 0 interrupt
  50.         ADC12_B_enableInterrupt(ADC12_B_BASE, ADC12_B_IE0, 0, 0);
  51. }
  1. uint16_t ADC12_B_Sampling(uint16_t GpioPort, uint16_t GpioPin, uint16_t InputSource)
  2. {

  3.         int16_t i16Adcdata[16];
  4.         int16_t i16swap = 0;
  5.         int16_t i16_temp = 0, i16_temp1 = 0;

  6.         GPIO_setAsPeripheralModuleFunctionOutputPin(GpioPort, GpioPin,
  7.         GPIO_TERNARY_MODULE_FUNCTION);

  8.         HWREG16(ADC12_B_BASE + OFS_ADC12MCTL0 + ADC12_B_MEMORY_0) = InputSource; //Set Input Source

  9. //        __bic_SR_register(GIE);
  10.         _disable_interrupts();

  11.         for (i = 0; i < 16; i++)
  12.         {
  13.                 // 开始采样和转化,在memory buffer 0 ,单通道单次转化
  14.                 ADC12_B_startConversion(ADC12_B_BASE, ADC12_B_MEMORY_0,
  15.                 ADC12_B_SINGLECHANNEL);

  16.                 while (!(HWREG8(ADC12_B_BASE + OFS_ADC12IFGR0) & ADC12IFG0));
  17.                 ADC_Get_Value = ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);
  18.                 HWREG16(ADC12_B_BASE + (OFS_ADC12MEM0 + ADC12_B_MEMORY_0)) = 0;
  19.                 i16Adcdata[i] = ADC_Get_Value;

  20.                 __no_operation();
  21.                 __delay_cycles(5000);
  22.         }
  23.         //        __bis_SR_register(GIE);
  24.         _enable_interrupts();

  25.         for (i16_temp = 0; i16_temp < 16; i16_temp++)
  26.         {
  27.                 for (i16_temp1 = i16_temp + 1; i16_temp1 < 16; i16_temp1++)
  28.                 {
  29.                         if (i16Adcdata[i16_temp] < i16Adcdata[i16_temp1])
  30.                         {
  31.                                 i16swap = i16Adcdata[i16_temp];
  32.                                 i16Adcdata[i16_temp] = i16Adcdata[i16_temp1];
  33.                                 i16Adcdata[i16_temp1] = i16swap;
  34.                         }
  35.                 }
  36.         }

  37.         for (i16_temp = 5; i16_temp < 12; i16_temp++)
  38.                 i16Adcdata[4] += i16Adcdata[i16_temp];
  39.         i16Adcdata[4] += 8;
  40.         i16Adcdata[4] = i16Adcdata[4] >> 3;
  41.         ADV_Get_Aver_Value = i16Adcdata[4];


  42. //        DEBUG_PRINT(MSG_ALWAYS, "ADV_Get_Aver_Value=====%d\r\n", ADV_Get_Aver_Value);

  43.         return ADV_Get_Aver_Value;

  44. }


 楼主| 火山LF 发表于 2016-9-13 18:05 | 显示全部楼层
找到问题点了,配置通道时,寄存器的值没有改变,我尝试直接配置寄存器的值也不行,先把寄存器值配置过来先,但是为什么就第一个通道的值能改变,其他通道的值都改变不了额
 楼主| 火山LF 发表于 2016-9-13 20:54 | 显示全部楼层
解决问题了!不能直接改通道的,一定要把ADC关闭再打开,再赋值。。。。。。。。单步调试的时候就看着那个寄存器的值不会变。。。。。

评分

参与人数 1威望 +10 收起 理由
dirtwillfly + 10 很给力!

查看全部评分

dirtwillfly 发表于 2016-9-13 21:05 | 显示全部楼层
火山LF 发表于 2016-9-13 20:54
解决问题了!不能直接改通道的,一定要把ADC关闭再打开,再赋值。。。。。。。。单步调试的时候就看着那个 ...

配置各功能模块的时候,一般都要先关闭,配置完再打开。
 楼主| 火山LF 发表于 2016-9-14 08:12 | 显示全部楼层
dirtwillfly 发表于 2016-9-13 21:05
配置各功能模块的时候,一般都要先关闭,配置完再打开。

我把ADC的模块初始化了,然后功能封装成了一个函数,只要传IO口,通道值进去就可以实现功能
初始化ADC的时候,是把ADC模块配置好,群主大大的意思是,430的配置功能模块的时候,都需要先关闭配置完之后再打开吗? 群主大大的这个经验是针对430的呢?还是说其他单片机也适用?
angerbird 发表于 2016-9-16 12:00 | 显示全部楼层
这个采用连续扫描的模式进行设计程序的。
comeon201208 发表于 2016-9-16 13:49 | 显示全部楼层
这个程序的有点多的,需要找到关键点的才可以。
firstblood 发表于 2016-9-16 16:12 | 显示全部楼层
这个采集模式的选择很重要的。
soodesyt 发表于 2016-9-16 17:12 | 显示全部楼层
怎么配置的?
soodesyt 发表于 2016-9-16 17:13 | 显示全部楼层
多个IO采样,需要分时吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

816

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部