大家好、我一直在尝试使用适用于 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 会向我显示以下错误、并且我的程序在调试期间只是挂起:
我尝试使用替代电位计、但错误相同。
非常感谢您的参与!
亚伦