본문 바로가기
WORK/Sotfware

STM8L15x PWM 만들기

by KANG Stroy 2017. 4. 27.
728x90
728x90


PWM Data를 만들기 위해서 클럭 셋팅 

아래는 예제 프로그램을 제 개인적인 생각으로 정리 한 것입니다. 


정현파의 클럭이 발생하게 됩니다. 

아래의 변수에서 CCR1_Val 값을 변경 하면 파형은 PWM 처럼 동작 하게 됩니다. 


크게 3단계로 접근 합니다. 


1. 초기화 단계 

1.1 클럭 셋팅 

1.2 GPIO 셋팅  

2. 타이머 셋팅 

2.1. 타이머 셋팅 

3. 타이머 인터럽트 셋팅 

3.1. 타이머 인터럽트에 대한 루틴 처리 


타이머 1 사용


클럭 연결 (Enable)


CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, ENABLE); /* Timer1 clock Enable */ 


클럭은 외부 클럭을 사용 할 것인지 아니면 내부 클럭을 사용 할 것인지를 판단 합니다. 

클럭 관련 부분은 차후에 올리도록 하겠습니다. 


GPIO 셋팅 

포트는 PORTD 2번 핀 외부 출력 셋팅 


/* TIM1 Channel 1 configuration: PD2 */

GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_Out_PP_Low_Fast);



이제 타이머 셋팅을 해야 합니다. 
아래의 TimeBaseInit에 적용 

#define TIM1_PERIOD                     65535

#define TIM1_PRESCALER                 1

#define TIM1_REPTETION_COUNTER          0


__IO uint16_t CCR1_Val = 32768;


/* PWM output
- TIM1CLK = 2 MHz (클럭)

- TIM1 counter clock = TIM1CLK / TIM1_PRESCALER+1 = 2 MHz/1+1 = 1 MHz

타이머 클럭 분주 

*/

/* Time base configuration */
TIM1_TimeBaseInit(TIM1_PRESCALER,                 // 1
TIM1_CounterMode_Up,     // upcount
TIM1_PERIOD,                  // 65535 (16bit)
TIM1_REPTETION_COUNTER);    // 0 

/*
- The TIM1 CCR1 register value is equal to 32768: 
- CC1 update rate = TIM1 counter clock / CCR1_Val = 30.51 Hz,
- So the TIM1 Channel 1 generates a periodic signal with a frequency equal to 15.25 Hz.
*/

/* Toggle Mode configuration: Channel1 TIM1_OCMode_Toggle  */

TIM1_OC1Init(TIM1_OCMode_Toggle, 

TIM1_OutputState_Enable, 

TIM1_OutputNState_Disable,

 CCR1_Val, 

TIM1_OCPolarity_Low, 

TIM1_OCNPolarity_Low, 

TIM1_OCIdleState_Set,

 TIM1_OCNIdleState_Set);


TIM1_OC1PreloadConfig(DISABLE);


TIM1_ARRPreloadConfig(ENABLE);


/* TIM1 Interrupt enable */

TIM1_ITConfig(TIM1_IT_CC1, ENABLE);


  /* enable interrupts */

enableInterrupts();


/* Enable TIM1 outputs */

TIM1_CtrlPWMOutputs(ENABLE);

/* TIM1 enable counter */

TIM1_Cmd(ENABLE);


인터럽트 함수에서 
Stm8l15x_it.c 

uint16_t Capture = 0;
extern __IO uint16_t CCR1_Val;

INTERRUPT_HANDLER(TIM1_CC_IRQHandler, 24)
{
/* In order to detect unexpected events during development,
  it is recommended to set a breakpoint on the following instruction.
*/
/* TIM1 channel 1 toggling */
if (TIM1_GetITStatus(TIM1_IT_CC1) != RESET)
{
 TIM1_ClearITPendingBit(TIM1_IT_CC1 );
 Capture = TIM1_GetCapture1();
 TIM1_SetCompare1(Capture + CCR1_Val);
}
}



728x90

'WORK > Sotfware' 카테고리의 다른 글

[C++] Linked List 개념 잡기  (0) 2017.08.28
[LINUX] virtualbox putty 접속방법  (0) 2017.05.15
FreeRTOS 관련 건.  (0) 2017.04.25
C언어 point 와 구조체 1  (0) 2017.03.15
UART Program 정리  (0) 2016.11.15

댓글