보드의 ADC기능을 확인하기위해 가변저항을 사용해 변화되는 전압값에따른 LED의 밝기 차이를 확인할 것이다.

 

 

먼저 타이머 코드에서 사용한 클럭설정과 관련된 함수들을 가져오자.

void SOSC_init_8MHz(void)
{
	SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) |
			SCG_SOSCDIV_SOSCDIV2(1);
	SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2)|SCG_SOSCCFG_EREFS_MASK;

	while(SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK);
	SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK;




	while(!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK));
}
void SPLL_init_160MHz(void){
	while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;
	SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2)|
					SCG_SPLLDIV_SPLLDIV2(3);

	SCG->SPLLCFG = SCG_SPLLCFG_MULT(24);

	while(SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK);
	SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;

	while(!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK));
}
void NormalRUNmode_80MHz(void){
	SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1);


	SCG->RCCR = SCG_RCCR_SCS(6)
			|SCG_RCCR_DIVCORE(0b01)
			|SCG_RCCR_DIVBUS(0b01)
			|SCG_RCCR_DIVSLOW(0b10);

	while(((SCG->CSR & SCG_CSR_SCS_MASK)>> SCG_CSR_SCS_SHIFT) != 6) {}
}

 

 

 

포트 설정에 관한 부분에서는

ADC 출력 값에 따라 LED 색이 바뀌는 예제이므로 Blue, Red, Green LED 모두를 사용한다.

void PORT_init(void){
   PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK;
   PORTD->PCR[PTD0] = PORT_PCR_MUX(1);
   PORTD->PCR[PTD15] = PORT_PCR_MUX(1);
   PORTD->PCR[PTD16] = PORT_PCR_MUX(1);

   PTD->PDDR |= 1<<PTD0
            |1<<PTD15
            |1<<PTD16;
}

 

 

본 ADC구현과 관련된 함수들이다.

더보기

ADC초기설정과 관련된 순서는 다음과 같다.

 

① PCC_ADC0 레지스터를 통해 ADC의 클럭을 선택하고 Enable한다.

② SC1[0] 레지스터를 통해 모듈의 conversion과 interrupt를 Disable한다.

③ CFG1 레지스터를 통해 ADC 입력 클럭과 해상도를 설정한다.

④ CFG2 레지스터를 통해 ADC의 sample time을 설정한다.

⑤ SW Trigger이고, Compare function은 사용하지 않으므로 SC2 레지스터를 0으로 세팅한다.

⑥ Calibration을 하지 않고 One conversion 모드이므로 SC3 레지스터를 0으로 세팅한다.

void ADC_init(void){
   PCC->PCCn[PCC_ADC0_INDEX] &= ~PCC_PCCn_CGC_MASK;
   PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1);
   PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK;

   ADC0->SC1[0] |= ADC_SC1_ADCH_MASK;

   ADC0->CFG1 &= ~ADC_CFG1_ADIV_MASK;

   ADC0->CFG1 |= ADC_CFG1_MODE(1);

   ADC0->CFG2 = ADC_CFG2_SMPLTS(12);

   ADC0->SC2 = 0x00000000;
   ADC0->SC3 = 0x00000000;
}

void convertAdcChan(uint16_t adcChan){
   ADC0->SC1[0] &= ~ADC_SC1_ADCH_MASK;
   ADC0->SC1[0] |= ADC_SC1_ADCH(adcChan);
}

uint8_t adc_complete(void){
   return ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) >>ADC_SC1_COCO_SHIFT);
}

uint32_t read_adc_chx(void){
   uint16_t adc_result = 0;
   adc_result = ADC0->R[0];

   return (uint32_t)((5000*adc_result)/0xFFF);
}

 

 

 

가변저항값에 따른 LED색의 변화확인

 

'NXP&S32DesignStudio' 카테고리의 다른 글

전자시계 만들기  (0) 2021.01.17
PWM  (0) 2021.01.17
Timer Interrupt  (0) 2021.01.17
GPIO & Switch  (0) 2021.01.17