Apa yang dimaksud dengan "peta" saluran ADC, "", dan "jumlah" yang digunakan untuk pada MCU ATSAML21 ARM Microchip?

1

Saya sedang bekerja dengan mikrokontroler ARM Microchip ATSAML21J18B dan belajar cara mengatur input ADC. Datang dari dunia AVR, segalanya agak lebih rumit.

Fitur ADC (datasheet hal 1030, §42,4) menunjukkan bahwa ada hingga 20 input analog. Meneliti bagian multiplexing I / O (hal 29-30, §7.1), saya dapat melihat bahwa ada 20 AIN[xx]sebutan dalam kolom ADC pada tabel fungsi pin. Saya percaya saya benar memahami bahwa beberapa pin referensi VDDANA, VDDIOatau VSWOUTberdasarkan pada nilai-nilai dalam Pasokan kolom.

Saya mengerti bahwa Anda juga dapat menggabungkan saluran karena berbagai alasan yang saya tidak kenal.

Menggunakan Atmel "Start", ia telah menghasilkan metode init ADC berikut:

int32_t adc_async_init (struct adc_async_descriptor * const descr,
    batal * const hw,
    uint8_t * channel_map,
    uint8_t channel_max,
    uint8_t channel_amount,
    struct adc_async_channel_descriptor * const descr_ch,
    batal * const func)
{
    int32_t init_status;
    perangkat struct _adc_async_device *;
    ASSERT (descr && hw && channel_map && channel_amount && descr_ch);
    ASSERT (channel_amount <= (channel_max + 1));

    device = & descr-> device;

    untuk (uint8_t i = 0; i <= channel_max; i ++)
        channel_map [i] = 0xFF;

    descr-> channel_map = channel_map;
    descr-> channel_max = channel_max;
    descr-> channel_amount = channel_amount;
    descr-> descr_ch = descr_ch;
    init_status = _adc_async_init (perangkat, hw);

    if (init_status)
        mengembalikan init_status;

    device-> adc_async_ch_cb.convert_done = adc_async_channel_conversion_done;
    device-> adc_async_cb.window_cb = adc_async_window_threshold_reached;
    device-> adc_async_cb.error_cb = adc_async_error_occured;

    kembalikan ERR_NONE;
}

Pertanyaan saya adalah, apa argumen map, maxdan amountuntuk?

Contoh yang dihasilkan menunjukkan panggilan ke metode ini sebagai berikut:

// Definitions preceding main()
#define ADC_0_CH_AMOUNT 1
#define ADC_0_CH_MAX 0
struct adc_async_descriptor         ADC_0;
struct adc_async_channel_descriptor ADC_0_ch[ADC_0_CH_AMOUNT];
static uint8_t                      ADC_0_map[ADC_0_CH_MAX + 1];

// ADC init
adc_async_init(&ADC_0,
    ADC,
    ADC_0_map,
    ADC_0_CH_MAX,
    ADC_0_CH_AMOUNT,
    &ADC_0_ch[0],
    (void *)NULL);

Saya menganggap ini ada hubungannya dengan menggabungkan saluran, tetapi saya akui saya sangat bingung tentang cara mengatur satu saluran hanya untuk melakukan konversi 8-bit dasar.

Mungkin judul pertanyaan yang lebih baik adalah, "Jelaskan implementasi ADC Microchip / Atmel pada ATSAML21 seperti saya 5!" Ada begitu banyak fitur dan opsi tambahan sehingga saya benar-benar tersesat.

JYelton
sumber

Jawaban:

1

Saya tidak terbiasa dengan alat ini, tetapi tampaknya definisi struct adc_async_descriptordalam hal_adc_async.hfile:

/**
 * \brief ADC descriptor
 */
struct adc_async_descriptor {
    /** ADC device */
    struct _adc_async_device device;
    /** ADC callbacks type */
    struct adc_async_callbacks adc_async_cb;
    /** Enabled channel map */
    uint8_t *channel_map;
    /** Enabled maximum channel number */
    uint8_t channel_max;
    /** Enabled channel amount */
    uint8_t channel_amount;
    /** ADC channel descriptor */
    struct adc_async_channel_descriptor *descr_ch;
};

Juga adc_async_initberfungsi dan struct adc_async_channel_descriptordidokumentasikan dalam file yang sama.

Berdasarkan kode dalam hal_adc_async.c, saya kira channel_mapberisi indeks saluran ADC yang digunakan dalam aplikasi Anda. Saya tidak begitu yakin apa perbedaan antara channel_maxdan channel_amount.

Pada akhirnya cara terbaik untuk memahami kode abstraksi perangkat keras adalah dengan melihat register apa yang diaksesnya. Mungkin lebih mudah untuk hanya mempelajari deskripsi periferal dan menulis kode secara langsung mengakses registernya.

pengguna930473
sumber