MSPM0의 장점은 저렴한 가격에 고성능 아날로그 블럭을 가지고 있는 것인데 가장 저렴한 MPSM0C 시리즈를 이용하면 상용의 ADC 칩보다 저렴하고 간단한 시스템을 구성할 수 있다.
그래서 MSPM0C1104를 이용하여 ADC to UART 보드를 제작 해보려고 한다.
[MSPM0L1306 SSM] ADC 테스트 를 참고로 ADC 코드를 생성하려고 하는데 문제가 발생한다.
UART를 설정하고 ADC를 추가 하려고 하면 핀 부족으로 에러가 발생한다.
어떻게 문제를 해결해야 하나?
8핀의경우 ADC와 UART가 핀을 공유하고 있어서 동시에 사용할 수 없는 구조이다.
UART의 기능을 좀더 찾아보다 보니 TX만 사용할 수 있는 기능이 있다. RX핀을 ADC로 사용하고 TX로 ADC데이터를 전송하는 구조로 하면 될것 같다.
PA24(A3) 을 ADC로 사용하기 위해 input Chammel 항목을 3으로 설정해 준다.
처음에 채널 변경하는것이 어려웠는데 계속 사용하다보니 익숙해 지는것같다. 첨은 써보는 칩은 당연히 어려움이 있기 마련 이지만 해결 책은 많이 사용해 보는것 외는 별다른 방법이 없는것 같다.
그리고 Advaced Configuration에서 Sample Time 설정이 필요하다.
MSPM0C1104는 저렴하고 핀수도 적어 간단하게 적용할 곳이 많을것 같았는데 그러한 장점 때문에 제약 사항이 많은것같다. 이러한 경험을 바탕으로 프로젝트 적용전에 충분한 검토가 필요할것 같다.
MSPM0C1104를 이용해서 ADC값을 UART로 전송하는 코드
int put_str(const char* restrict s)
{
uint16_t i,len;
len = strlen(s);
for(i=0;i<len;i++)
{
DL_UART_transmitDataBlocking(UART_0_INST, s[i]);
}
return len;
}
volatile bool gCheckADC;
volatile uint16_t gADCResult;
void ADC12_0_INST_IRQHandler(void)
{
switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
gCheckADC = true;
break;
default:
break;
}
}
unsigned int GetADC(void)
{
unsigned int adc = 0;
DL_ADC12_startConversion(ADC12_0_INST);
while (false == gCheckADC) {
__WFE();
}
adc = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
gCheckADC = false;
DL_ADC12_enableConversions(ADC12_0_INST);
return adc;
}
int main(void)
{
unsigned char buf[20];
SYSCFG_DL_init();
NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
gCheckADC = false;
while (1)
{
delay_cycles(DELAY);
gADCResult = GetADC();
sprintf(buf, "%d\r\n", gADCResult);
put_str(buf);
//printf("%d\r\n", gADCResult);
}
}