在Teensy 2.0 ++上模拟测量不正确

时间:2019-02-17 20:09:05

标签: avr adc teensy

我有一个连接到Teensy 2.0 ++的操纵杆,我想从中读取模拟值。

我从PJRC那里获得了此实现:

static uint8_t aref = (1<<REFS0); // default to AREF = Vcc, this is a 5V Vcc Teensy

void analogReference(uint8_t mode)
{
    aref = mode & 0xC0;
}

// Mux input
int16_t adc_read(uint8_t mux)
{
#if defined(__AVR_AT90USB162__)
    return 0;
#else
    uint8_t low;

    ADCSRA = (1<<ADEN) | ADC_PRESCALER;     // enable ADC
    ADCSRB = (1<<ADHSM) | (mux & 0x20);     // high speed mode
    ADMUX = aref | (mux & 0x1F);            // configure mux input
    ADCSRA = (1<<ADEN) | ADC_PRESCALER | (1<<ADSC); // start the conversion
    while (ADCSRA & (1<<ADSC)) ;            // wait for result
    low = ADCL;                 // must read LSB first
    return (ADCH << 8) | low;           // must read MSB only once!
#endif
}

// Arduino compatible pin input
int16_t analogRead(uint8_t pin)
{
#if defined(__AVR_ATmega32U4__)
    static const uint8_t PROGMEM pin_to_mux[] = {
        0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
        0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
    if (pin >= 12) return 0;
    return adc_read(pgm_read_byte(pin_to_mux + pin));
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
    if (pin >= 8) return 0;
    return adc_read(pin);
#else
    return 0;
#endif
}

我的X和Y引脚连接到F1和F0,我想使用以下代码检索值:

long map(long x, long in_min, long in_max, long out_min, long out_max) // map method shamelessy ripped from Arduino
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

joy_ly       = map(analogRead(0), 0, 65535, 0, 255);
joy_lx       = map(analogRead(1), 0, 65535, 0, 255);

我用万用表测量了游戏杆,它的工作原理非常完美(中心为2.43V,最小为0V,最大为5V),但是中心值总是最终非常接近零。

我在做错什么吗?

注意:这是at90usb1286芯片。

1 个答案:

答案 0 :(得分:0)

ADC最大值为1024,而不是65535。