W7500 mbed SDK Porting Guide
ADC Porting
예제 코드
#include "mbed.h"
int main() {
Serial pc(USBTX, USBRX);
pc.baud(115200);
AnalogIn ain(A0);
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 폴더에 있는 내용을 수정하면 호환성 문제가 발생 할 수 있으므로 수정하지 않는 것을 권한다.
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)
{
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
MBED_ASSERT(obj->adc != (ADCName)NC);
pinmap_pinout(pin, PinMap_ADC);
obj->pin = pin;
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();
while(ADC_IsInterrupt());
return ADC_ReadData();
}
uint16_t analogin_read_u16(analogin_t *obj)
{
uint16_t value = adc_read(obj);
return value;
}
float analogin_read(analogin_t *obj)
{
uint16_t value = adc_read(obj);
return (float)value * (1.0f / (float)0xFFF);
}