ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • W7500 mbed SDK Porting Guide (6/6)
    IT 개발/mbed 2015.10.08 15:04

    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
    }
    


    'IT 개발 > mbed' 카테고리의 다른 글

    How to use pyOCD for new target MCU like W7500  (0) 2015.10.08
    WIZwiki_W7500 CMSIS-DAP Porting  (0) 2015.10.08
    W7500 mbed SDK Porting Guide (6/6)  (0) 2015.10.08
    W7500 mbed SDK Porting Guide (5/6)  (0) 2015.10.08
    W7500 mbed SDK Porting Guide (4/6)  (0) 2015.10.08
    W7500 mbed porting Guide ( 3/6 )  (0) 2015.10.08

    댓글 0

Designed by Tistory.