我们的应用程序以单个顺序读取5个输入,在 main ()中手动触发。 我们没有使用中断。
4个输入 存储在3个 ADC 存储段中、1个输入存储在1个 ADC 存储段中。
3个输入使用 共享基准、2个输入使用 VCCS-基准。
配置 如下所示:
// Enable VREF=2.5V shared reference, disable temperature sensor REFCTL0 |= REFMSTR+REFVSEL_2+REFON+REFTCOFF; // Configure for sequence of A5-A7, A12 and A 13 ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1; // Use sampling timer, single sequence ADC12MCTL3 = ADC12INCH_5 + ADC12SREF_1; // Ref=VREF, channel = A5 ADC12MCTL4 = ADC12INCH_5 + ADC12SREF_1; // Ref=VREF, channel = A5 ADC12MCTL5 = ADC12INCH_5 + ADC12SREF_1; // Ref=VREF, channel = A5 ADC12MCTL6 = ADC12INCH_6 + ADC12SREF_1; // Ref=VREF, channel = A6 ADC12MCTL7 = ADC12INCH_6 + ADC12SREF_1; // Ref=VREF, channel = A6 ADC12MCTL8 = ADC12INCH_6 + ADC12SREF_1; // Ref=VREF, channel = A6 ADC12MCTL9 = ADC12INCH_7 + ADC12SREF_1; // Ref=VREF, channel = A7 ADC12MCTL10 = ADC12INCH_7 + ADC12SREF_1; // Ref=VREF, channel = A7 ADC12MCTL11 = ADC12INCH_7 + ADC12SREF_1; // Ref=VREF, channel = A7 ADC12MCTL12 = ADC12INCH_12; // Ref=Vcc, channel = A12 ADC12MCTL13 = ADC12INCH_12; // Ref=Vcc, channel = A12 ADC12MCTL14 = ADC12INCH_12; // Ref=Vcc, channel = A12 ADC12MCTL15 = ADC12INCH_13 + ADC12EOS; // Ref=Vcc, channel = A13, end seq. ADC12CTL0 |= ADC12ENC; // Enable conversions
转换和内存读取 如下所示:
ADC12IFG = 0x00; // Clear flags ADC12CTL0 |= ADC12SC; // Start conversion while (!(ADC12IFG & 0x4000)); // Wait for conversion to complete Input1 = ADC12MEM3 + ADC12MEM4 + ADC12MEM5; Input1 = ANALOG_IBAT / 3; Input2 = ADC12MEM6 + ADC12MEM7 + ADC12MEM8; Input2 = ANALOG_ILAMP / 3; Input3 = ADC12MEM9 + ADC12MEM10 + ADC12MEM11; Input3 = ANALOG_VBAT / 3; Input4 = ADC12MEM0 + ADC12MEM1 + ADC12MEM2; Input4 = ANALOG_LIGHT / 3; Input5 = ADC12MEM15;
第一次转换始终成功。 但是、在第二次转换后、应用程序会挂起。 在调试模式中查看寄存器、值不会写入内存、并且在第二次 转换请求后中断标志不会被置位。
我们通过注释掉"ADC12IFG = 0x00"行并将内存段从 ADC12MEM[12-14]重新分配到 ADC12MEM[0-3]来解决这个问题。 换句话说-将使用 VCCS-基准的两个输入分开。
必须注意的是、在制造的1500块板中、只有 20块表现出这种行为。 我们做了广泛的电路跟踪、(几乎)排除了外部因素、尤其是 VCC 系列。
任何帮助都 是 感激的。 谢谢你。