W7500 mbed SDK Porting Guide (6/6)

2015. 10. 8. 15:042018년 이전 관심사/mbed

반응형

W7500 mbed SDK Porting Guide

ADC Porting

예제 코드

#include "mbed.h"

int main() {

    Serial pc(USBTX, USBRX); // tx, rx
    pc.baud(115200);
    AnalogIn ain(A0); //is ADC0_0: must be channel 0 of ADC0 or ADC1

    pc.printf("Starting program...\r\n");

    while(1)
    {
        pc.printf("percentage: 3.3f\r\n", ain.read() * 100.0f);
        pc.printf("normalized: 0x%04X\r\n", ain.read_u16());
        wait(1);
    }
}

수정할 필요 없는 코드

api 폴더, common 폴더, hal 폴더에 있는 내용을 수정하면 호환성 문제가 발생 할 수 있으므로 수정하지 않는 것을 권한다.

  • api/AnalogIn.h

targets/hal/TARGET_WIZNET/TARGET_W7500x/analogin_api.c

특이사항
  • WIZWiki Board의 ADC Pin은 ADC_CH0, ADC_CH1, ADC_CH2, ADC_CH3, ADC_CH4, ADC_CH5만 사용함
  • analogin_read 함수는 출력되는 analog 값을 0 ~ 1 사이의 값으로 modulation 함
  • analgoin_read_u16 함수는 출력되는 analog 값을 16bit로 읽어 옴

ADC_TypeDef * AdcHandle;

int adc_inited = 0;

void analogin_init(analogin_t *obj, PinName pin)
{
    // Get the peripheral name from the pin and assign it to the object
    obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);

    MBED_ASSERT(obj->adc != (ADCName)NC);

    // Configure GPIO
    pinmap_pinout(pin, PinMap_ADC);

    // Save pin number for the read function
    obj->pin = pin;

    // The ADC initialization is done once
    if (adc_inited == 0) {
        adc_inited = 1;

        ADC_Init();
    }
}

static inline uint16_t adc_read(analogin_t *obj)
{
    ADC_CH adc_ch;

    switch (obj->pin) {
        case PC_15:
            adc_ch = ADC_CH0;
            break;
        case PC_14:
            adc_ch = ADC_CH1;
            break;
        case PC_13:
            adc_ch = ADC_CH2;
            break;
        case PC_12:
            adc_ch = ADC_CH3;
            break;
        case PC_11:
            adc_ch = ADC_CH4;
            break;
        case PC_10:
            adc_ch = ADC_CH5;
            break;
        default:
            return 0;
    }

    ADC_ChannelSelect(adc_ch);
    ADC_Start();

    // Wait end of conversion and get value
    while(ADC_IsInterrupt());
    return ADC_ReadData();
}

uint16_t analogin_read_u16(analogin_t *obj)
{
    uint16_t value = adc_read(obj);
    // 12-bit to 16-bit conversion
    return value;
}

float analogin_read(analogin_t *obj)
{
    uint16_t value = adc_read(obj);

    return (float)value * (1.0f / (float)0xFFF); // 12 bits range
}


반응형