[WIZwiki-W7500 mbed porting Guide] 6. ADC

0
771

ADC Porting

예제 코드

[code language=”cpp”]
#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);
}
}
[/code]

수정할 필요 없는 코드

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로 읽어 옴

[code language=”cpp”]
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
}
[/code]

NO COMMENTS