0

我有一个连接到我的 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 芯片。

4

1 回答 1

0

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

于 2019-02-18T18:24:35.810 回答