[FreeScale]/KINETIS2016. 2. 15. 01:46

K20 EVM - 16bit ADC 성능 테스트

K20 EVM - 16bit ADC 성능 테스트


저렴한 16bit ADC 솔루션이 필요해 검토중에 K20을 들여다 들여다보고 있다.


레퍼런스 없이 그냥 테스트 해 보니 값이 많이 튄다. 저렴한 MCU라 그런가?

이정도면 쓰기 힘들것 같은데...

레퍼런스 제대로 잡고 하드웨어 평균 필터 적용하면 좀더 좋아지지 않을까... 실험이 좀더 필요 한것 같다.




Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 17. 22:30

K20 EVM - Kinetis Cortex-M4 K20 TSI 정전용량 스위치 테스트

K20 EVM - Kinetis Cortex-M4 K20 TSI 정전용량 스위치 테스트




요즘 출시되는 대부분의 MCU들은 정전용량 터치센서를 위한 하드웨어 블럭을 기본으로 제공하는것 같다. 사용해 보았던 CAP Sensor MCU 중에는 가장 사용하기 편리하고 기능이 풍부한것 같다.



K20 TSI 테스트 동영상





K20 TSI 블록도




K20 EVM 보드에서 TSI9(PB16), TSI10(PB17) 포트를 이용하여 테스트 했다.






K20 TSI 초기화 함수 소스코드


void TSI_Init(void) 

{

//PORTB, TSI클럭 enable

    SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_TSI_MASK;


//PORT 할당

    PORTA_PCR16 = PORT_PCR_MUX(0);

    PORTA_PCR17 = PORT_PCR_MUX(0);


// Clear the EOSF (End of Scan) flag

    TSI0_GENCS |= TSI_GENCS_EOSF_MASK;


    TSI0_GENCS |= TSI_GENCS_NSCN(10) | // Set number of consecutive scans per electrode to 11

    TSI_GENCS_PS(4) | // Set electrode oscillator prescaler to divide by 16

    TSI_GENCS_STPE_MASK | // Keep TSI running when MCU goes into low power mode

    TSI_GENCS_LPSCNITV(7); // Low power mode scan interval is set to 50 msec

    TSI0_SCANC |= (TSI_SCANC_EXTCHRG(8) | // Set ext oscillator charge current to 18 uA

    TSI_SCANC_REFCHRG(15) | // Set reference osc charge current to 32 uA

    TSI_SCANC_SMOD(10) | // Set scan period modulus to 10

    TSI_SCANC_AMPSC(1) | // Divide input clock by 2

    TSI_SCANC_AMCLKS(0)); // Set active mode clock source to LPOSCCLK


    //TSI0_GENCS |= TSI_GENCS_LPCLKS_MASK; // Set low power clock source to VLPOSCCLK


    TSI0_PEN = TSI_PEN_PEN9_MASK | TSI_PEN_PEN10_MASK;

    

    //low power mode only one pin may be active

    TSI0_PEN |= TSI_PEN_LPSP(9);

// Enables TSI

    TSI0_GENCS |= TSI_GENCS_TSIEN_MASK;  

}





TSIx_CNTR

터치센서의 감도는 TSIxCNTR 레제스터에서 오실레이션 카운트값을 읽으면 알 수 있다.

2 채널당 하나의 레지스터를 할당하고 있다.



K20 TSI 카운트값 리드 함수

unsigned int ReadTSI(int Number)

{

//Software Trigger Start

TSI0_GENCS |= TSI_GENCS_SWTS_MASK;

while(!(TSI0_GENCS & TSI_GENCS_EOSF_MASK));

// Clear the EOSF (End of Scan) flag

    TSI0_GENCS |= TSI_GENCS_EOSF_MASK;


return *(electrodeHW[Number].counterRegister);

}





Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 10. 23:30

K20 EVM - Kinetis Cortex-M4 TFT LCD 테스트

K20 EVM - Kinetis Cortex-M4 TFT LCD 테스트



Cortex-M4 코어를 가진 K20 EVM보를 이용하여 TFT-LCD 출력 테스트를 했다.

50Mhz에서 400x320 픽셀의 TFT LCD에 1프레임 출력하는데 18ms정도 소요된다.



[NET-EVB SM] 확장 테스트 보드를 이용하여 SD Card의 BMP이미지를 출력하도록 했다.









K20 EVM TFT LCD 출력 테스트 동영상




K20 TFT LCD 드라이버 소스코드정리
//-----------------------------------------------------------------------------
#define _SPI0_IO_INIT() PORTD_PCR0 = PORT_PCR_MUX(0x2);\
PORTD_PCR1 = PORT_PCR_MUX(0x2);\
PORTD_PCR2 = PORT_PCR_MUX(0x2);\
PORTD_PCR3 = PORT_PCR_MUX(0x2);
                                        
                                        
                                        

#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1

#define LCD_LAT_BIT BIT16
#define LCD_LAT_PORT GPIOB
#define LCD_LAT_ON() sbi(LCD_LAT_PORT, LCD_LAT_BIT) 
#define LCD_LAT_OFF() cbi(LCD_LAT_PORT, LCD_LAT_BIT) 
#define LCD_DATA_LATCH() LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT BIT17
#define LCD_EN_PORT GPIOB
#define LCD_ENABLE() cbi(LCD_EN_PORT, LCD_EN_BIT) 
#define LCD_DISABLE() sbi(LCD_EN_PORT, LCD_EN_BIT) 

#define LCD_RST_BIT //BIT8
#define LCD_RST_PORT //PORTB
#define LCD_RST_ON() //Sbi(LCD_RST_PORT, LCD_RST_BIT) 
#define LCD_RST_OFF() //Cbi(LCD_RST_PORT, LCD_RST_BIT) 

#define LCD_RS_BIT BIT0
#define LCD_RS_PORT GPIOA
#define LCD_RS_OFF() cbi(LCD_RS_PORT, LCD_RS_BIT) 
#define LCD_RS_ON() sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT BIT3
#define LCD_WR_PORT GPIOA
#define LCD_WR_OFF() cbi(LCD_WR_PORT, LCD_WR_BIT) 
#define LCD_WR_ON() sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT ///BIT9
#define LCD_RD_PORT //PORTB
#define LCD_RD_OFF() //Cbi(LCD_RD_PORT, LCD_RD_BIT) 
#define LCD_RD_ON() //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT BIT3
#define LCD_BL_PORT GPIOC
#define LCD_BL_OFF() cbi(LCD_BL_PORT, LCD_BL_BIT) 
#define LCD_BL_ON() sbi(LCD_BL_PORT, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data) PORTD = (Data>>8);\
                                    LCD_DATA_LATCH();\
                                    PORTD = (Data&0xFF);

#define TFTGpioInit() SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;\
                                        SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;\
                                        PORTA_PCR0 = PORT_PCR_MUX(1);\
                                        PORTA_PCR3 = PORT_PCR_MUX(1);\
PORTB_PCR16 = PORT_PCR_MUX(1);\
                                        PORTB_PCR17 = PORT_PCR_MUX(1);\
                                        PORTC_PCR3 = PORT_PCR_MUX(1);\
                                        PORTD_PCR0 = PORT_PCR_MUX(1);\
                                        PORTD_PCR1 = PORT_PCR_MUX(1);\
                                        PORTD_PCR2 = PORT_PCR_MUX(1);\
                                        PORTD_PCR3 = PORT_PCR_MUX(1);\
                                        PORTD_PCR4 = PORT_PCR_MUX(1);\
                                        PORTD_PCR5 = PORT_PCR_MUX(1);\
                                        PORTD_PCR6 = PORT_PCR_MUX(1);\
                                        PORTD_PCR7 = PORT_PCR_MUX(1);\
                                        Sbi(GPIOA_PDDR, (BIT0|BIT3));\
                                        Sbi(GPIOB_PDDR, (BIT16|BIT17));\
                                        Sbi(GPIOD_PDDR, 0xFF);



Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 10. 23:00

K20 EVM - Kinetis Cortex-M4 K20 16bit ADC 테스트

K20 EVM - Kinetis Cortex-M4 K20  16bit  ADC 테스트





Kinetis 시리즈는 기존 Cortex-M 시리즈들에서 보기 힘든 16bit ADC를 기본으로 내장하고 있다. K20 시리즈의 경우 특히 ADC부분에 기능이 풍부해 아날로그에 있어 강점이 있는것 같다.

특히 HW 평균필터가 내장되어 있어 32 Sample까지 필터링 가능하다.



K20 ADC테스트 동영상

K20 EVM 보드를 이용하여 가변저항에 연결된 전압값을 ADC해서 그래프로 출력하는 테스트를 진행해 보았다.





K20 의 ADC 블록도





K20 ADC 레지스터

아주 복잡해 보이지만 자세히 보면 ADCx_SC1 레지스터만 설정하면 아주 간단히 ADC를 할 수 있도록 되어 있다. 





5-DIFF

Differential mode enable

차동으로 받을지 싱글로 받을지 설정 한다.

0 Single-ended conversions and input channels are selected.

1 Differential conversions and input channels are selected.


4–0 ADCH

ADC 채널 선택

00000 When DIFF=0, DADP0 is selected as input; when DIFF=1, DAD0 is selected as input.

00001 When DIFF=0, DADP1 is selected as input; when DIFF=1, DAD1 is selected as input.

00010 When DIFF=0, DADP2 is selected as input; when DIFF=1, DAD2 is selected as input.

00011 When DIFF=0, DADP3 is selected as input; when DIFF=1, DAD3 is selected as input.

00100 When DIFF=0, AD4 is selected as input; when DIFF=1, it is reserved.

00101 When DIFF=0, AD5 is selected as input; when DIFF=1, it is reserved.

00110 When DIFF=0, AD6 is selected as input; when DIFF=1, it is reserved.

00111 When DIFF=0, AD7 is selected as input; when DIFF=1, it is reserved.

01000 When DIFF=0, AD8 is selected as input; when DIFF=1, it is reserved.

01001 When DIFF=0, AD9 is selected as input; when DIFF=1, it is reserved.

01010 When DIFF=0, AD10 is selected as input; when DIFF=1, it is reserved.

01011 When DIFF=0, AD11 is selected as input; when DIFF=1, it is reserved.

01100 When DIFF=0, AD12 is selected as input; when DIFF=1, it is reserved.

01101 When DIFF=0, AD13 is selected as input; when DIFF=1, it is reserved.

01110 When DIFF=0, AD14 is selected as input; when DIFF=1, it is reserved.

01111 When DIFF=0, AD15 is selected as input; when DIFF=1, it is reserved.

10000 When DIFF=0, AD16 is selected as input; when DIFF=1, it is reserved.

10001 When DIFF=0, AD17 is selected as input; when DIFF=1, it is reserved.

10010 When DIFF=0, AD18 is selected as input; when DIFF=1, it is reserved.

10011 When DIFF=0, AD19 is selected as input; when DIFF=1, it is reserved.

10100 When DIFF=0, AD20 is selected as input; when DIFF=1, it is reserved.

10101 When DIFF=0, AD21 is selected as input; when DIFF=1, it is reserved.

10110 When DIFF=0, AD22 is selected as input; when DIFF=1, it is reserved.

10111 When DIFF=0, AD23 is selected as input; when DIFF=1, it is reserved.

11000 Reserved.

11001 Reserved.

11010 When DIFF=0, Temp sensor (single-ended) is selected as input; when DIFF=1, Temp sensor

(differential) is selected as input.

11011 When DIFF=0,Bandgap (single-ended) is selected as input; when DIFF=1, Bandgap (differential)

is selected as input.

11100 Reserved.

11101 When DIFF=0, VREFSH is selected as input; when DIFF=1, -VREFSH (differential) is selected as

input. Voltage reference selected is determined by the REFSEL bits in the SC2 register.

11110 When DIFF=0, VREFSL is selected as input; when DIFF=1, it is reserved. Voltage reference

selected is determined by the REFSEL bits in the SC2 register.

11111 Module disabled.




ADCx_SC3

하드웨어 평균화 필터 설정이 가능하다.




K20 ADC 초기화 소스코드

#define ADC_CFG1_MODE_8_9_BIT       0x0

#define ADC_CFG1_MODE_12_13_BIT     0x1

#define ADC_CFG1_MODE_10_11_BIT     0x2

#define ADC_CFG1_MODE_16_BIT        0x3

#define ADC_SC3_AVGS_32_SAMPLES     0x3


void AdcInit(void)

{

    SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;

    

    ADC0_CFG1 = ADC_CFG1_MODE(ADC_CFG1_MODE_16_BIT);

    ADC0_SC3 = ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(ADC_SC3_AVGS_32_SAMPLES);

}



K20 ADC Read 소스코드

unsigned int AdcRead(unsigned char Channel)

{

//ADC 채널 선택

ADC0_SC1A  =  Channel;

//ADC 변환 완료 까지 대기

while((ADC0_SC1A & ADC_SC1_COCO_MASK) == 0)

{

}

    //ADC값 출력

return ADC0_RA;

}





[K20 EVM] 보드에는 ADC8(PB0), ADC9(PB1), ADC14(PC0), ADC15(PC1) 포트에서 ADC테스트 해볼 수 있다.




PTC0 - ADC0_SE14

PTC1 - ADC0_SE15





레퍼런스 입력은 LM4040 으로 설정 가능하다.







Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 3. 23:30

K20 EVM - Kinetis Cortex-M4 W5200을 이용한 TCP/IP 루프백 전송속도 테스트

K20 EVM - Kinetis Cortex-M4 W5200을 이용한 TCP/IP 루프백 전송속도 테스트





W5200은 HW TCP/IP 스택을 내장하고 있는 칪으로 저렴한 MCU에서 SPI통신으로 쉽게 Ethernet 통신이 가능하도록 해준다.

K20에서 W5200을 이용하여 TCP/IP 전송 속도 테스를 진행해 보았다.





K20의 SPI최대 속도는 25Mhz이고 TCP/IP 루프백 속도 테스트 결과 2.5Mbps 정도로 측정된다.




[34] iInChip Send: 2.6033 Mbps(348160 bytes, 1.0203 sec)

iInChip Recv: 2.2290 Mbps(348160 bytes, 1.1917 sec)

------------------------------------------------------------

[35] iInChip Send: 2.6008 Mbps(348160 bytes, 1.0213 sec)

iInChip Recv: 2.2092 Mbps(348160 bytes, 1.2023 sec)

-------------------------------------------------------






K20 Hadward TCP/IP Network Module W5200 드라이버 코스코드

 TCP/IP 전송속도 테스트를 위하여 [Net_EV-SM EVM] 확장 테스트 보드를 이용하였다.

 SPI는 SPI0에 연결되어 있고 /CS는 PB3, /RESET는 PB2에 각각 연결되어 있다.

//-----------------------------------------------------------------------------

// W5200 HAL

#define W5100_CS_PORT GPIOB

#define W5100_CS_BIT BIT3


#define W5100_RST_PORT GPIOB

#define W5100_RST_BIT BIT2



#define W5100_IO_INIT() SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;\

                                        PORTB_PCR2 = PORT_PCR_MUX(1);\

                                        PORTB_PCR3 = PORT_PCR_MUX(1);\

                                        Sbi(GPIOB_PDDR, W5100_CS_BIT);Sbi(GPIOB_PDDR, W5100_RST_BIT);\

                                        IINCHIP_CSon();


#define IINCHIP_CSoff() cbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_CSon() sbi(W5100_CS_PORT, W5100_CS_BIT)



#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SPI_SPEED();

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SPI_SPEED()            SPI0_SetSpeed(SPI_SPEED_MAX) 


#define IINCHIP_RSToff() cbi(W5100_RST_PORT, W5100_RST_BIT)

#define IINCHIP_RSTon() sbi(W5100_RST_PORT, W5100_RST_BIT)

//-----------------------------------------------------------------------------




Posted by nexp

댓글을 달아 주세요