// 타이머3로 PWM 제어
static void MX_TIM3_Init(void)
{
htim3.Instance = TIM3;
htim3.Init.Prescaler = 15; // 16MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1000-1;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 0;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
}
/* PWM 신호 시작 함수 */
void PWM_Start(void) {
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // IN1에 대한 PWM 시작
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // IN2에 대한 PWM 시작
}
/* 듀티 사이클 설정 함수 */
void PWM_SetDutyCycle(uint16_t duty_IN1, uint16_t duty_IN2) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty_IN1); // IN1 (CH1)에 듀티 사이클 설정
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, duty_IN2); // IN2 (CH2)에 듀티 사이클 설정
}
/* 모터 제어 함수 */
void Motor_Control(uint16_t pwm_IN1, uint16_t pwm_IN2) {
PWM_SetDutyCycle(pwm_IN1, pwm_IN2);
}
int main(void)
{
MX_TIM3_Init();
PWM_Start(); // PWM 시작
while (1)
{
// 시계 방향 회전: IN1에 PWM, IN2는 0
Motor_Control(750, 0); // IN1: 75% 듀티, IN2: 0% (시계 방향)
HAL_Delay(2000); // 2초 대기
// 반시계 방향 회전: IN1은 0, IN2에 PWM
Motor_Control(0, 750); // IN1: 0%, IN2: 75% (반시계 방향)
HAL_Delay(2000);
// 모터 정지: IN1과 IN2 모두 PWM 적용 (브레이크)
Motor_Control(750, 750); // IN1: 75%, IN2: 75% (정지)
HAL_Delay(2000);
// 25%, 50%, 75%, 100% 시험
// 25%는 구동 안함. 모터마다 다를 수 있음
Motor_Control(400, 0); // IN1: 40% 듀티, IN2: 0% (시계 방향)
HAL_Delay(2000);
Motor_Control(500, 0); // IN1: 50% 듀티, IN2: 0% (시계 방향)
HAL_Delay(2000);
Motor_Control(750, 0); // IN1: 75%, IN2: 0% (시계 방향)
HAL_Delay(2000);
Motor_Control(1000, 0); // IN1: 100%, IN2: 0% (시계 방향)
HAL_Delay(2000);
Motor_Control(0, 0); // IN1: 0%, IN2: 0% (정지)
HAL_Delay(2000);
}
}
'프로그래밍 > STM32F103' 카테고리의 다른 글
bmp280 시험 (0) | 2024.10.10 |
---|---|
숫자를 문자열로 변환 - itoa, ltoa, ultoa, fcvt, ecvt, gcvt (0) | 2020.09.24 |
STM32F103RC bootloader와 app 설정 (0) | 2020.06.28 |
32bit, 4byte Hex를 DEC로 표시 (0) | 2020.05.20 |
HAL_UART_Transmit, HAL_UART_Transmit_IT (0) | 2020.05.15 |