[Intel AI SW 아카데미] PWM 제어

Jimeaning·2023년 10월 16일

Intel AIoT

목록 보기
3/38

2023.10.13 19일차

오늘의 목표

  • PWM 제어
  • LED PWM 제어하기
  • DC 모터 PWM 제어하기

학습한 용어

💡 변조 Modulation

유무선 통신에서 음향, 영상, 데이터와 같은 신호를 전달할 때에는 전송에 적합한 특정 주파수(Carrier Frequency)나 펄스(Pulse)로 변환해 보낸다.
변환 과정을 변조(Modulation)라고 하고, 이를 원본 신호로 돌리는 과정을 복조(Demodulation)이라고 한다. 이 두 과정을 수행하는 기계를 모뎀이라고 부른다.

PWM 제어

환경설정

타이머4의 채널1PWM Generation CH1로 바꿔준다.
=> PD12이 바뀐 걸 볼 수 있을 것이다!

  1. TIM4가 APB1에 연결되어 있다 (system blocks diagram)
    Clock Configuration에 APB1은 84 MHz라 되어 있다.
  2. 100 kHz 분주 주파수를 얻기 위해서는
    (1) 84,000,000/840 => 100,000 Hz (100khz)
    (2) T = 1/f = 1/100,000 = 0.00001s = 10 ms(마이크로sec)
    (3) 100개 count 하려면 0.00001 * 100 = 0.001 sec = 1 ms(밀리sec)
    (4) 70% = 0.00001 * 70 = 0.0007 = 0.7ms

따라서 아래와 같이 변경해준다.
Prescaler: 840-1
Counter Period: 100-1
Pulse (16 bits value): 70-1
Fast Mode : Enable

추가로..

Clock Source를 Internal Clock으로 해주고, NVIC Settings에 interrupt를 Enabled시켜준다.

코드

버튼 0을 누르면 모터가 멈추고, 1을 누르면 속도가 빨라진다. 버튼 2를 누르면 속도가 느려진다.

// main.c

/* USER CODE BEGIN PFP */
extern void dcmotor_pwm_control(void);
/* USER CODE END PFP */

int main(void)
{
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start_IT(&htim4, TIM_CHANNEL_1); 	// for DC motor PWM count
  /* USER CODE END 2 */
  
  while (1)
  {
	  dcmotor_pwm_control();
   }
}
// dcmotor.h

#include "main.h"
// dcmotor.c

#include "button.h"
#include "dcmotor.h"

extern TIM_HandleTypeDef htim4;

void dcmotor_pwm_control(void);

// BUTTON0 : start/stop : LED1 (toggle)
// BUTTON1 : SPEED-UP : LED2 (toggle)
// BUTTON2 : SPEED-DOWN : LED3 (toggle)
uint8_t pwm_start_flag = 0;		// dcmotor start/stop indicator flag
uint16_t CCR_UP_Value = 0;		// PWM UP control
uint16_t CCR_DOWN_Value = 0;		// PWM DOWN control

void dcmotor_pwm_control(void)
{
	if (get_button(BUTTON0_GPIO_Port, BUTTON0_Pin, 0) == BUTTON_PRESS)
	{
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);	// LED1
		if (!pwm_start_flag)
		{
			pwm_start_flag = 1;
			HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
		}
		else
		{
			pwm_start_flag = 0;
			HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
		}
	}
	// speed-up : button1
	if (get_button(BUTTON1_GPIO_Port, BUTTON1_Pin, 1) == BUTTON_PRESS)
	{
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);	// LED2
		CCR_UP_Value = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1);
		CCR_UP_Value += 10;
		if (CCR_UP_Value > 100) CCR_UP_Value = 100;
		__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, CCR_UP_Value);
	}
	// speed-up : button1
	if (get_button(BUTTON2_GPIO_Port, BUTTON2_Pin, 2) == BUTTON_PRESS)
	{
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);	// LED2
		CCR_DOWN_Value = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1);
		CCR_DOWN_Value -= 10;
		if (CCR_DOWN_Value < 60) CCR_DOWN_Value = 60;
		__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, CCR_DOWN_Value);
	}
}

DC 모터


상담 가야 해서 조퇴하느라 뒷 부분은 듣지 못했다..

profile
I mean

0개의 댓글