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

타이머4의 채널1을 PWM Generation CH1로 바꿔준다.
=> PD12이 바뀐 걸 볼 수 있을 것이다!
따라서 아래와 같이 변경해준다.
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);
}
}

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