이번에는 타이머 기능 중 PWM을 동작시켜보겠습니다.
먼저 LED가 이미 부착되어있는 TIM4 CH1과 CH2를 PWM으로 그림과 같이 설정해줍니다.
그리고 저는 주기를 1KHz로 만들것임으로
Prescaler = 99
Couter Period = 839
※ 계산식 = 1/84MHz * (PC + 1) * (CP + 1) = 0.001s : 1KHz
auto-reload preload를 Enable 시키고 (자동으로 update)
Mode = PWM mode 1 (mode1 과 mode2의 차이점 상하 반전)
Fast Mode = Enable
Pulse -> Counter Period (ARR) 의 %로 Duty비
저는 일단 0으로 셋팅 후 코드 안에서 변경하도록 하겠습니다.
그리고 LL로 변경 후 Generate Code 실행 해주세요 ^^;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
LL_TIM_EnableCounter(TIM4);
LL_TIM_CC_EnableChannel(TIM4, LL_TIM_CHANNEL_CH1);
LL_TIM_CC_EnableChannel(TIM4, LL_TIM_CHANNEL_CH2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(int i=0; i<840; i++)
{
TIM4->CCR1 = i;
TIM4->CCR2 = 839 - i;
HAL_Delay(1);
}
}
/* USER CODE END 3 */
}
타이머 카운터를 Enable하고 CC_EnableChannel을 진행하면 해당 PWM채널이 동작됨을 확인 가능합니다.
저는 Duty비를 변경하여 LED 밝기를 조절해봤습니다.
코드를 보니 각 타이머의 CCR1, CCR2를 통해 채널별 Duty비 설정이 가능하네요 :D
반응형
'b. 임베디드 > STM32' 카테고리의 다른 글
[STM32F407VGT Discovery] USART printf 사용하기 (0) | 2019.06.24 |
---|---|
[STM32F407VGT Discovery] USART Interrupt, Polling 사용하기 (0) | 2019.06.23 |
[STM32F407VGT Discovery] Timer Output Compare Mode (0) | 2019.06.21 |
[STM32F407VGT Discovery] Timer FND(7segment)초 단위 동작 (0) | 2019.06.20 |
[STM32F407VGT Discovery] Timer UPDATE INTERRUPT (1) | 2019.06.18 |
[STM32F407VGT Discovery] EXT 외부 인터럽트 (0) | 2019.06.17 |
[STM32F407VGT Discovery] GPIO 버튼 (1) | 2019.06.15 |
[STM32F407VGT Discovery] GPIO LED점멸 (0) | 2019.06.15 |