TMS320F28069์ ๋ด๋ถ ADC๋ 12 ๋นํธ์ ํด์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. SAR ํ์ ์ ADC์ด๋ฉฐ, ADC์ ์ ๋ ฅ๋จ์๋ MUX์ S&H ํ๋ก๊ฐ ๋ด์ฅ๋์ด ์๋ค.
1) ๊ตฌ์ฑ
TMS320F28069์ ๋ด์ฅ๋์ด ์๋ ADC๋ ์๋์ ๊ฐ์ ๋ธ๋ญ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ ๋ ฅ ์ฑ๋์ด A, B ํฌํธ๋ก ๊ฐ๊ฐ 8 ์ฑ๋์ฉ ๊ตฌ์ฑ๋์ด ์์ด์ ์ ๋ ฅ์ฑ๋์ ์ต๋ 16๊ฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ ๋ฒ์๋ 0V ~ 3.3V๋ก ๊ณ ์ ๋์ด ์๋ค.
์ ๋ ฅ๋ ์ ํธ๊ฐ ๋ค์์ผ๋ก ๋ง๋๋ ๋ธ๋ญ์ MUX์ด๋ค. ๊ฐ ํฌํธ๋ณ๋ก ๋ฉํฐํ๋ ์๊ฐ ์์ผ๋ฉฐ, 8์ฑ๋ ์ ๋ ฅ ํ 1์ฑ๋ ์ถ๋ ฅํด์ฃผ๋ ๊ตฌ์กฐ์ด๋ค. ์ด๋ CHSEL ๋นํธ๋ก ๋ณํํ ์ ๋ ฅ ์ฑ๋์ ๊ณ ๋ฅผ ์ ์๋ค.
CHSEL ๋นํธ๋ ADCSOCxCTL ๋ ์ง์คํฐ์ 6~9๋ฒ ๋นํธ์ด๋ค. 4๋นํธ ์ค ์์ ๋นํธ์ธ 9๋ฒ ๋นํธ๋ ํฌํธ ์ ํ ๋นํธ์ด๊ณ , ๋๋จธ์ง 3๋นํธ๋ ์ฑ๋ ์ ํ ๋นํธ์ด๋ค. ์ด๋ ADCSAMPLEMODE ๋ ์ง์คํฐ์ SIMULENx ๋นํธ๋ค๋ก ์์ฐจ์ ์ํ๋ง ๋ชจ๋์ ๋๊ธฐ ์ํ๋ง ๋ชจ๋๋ฅผ ์ ํํ์ฌ ์ปจ๋ฒ์ ํ ์๋ ์๋ค.
ADCSOCxCTL ๋ ์ง์คํฐ


ADC์ ๊ธฐ๋ณธ ๋์์ ํธ๋ฆฌ๊ฑฐ๋ SOC๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ๋จ์ผ ๋ณํ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
SOC๋ Start Of Conversion์ด๋ค.
์์ฐจ ์ํ๋ง์ ์์ ์ ํ ์์ด a์ฑ๋๊ณผ b์ฑ๋์ ๋ชจ๋ ๋ณํํ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋์ ์ํ๋ง ๋ชจ๋ ์ง์์ ๋ถ์ฐ๋ฌผ์ ์์ ์ด๋ฃฌ ๋์ ์ฑ๋์ ์ํ๋ง ์ปคํจ์ํฐ๋ ์ํ๋ ์์ฐจ ์ํ๋ง ACQPS์ฐฝ๊ณผ ๋์์ ํด๋น ์ ๋ ฅ์ ์ฐ๊ฒฐ๋๋ค๋ ๊ฒ์ด๋ค.
ADC๋ ํ์ด๋ง๋ ์ฑ๋์ ์ํ์ ๋ณํํ์ง ์๋๋ค.(๋์ ์ํ๋ง ๋ชจ๋๋ ์น์ 8/6์ ์ค๋ช ๋์ด ์๋ค.)
ADC ์ธํ ๊ฒํ
EALLOW;
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; // Enable non-overlap mode:1
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // trips after AdcResults latch:1
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Reference select, External : 1, Internal : 0
ADCCTL2 ๋ ์ง์คํฐ์ 1๋ฒ ๋นํธ์ธ ADCNONOVERLAP์ ์ํ์ ์ค๋ฒ๋ฉ ํ์ฉ์ ๋ํ ๋นํธ์ด๋ค.
ADCCTL1 ๋ ์ง์คํฐ์ 2๋ฒ ๋นํธ์ธ INTPULSEPOS๋ ๋ญ์ง
0 : ADC๊ฐ ๋ณํ์ ์์ํ ๋ INT ํ์ค ์์ฑ ๋ฐ์ (์ํ๋ง๋ ์ ํธ์ ์ํ ํ์ค์ ๋ค๊ฑฐํฐ๋ธ ์์ง)
1 : INT ํ์ค ์์ฑ์ ADC ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ๊ณผ ๋ ์ง์คํฐ์ ๋์นญ๋๊ธฐ 1์ฃผ๊ธฐ ์ ์ ๋ฐ์ํ๋ค.
์ธํฐ๋ฝํธ ์์ฑ ์์น? 0์ด๋ฉด ์ปจ๋ฒ์ ์ ๋ฐ์์ด๊ณ 1์ด๋ฉด ์ปจ๋ฒ์ ํ ๊ฒฐ๊ณผ ๋ ์ง์คํฐ์ ์ฎ๊ธฐ๊ธฐ ์ ์ ๋ฐ์ํ๊ณ ?
ADCCTL1 ๋ ์ง์คํฐ(์)์ 3๋ฒ ๋นํธ์ธ ADCREFSEL์ ADC ๋ ํผ๋ฐ์ค ์ ์์ ๋ด๋ถ์ฉ์ ์ธ ๊ฒ์ธ์ง ์ธ๋ถ์ฉ์ ์ธ ๊ฒ์ธ์ง ์ ํํ๋ ๋นํธ์ด๋ค.
๋ ํผ๋ฐ์ค ์ ์์ ๋ด๋ถ์ ์๋ ๊ฒ์ ์ธ ๊ฒ์ธ์ง ์ธ๋ถ์ ์ถ๊ฐํ ๊ฒ์ ์ธ ๊ฒ์ธ์ง ์ ํ๋ ์ธํ
๋นํธ์ด๋ค.
ํด๋น ๋นํธ๋ฅผ '0'์ผ๋ก ์ธํ ํ๋ฉด ๋ด๋ถ ๋ฐด๋์บก ๋ ํผ๋ฐ์ค ํ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ธ๋ถ ๋ ํผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํด๋น ๋นํธ๋ฅผ '1'๋ก ์ธํ ํ๋ฉด 19๋ฒ ํ์ธ ADCINA0 ์ฑ๋์ VREFHI๋ก ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ADCINA0 ์ฑ๋์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ถ ๋ ํผ๋ฐ์ค ์ฌ์ฉ์ GND๋ 21๋ฒ VSS๋ฅผ VREFLO๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
//-------- Board Temperature: ADCINT1 -> EOC0 -> SOC0 -> ADCINA6 -----------------
AdcRegs.INTSEL1N2.bit.INT1E = 1; // Enabled ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; // Disable ADCINT1 Continuous mode
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; // setup EOC0 to trigger ADCINT1
AdcRegs.ADCSOC0CTL.bit.CHSEL = 6; // set SOC0 channel select to ADCINA6
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 10; // set SOC0 start trigger on EPWM3B, due to round-robin SOC0 converts first then SOC1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 3; //2017.07.06
INTSELxNy ๋ ์ง์คํฐ์ 5๋ฒ ๋นํธ๋ ADC ์ธํฐ๋ฝํธ ํ์ฑํ ๋นํธ์ด๋ค.
๋์ผ ๋ ์ง์คํฐ์ 6๋ฒ ๋นํธ๋ ADCINTFLG ๋ ์ง์คํฐ์ ADCINTx ํ๋๊ทธ๊ฐ ํด๋ฆฌ์ด ๋์ง ์์๋ EOC ํ์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ADC ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์๋๊ฒ ํด์ฃผ๋ ๋นํธ์ด๋ค.
ADCINTx ํ๋๊ทธ(ADCINTFLG ๋ ์ง์คํฐ์ ์์)๊ฐ ์ฌ์ฉ์์ ์ํด ์ง์์ง ๋๊น์ง ๋ ์ด์์ ADCINTx ํ์ค๋ ์์ฑ๋์ง ์์ต๋๋ค.
ADCINTx ํ์ค๋ ํ๋๊ทธ ๋นํธ์ ํด๋ฆฌ์ด ์ฌ๋ถ์ ๊ด๊ณ์์ด EOC ํ์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋ฉ๋๋ค.
EOC ํ์ค๋ ์๋์ INTSELxNy ๋ ์ง์คํฐ์ 8~12๋ฒ ๋นํธ ์ธํ ์ผ๋ก ์ ํํ ์ ์๋ค.
ADCSOCxCTL ๋ ์ง์คํฐ์ 6~9๋ฒ ๋นํธ๋ SOC ์ฑ๋ ์ ํํ๋ ๋นํธ๋ค์ด๋ค. SOCx๊ฐ ADC์ ์ํด ์์ ๋ ๋ ๋ณํ๋ ์ฑ๋์ ์ ํํ๋ค.
๋์ผ ๋ ์ง์คํฐ์ 11~15๋ฒ ๋นํธ์ธ TRIGSEL์ SOC ํธ๋ฆฌ๊ฑฐ ์์ค๋ฅผ ์ ํํ๋ ๋นํธ์ด๋ค.
SOCx์ ์ฐ์ ์์๊ฐ ๋ถ์ฌ๋๋ฉด ์์ํ๋ค. ๋ณํ์ ์์ํ๊ธฐ ์ํด ADCSOCFLG1 ๋ ์ง์คํฐ์์ ๊ฐ SOCx ํ๋๊ทธ๋ฅผ ์ค์ ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ตฌ์ฑํ๋ค.
์ด ์ค์ ์ ADCINTSOCSEL1 ๋๋ ADCINTSOCSEL2 ๋ ์ง์คํฐ์ ๊ฐ SOCx ํ๋์ ์ํด ์ฌ์ ์๋ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ ๊ฐ์ ๋ ์ง์คํฐ์ 0~5๋ฒ ๋นํธ์ ํด๋นํ๋ ACQPS๋
SOCx ํ๋ ํ๋ฆฌ์ค์ผ์ผ. SOCx์ ์ํ ๋ฐ ํ๋ ์๋์ฐ๋ฅผ ์ ์ดํ๋ค. ์ด๊ฒ ๋ฌด์จ๋ง์ด๊ณ ?
EPwm3Regs.ETSEL.bit.SOCBEN = 1; // SOCB ET Enable
EPwm3Regs.ETSEL.bit.SOCBSEL = 2; // SCCB Select
EPwm3Regs.ETPS.bit.SOCBPRD = 1; // SOCB ET period
EPwm3Regs.TBCTL.bit.CTRMODE = 0; // Count mode: Up-count
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 1; // TBCLK = [SYSCLKOUT / ((HSPCLKDIV*2) * 2^(CLKDIV))]
EPwm3Regs.TBCTL.bit.CLKDIV = 1; // TBCLK = [150MHz / (2*2)] = 37.5MHz
EPwm3Regs.TBPRD = 37499; // TBPERIOD = (TBPRD+1)/TBCLK = 37500/37.5MHz = 1us(1KHz)
EPwm3Regs.TBCTR = 0x0000; // TB count initial
EDIS;
ETSEL ๋ ์ง์คํฐ์ 15๋ฒ ๋นํธ์ธ SOCBEN์ EPWMxSOCB ํ์ค์ ํ์ฑํ ํ์ด๋ค.
๋ ๋ ์ง์คํฐ์ 12~14๋ฒ ๋นํธ์ธ SOCBSEL์ EPWMxSOCB์ ์ต์ ์ ํ ๋นํธ์ด๋ค.
2๋ก ์ธํ ํ๋ฉด TBCTR๊ณผ TBPRD๋ ๊ฐ๋ค. (์นด์ดํฐ์ ์ฃผ๊ธฐ)
ETPS ๋ ์ง์คํฐ์ 12~13๋ฒ ๋นํธ์ธ SOCBPRD๋ ePWM ADC ๋ณํ ์์ B ์ด๋ฒคํธ(EPWMxSOCB) ์ฃผ๊ธฐ ์ ํ ๋นํธ์ด๋ค.
์ด ๋นํธ๋ EPWMxSOCB ํ์ค๊ฐ ์์ฑ๋๊ธฐ ์ ์ ๋ฐ์ํด์ผ ํ๋ ์ ํ๋ ETSEL[SOCBSEL] ์ด๋ฒคํธ ์๋ฅผ ๊ฒฐ์ ํ๋ค. ์์ฑํ๋ ค๋ฉด ํ์ค๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค(ETSEL[SOCBEN] = 1). ์ด์ ๋ณํ ์์(ETFLG[SOCB] = 1)์์ ์ํ ํ๋๊ทธ๊ฐ ์ค์ ๋๋๋ผ๋ SOCB ํ์ค๊ฐ ์์ฑ๋ฉ๋๋ค. SOCB ํ์ค๊ฐ ์์ฑ๋๋ฉด ETPS[SOCBCNT] ๋นํธ๊ฐ ์๋์ผ๋ก ์ง์์ง๋ค.
TBCTL ๋ ์ง์คํฐ์ 0~1๋ฒ ๋นํธ์ธ CTRMODE๋ ์นด์ดํฐ์ ์ฆ๊ฐ, ๊ฐ์ ๋ฑ์ ์ค์ ํ๋ ๋นํธ์ด๋ค.
๋์ผ ๋ ์ง์คํฐ์ 7~9๋ฒ ๋นํธ์ธ HSPCLKDIV๋ ํ์ ๋ฒ ์ด์ค ํด๋ญ ์ธํ ์ ์ํ ๋นํธ์ด๋ค. ์๋ CLKDIV ๋นํธ๋ ํจ๊ป ๋ณด์.
์ฌ๊ธฐ์ SYSCLKOUT์ด 90MHz์ด๊ณ HSPCLKDIV๋ 1๋ก ์ธํ ํ์ฌ 2์ด๊ณ , CLKDIV๋ 1๋ก ์ธํ ํ์ฌ 2์ด๋ค. ํ์ ๋ฒ ์ด์ค ํด๋ญ(TBCLK)์ 90MHz / ( 2 x 2 )๋ก 22.5MHz์ด๋ค. ์ ์ฃผ์์๋ ์๋ชป ์ด ๋ด์ฉ์ธ๋ฏ ํ๋ค.
TBPRD ๋ ์ง์คํฐ๋ 0~15๋ฒ ๋นํธ๊ฐ ๋ชจ๋ ํ์ ๋ฒ ์ด์ค ์ฃผ๊ธฐ๋ฅผ ์ธํ ํ๊ธฐ ์ํ ๋นํธ์ด๋ค. ์ด๊ฑธ๋ก PWM์ ์ฃผํ์๋ฅผ ์ค์ ํ๋ค.
TBCTL[PRDLD]๊ฐ 0์ด๋ฉด ์๋์ฐ๊ฐ ํ์ฑํ๋๊ณ ์ฐ๊ธฐ ๋๋ ์ฝ๊ธฐ๊ฐ ์๋์ผ๋ก ์๋์ฐ ๋ ์ง์คํฐ๋ก ์ด๋ํ๋ค. ์ด ๊ฒฝ์ฐ ํ์ฑ ๋ ์ง์คํฐ๋ ์๊ฐ ๊ธฐ๋ฐ ์นด์ดํฐ๊ฐ 0์ผ ๋ ์๋์ฐ ๋ ์ง์คํฐ์์ ๋ก๋๋๋ค.
TBCTL[PRDLD]๊ฐ 1์ด๋ฉด ์๋์ฐ๊ฐ ๋นํ์ฑํ๋๊ณ ๋ชจ๋ ์ฐ๊ธฐ ๋๋ ์ฝ๊ธฐ๊ฐ ํ์ฑ ๋ ์ง์คํฐ์ธ ํ๋์จ์ด๋ฅผ ๋ฅ๋์ ์ผ๋ก ์ ์ดํ๋ ๋ ์ง์คํฐ๋ก ์ง์ ์ด๋ํ๋ค.
์ ๋ ์ง์คํฐ ์ธํ ์ ์๋์ TBCTL ๋ ์ง์คํฐ์ 3๋ฒ ๋นํธ์ธ PRDLD ์ค์ ์ ๋ฐ๋ผ ์ํฅ์ ๋ฐ๋๋ค.
TBCTR ๋ ์ง์คํฐ๋ ํ์ ๋ฒ ์ด์ค ์นด์ดํฐ ๋ ์ง์คํฐ์ด๋ค. 0~15๋ฒ ๋นํธ๋ก ์นด์ดํฐ๋ฅผ ์ธํ ํ๊ฑฐ๋ ์ฝ์ ์ ์๋ค.
์ด ๋นํธ์ ๊ธฐ๋กํ๋ฉด ํ์ฌ ํ์๋ฒ ์ด์ค ์นด์ดํฐ ๊ฐ์ด ์ค์ ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ๋ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ๋ ์ฆ์ ๋ฐ์ํ๋ฉฐ, ์ฐ๊ธฐ๋ ํ์๋ฒ ์ด์ค ํด๋ญ(TBCLK)๊ณผ ๋๊ธฐํ๋์ง ์์ผ๋ฉฐ ๋ ์ง์คํฐ๊ฐ ์์ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ryuss2&logNo=80184085464
#pragma CODE_SECTION(Isr_ADC,"ramfuncs")
interrupt void Isr_ADC(void)
{
temp0 = AdcResult.ADCRESULT0; //board temperature
temp1 = AdcResult.ADCRESULT1; //dc current
temp2 = AdcResult.ADCRESULT2; //dc voltage
ADC_buffer1[ADC_cnt1] = AdcResult.ADCRESULT0 >> 1;
ADC_buffer2[ADC_cnt2] = AdcResult.ADCRESULT1 >> 1;
ADC_buffer3[ADC_cnt3] = AdcResult.ADCRESULT2 >> 1;
ADC_buffer4[ADC_cnt4] = Read_Ext_ADC();
ADC_cnt1 == BUFFER_LENGTH1 - 1 ? ADC_cnt1 = 0, Buffer_filled1 = 1 : ADC_cnt1++;
ADC_cnt2 == BUFFER_LENGTH2 - 1 ? ADC_cnt2 = 0, Buffer_filled2 = 1 : ADC_cnt2++;
ADC_cnt3 == BUFFER_LENGTH3 - 1 ? ADC_cnt3 = 0, Buffer_filled3 = 1 : ADC_cnt3++;
ADC_cnt4 == BUFFER_LENGTH4 - 1 ? ADC_cnt4 = 0, Buffer_filled4 = 1 : ADC_cnt4++;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // Clear ADCINT1 flag reinitialize for next SOC
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
}
ADCINTFLGCLR ๋ ์ง์คํฐ๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ADC ์ธํฐ๋ฝํธ ํ๋๊ทธ๋ฅผ ํด๋ฆฌ์ดํด์ฃผ๋ ๋ ์ง์คํฐ์ด๋ค. ํด๋ฆฌ์ดํ๊ณ ์ ํ๋ ๋นํธ์ 1์ ์จ์ฃผ๋ฉด ๋๋ค.
'Embedded HW & FW > TI (C2000...)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TMS320F280049 ํด๋ญ์ธํ (0) | 2024.06.03 |
---|---|
CLB๊ฐ ๋ฌด์์ธ๊ฐ? (0) | 2023.08.18 |
[TI] Flash Boot ์ฌ์ฉ์ DELAY_US ๋๋ฌธ์ ๋จนํต๋๋ ํ์ (0) | 2023.03.03 |
[TI] TMS320F28069๋ก ADC ADS8320 ์๊ฒ ๊ฐ ์ฝ๊ธฐ (0) | 2023.03.03 |
[TI] TMS320F28069๋ก EEPROM์ธ 25LC040A-E/OT๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํ (0) | 2023.03.03 |
์ต๊ทผ๋๊ธ