본문 바로가기
임베디드 엔지니어링/TMS320F28335

DSP제어(TMS320F28335) : 1ms 주기 LED Toggle 프로그램(5) - LED 제어

by Bennyziio 2019. 4. 10.
반응형

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅

 

1ms 주기 LED Toggle 프로그램(1) - System 세팅

◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여 150Mhz 클럭을 설정 후 1ms 주기로 제어하는 프로그램을 구현하고자 하였습니다. 추가로 500ms 에서 동작하는 것도 추가를 해 보았으며, 이를 오실로..

bennyziiolab.tistory.com

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅

 

1ms 주기 LED Toggle 프로그램(2) - GPIO 세팅

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅 1ms 주기 LED Toggle 프로그램(1) - System 세팅 ◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여..

bennyziiolab.tistory.com

2019/04/10 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(3) - PIE 세팅

 

1ms 주기 LED Toggle 프로그램(3) - PIE 세팅

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅 1ms 주기 LED Toggle 프로그램(1) - System 세팅 ◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여..

bennyziiolab.tistory.com

2019/04/10 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(4) - CPU Timer 세팅

 

1ms 주기 LED Toggle 프로그램(4) - CPU Timer 세팅

2019/04/09 - [임베디드 프로세서/TMS320F28335] - 1ms 주기 LED Toggle 프로그램(1) - System 세팅 1ms 주기 LED Toggle 프로그램(1) - System 세팅 ◆ GPIO Toggle 기능을 이용하여 30MHz 오실레이터를 이용하여..

bennyziiolab.tistory.com

이제 드디어 LED를 제어해보도록 하겠습니다.

그러기 앞서서 GPIO 초기화 세팅을 해주었고 GPADAT에 출력시 초기값을 지정해 주었는데 간단히 말씀드리면, 저는 GPIO13, 14, 15를 LED 출력핀으로 세팅하였고 초기값을 1로 지정해준 상태입니다. High 값으로 High가 되면 출력이 되는것이죠.

GPIO 핀을 통해서 5V의 출력이 나오게 하드웨어가 구성이 되어 있는데요. LED 마다 요구되는 전압이 있어서 이를 잘 보고 맞는 LED 회로를 설계해야 합니다. 전압이 너무 크면 LED 안에 Emitter Collector 타버리기 때문에 앞에 저항을 달아서 전압을 낮추어 주어야 합니다. 어떤 LED는 또 낮은 전압이면 불빛이 약할 수 있기 때문에 여튼 V=RI를 통해 적절하게 배치하시길 바랍니다.

저는 FLAG_1ms가 1이 되었을때를 0.1ms가 1ms가 되었을 때라고 계획하였고 이때마다 LED가 깜빡이게 하고 싶었습니다. GPIO 레지스터중에 SET, CLEAR, TOGGLE 레지스터가 있는데 이를 설명하자면,

GPASET : GPIO 핀을 1(High)로 설정하는 레지스터입니다.

GPACLEAR : GPIO 핀을 0(Low)로 설정하는 레지스터입니다.

GPATOGGLE : GPIO 핀이 0이든 1이든 그 상태를 Toggle, 즉 전환시켜 0이면 1로, 1이면 0으로 전환시키는 레지스터입니다.

저는 GPADAT 레지스터를 통해서 GPIO 13, 14, 15를 1, High로 초기값을 세팅하였고 이를 깜빡이게 하려면 1과 0을 반복하면 되므로 GPATOGGLE 레지스터를 이용하여 GPIO 13, 14, 15를 깜빡이게 작성하였고 코드는 아래와 같습니다.

// Step 6. IDLE loop. Just sit and loop forever (optional):
   while(1) 
   {
	   if(FLAG_1ms == 1) 
	   {
		   FLAG_1ms = 0;
		   GpioDataRegs.GPATOGGLE.all = 0x0000A000;
	   }
   }

GPADAT로 1과 0을 반복하게 하여 LED를 깜빡이게 할 수 있지도 않을까라고 생각하여 아래와 같이 해보았는데요.

// Step 6. IDLE loop. Just sit and loop forever (optional):
   while(1) 
   {
	   if(FLAG_1ms == 1) 
	   {
		   FLAG_1ms = 0;
		   GpioDataRegs.GPADAT.all = 0x0000A000;	// GPIO 13, 14, 15 = 1
           
		   GpioDataRegs.GPADAT.all = 0x00005000;	// GPIO 13, 14, 15 = 0
	   }
   }

예상과 달리 깜박이지 않고 켜져있는 상태로 되어 있음을 확인하였습니다. 원인이 뭔가 했더니 GPADAT는 1의 값을 주고 0의 값을 넣어주는데 시간이 생각보다 길어서 사이에 딜레이를 충분히 주어야 가능하게 되어 위 코드처럼 딜레이를 주지 않고는 제대로된 동작을 하지 않음을 확인하였습니다.

 

하지만 SET, CLEAR, TOGGLE 기능은 충분히 속도가 빠르기 때문에 가능하다는 결론을 내렸구요.

TI Community의 멋진 외국 누님이 관련 사항을 답변 달아주신 것을 보았었는데 지금 그 글을 첨부하려니 다시 찾기가 어렵네요. 여튼 이러한 것도 있다는 것을 알아두시면 좋을 것 같습니다.

 

마지막으로 오실로스코프로 측정한 결과를 아래와 같이 첨부하겠습니다.

 

그럼 마지막에는 전체 코드를 붙여놓고 블로그를 마치겠습니다.

Github 주소를 남겨놓을테니 들어가서 확인하시기 바랍니다.

https://github.com/bennyziio/led_blink_V0.0.9

반응형

댓글