大家好、我一直在尝试使用适用于 MSP430FR4133的 ADC 模块实施模拟双轴操纵杆、我已经开始连接两个电位器进行测试。 我已经遵循了 slac625h 库中的示例代码"msp430fr413x_adc10_10.c"示例。 我唯一更改的是从8位转换更改为10位转换、以及 int 格式、ADCSRF_0更改为 AVCC、AVSS。
代码:
#include <msp430.h>
unsigned int ADC_Result[3]; // 8-bit ADC conversion result array
unsigned int i;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
// Configure ADC A0~2 pins
SYSCFG2 |= ADCPCTL0 | ADCPCTL1 | ADCPCTL2;
// Disable the GPIO power-on default high-impedance mode to activate
// previously configured port settings
PM5CTL0 &= ~LOCKLPM5;
// Configure ADC
ADCCTL0 |= ADCSHT_2 | ADCON; // 16ADCclks, ADC ON
ADCCTL1 |= ADCSHP | ADCSSEL_1 | ADCSHS_2 | ADCCONSEQ_3; // ADC clock MODCLK, sampling timer, TA1.1B trig.,repeat sequence
ADCCTL2 |= ADCRES; // 10-bit conversion results
ADCMCTL0 |= ADCINCH_2 | ADCSREF_0; // A0~2(EoS); Vref=Vcc
ADCIE |= ADCIE0; // Enable ADC conv complete interrupt
// Configure reference
PMMCTL0_H = PMMPW_H; // Unlock the PMM registers
PMMCTL2 |= INTREFEN; // Enable internal reference
__delay_cycles(400); // Delay for reference settling
__no_operation();
// Configure TA1.1B as ADC trigger signal
// Note: The TA1.1B is configured for 200us 50% PWM, which will trigger ADC
// sample-and-conversion every 200us. The period of TA1.1B trigger event
// should be more than the time period taken for ADC sample-and-conversion
// and ADC interrupt service routine of each channel, which is about 57us in this code
TA1CCR0 = 200-1; // PWM Period, 200us
TA1CCTL1 = OUTMOD_7; // CCR1 reset/set
TA1CCR1 = 100; // CCR1 PWM duty cycle, 50%
TA1CTL = TASSEL__SMCLK | MC__UP | TACLR; // SMCLK, up mode, clear TAR
while(1)
{
i = 2;
ADCCTL0 |= ADCENC; // Enable ADC
TA1CTL |= TACLR; // Clear TAR to start the ADC sample-and-conversion
__bis_SR_register(LPM0_bits | GIE); // Enter LPM0 w/ interrupts
__no_operation(); // Only for debugger
}
}
// ADC interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC_VECTOR
__interrupt void ADC_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(ADCIV,ADCIV_ADCIFG))
{
case ADCIV_NONE:
break;
case ADCIV_ADCOVIFG:
break;
case ADCIV_ADCTOVIFG:
break;
case ADCIV_ADCHIIFG:
break;
case ADCIV_ADCLOIFG:
break;
case ADCIV_ADCINIFG:
break;
case ADCIV_ADCIFG:
ADC_Result[i] = ADCMEM0;
if(i == 0)
{
__no_operation(); // Only for debugger
i = 2;
}
else
{
i--;
}
break;
default:
break;
}
}
我在过去几天一直在这里,但我似乎不能完全包裹我的头,为什么 A0读数似乎不是从电位器正确的读数。 但 A1读数似乎是完美的。 A2仅为 P1.2按钮(工作正常;按下时显示0)。
下面是我的接线图:
(为糟糕的图表道歉)

我还注意到另一个异常情况、如果我在 A0上将电位器修整得太远(10k)、IAR 会向我显示以下错误、并且我的程序在调试期间只是挂起:

我尝试使用替代电位计、但错误相同。
非常感谢您的参与!
亚伦


