BASIC4MCU | 질문게시판 | cc2530 ADC read 방법
페이지 정보
작성자 보랑이 작성일2018-02-19 13:21 조회127,398회 댓글10건본문
cc2530 이용하여 Adc 값 읽어 오고 있습니다.
RF_ADC <---> P0_1 에 연결되어 있습니다.
SetBitMask (Status2Reg, 0x80);
ADCCFG |= 0x02;
AdcValue = readADC(HAL_ADC_REF_125V, HAL_ADC_RESOLUTION_12, HAL_ADC_CHANNEL_1);
SetBitMask (CommandReg, 0x30);
ADCCFG &= ~0x02;
값을 얻어 오는데 일정한 값밖에 안뿌려 지더라구요..
핀설정해야하는 부분이 추가적으로 있는지 궁금합니다.
댓글 10
조회수 127,398master님의 댓글
master 작성일
SetBitMask (Status2Reg, 0x80);
ADCCFG |= 0x02;
AdcValue = readADC(HAL_ADC_REF_125V, HAL_ADC_RESOLUTION_12, HAL_ADC_CHANNEL_1);
SetBitMask (CommandReg, 0x30);
ADCCFG &= ~0x02;
이 5라인의 코드면 ADC를 읽어오는 건가요?
1. ADC 설정
2. ADC 변환 START
3. 변환이 완료 될 때까지 대기
4. ADC 레지스터 읽기
위 과정을 질문글의 소스에 대입해서 주석을 달아보세요
보랑이님의 댓글
보랑이
RF ADC 값을 읽어 오려구 하구요
1. ADC 설정
SetBitMask (Status2Reg, 0x80); //RC522 Sleep 상태에서 안테나 ON
APCFG |= 0x01; //Analog I/O enabled
P0SEL |= 0x01; //Port 0 function-select register
ADCCFG |= 0x02; // P0_1 START ADC
//init 부분에서 필요한 것과 불필요한 것이 무엇인지 모르겠습니다.
2. ADC 변환 START
AdcValue = readADC(HAL_ADC_REF_125V, HAL_ADC_RESOLUTION_12, HAL_ADC_CHANNEL_1); //ADC Read 해옴
3. 변환이 완료 될 떄 까지 대기
// 없음
4. ADC 레지스터 읽기
byte temp[5];
temp[0] = ((byte)(AdcValue / 100)) | 0x30;
temp[1] = (byte)((AdcValue / 10) % 10) | 0x30;
temp[2] = ((byte)(AdcValue % 10)) | 0x30;
temp[3] =0x20; temp[4] =0x20;
__TXD_puts ("Detect : ", 0, 0);
__TXD_puts(temp, 5, 0);
// Temp로 데이터를 뿌리는데 한가지 값만 나옵니다.
SetBitMask (CommandReg, 0x30); // Antenna OFF
ADCCFG &= ~0x02; // // P0_1 STOP ADC
master님의 댓글
master
원본 소스 출처 링크를 올려보세요
브레드피트님의 댓글
브레드피트
https://github.com/zhaohengyi/CC2530Example/blob/master/source/components/radios/cc2530/adc.c
에서 adc.c와 adc.h 사용하였습니다.
init 부분과 출력 부분은 만든 부분이구요.
master님의 댓글
master
링크 소스와 질문 소스의 유사점을 모르겠습니다.
전체 소스를 압축파일로 첨부해보세요
브레드피트님의 댓글
브레드피트
void main() {
byte temp[5];
SetBitMask (Status2Reg, 0x80); //RC522 Sleep 상태에서 안테나 ON
APCFG |= 0x01; //Analog I/O enabled
P0SEL |= 0x01; //Port 0 function-select register
ADCCFG |= 0x02; // P0_1 START ADC
AdcValue = readADC(HAL_ADC_REF_125V, HAL_ADC_RESOLUTION_12, HAL_ADC_CHANNEL_1); //ADC Read 해옴
temp[0] = ((byte)(AdcValue / 100)) | 0x30;
temp[1] = (byte)((AdcValue / 10) % 10) | 0x30;
temp[2] = ((byte)(AdcValue % 10)) | 0x30;
temp[3] =0x20; temp[4] =0x20;
__TXD_puts ("Detect : ", 0, 0);
__TXD_puts(temp, 5, 0);
SetBitMask (CommandReg, 0x30); // Antenna OFF
ADCCFG &= ~0x02; // // P0_1 STOP ADC
}
//----------------------------------------------
uint16 readADC(unsigned int reference, unsigned int resolution, unsigned int channel)
{
uint16 value;
ADC_ENABLE_CHANNEL(channel);
ADCIF = 0;
ADC_SINGLE_CONVERSION(reference | resolution | channel);
while(!ADCIF);
value = (ADCH << 8) & 0xff00;
value |= ADCL;
ADC_DISABLE_CHANNEL(channel);
// The variable 'value' contains 16 bits where
// bit 15 is a sign bit
// bit [14 .. 0] contain the absolute sample value
// Only the r upper bits are significant, where r is the resolution
// Resolution:
// 12 -> [14 .. 3] (bitmask 0x7FF8)
// 10 -> [14 .. 5] (bitmask 0x7FE0)
// 9 -> [14 .. 6] (bitmask 0x7FC0)
// 7 -> [14 .. 8] (bitmask 0x7F00)
return value;
}
전체 소스는 이거구요..
문제는 ADC로 읽어오는 값이 변하지 않는 다는 것입니다.
master님의 댓글
master 작성일변하지 않는 값은 얼마인가요?
브레드피트님의 댓글
브레드피트
447 으로 고정되어서 나오네요. readADC(HAL_ADC_REF_125V의 reference 값을 다르게 주면 약간 변하긴 하지만 RF ADC에 의해 변하지는 않아요.
master님의 댓글
master 작성일
APCFG|=0x01; // Analog I/O enabled
P0SEL|=0x01; // Port 0 function-select register
ADCCFG|=0x02; // P0_1 START ADC
위 설정에서
APCFG|=0x01;
APCFG=0x01;
비트 마스크 방법과 비트마스크를 사용하지 않은 것의 결과는 달라집니다.
또, 위 두개의 라인과 아래 라인의 비트 위치가 다릅니다.
P0SEL|=0x01;
P0SEL|=_BV(1);
위 두 라인의 결과가 전혀 다르다는 것이죠
제가 CC2530을 사용해보지 않은 상태니
체크를 해드리려면 상세한 자료를 첨부하셔야합니다.
선언부도 없고, 메인함수 무한루프도 빠져있는등
지금처럼 일부 코드만 올려서는 체크하지 못합니다.
회로도 및 데이터시트등 모든 자료를 첨부하셔야지 정확한 답변을 받을 가능성이 높아집니다.
브레드피트님의 댓글
브레드피트
감사합니다. 시도해보고 다시 자세한 질문드리도록 하겠습니다.