[STM32#11] L293D 모터드라이버를 이용해서 DC모터를 정역제어하고 PWM출력으로 속도제어하는 방법 알아보기!(녹칸다 내맘대로 STM32)
프로그래밍/STM32 2025. 11. 17. 23:05
[STM32#11] L293D 모터드라이버를 이용해서 DC모터를 정역제어하고 PWM출력으로 속도제어하는 방법 알아보기!(녹칸다 내맘대로 STM32)
심심한녹칸다의 내맘대로 STM32시리즈이다!
STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g3a44d9dbe16_1_0#slide=id.g3a44d9dbe16_1_0
이번편은 모터드라이버와 DC모터입니다~!


1.STM32에 연결된 L293D에 DC모터를 연결하고 속도는 항상 100으로 고정하고 PB1버튼을 누르면 모터가 역회전, PA8버튼을 누르면 브레이크, PB2버튼을 누르면 정회전 하도록 하시오!(EN1핀을 PWM제어하지 않음)

/* USER CODE BEGIN 2 */
//속도는 항상 100이다!
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, 1);
//기본 모터는 브레이크 상태
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PB1을 누르면 역회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
//IN1이 0이고 IN2가 1일때
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
}
//PA8을 누르면 정지
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
//둘다 0일떄
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
}
//PB2를 누르면 정회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
//IN1이 1이고 IN2가 0일때
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
2.이번에는 DC모터가 항상 정회전으로 설정되어있고 PB1을 누르면 속도가 0%가되고 PA8을 누르면 50%가되고, PB2를 누르면 100%가 되도록 하시오!(주파수490hz)
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
//무조건 정회전
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
//시작하자 마자 속도는 0
TIM2->CCR3 = 0; //0~255
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PB1을 누르면 속도는 0으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
TIM2->CCR3 = 0;
}
//PA8을 누르면 속도는 50으로 설정
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
TIM2->CCR3 = 128;
}
//PB2를 누르면 속도를 100으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
TIM2->CCR3 = 255;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
3.속도제어될때 사람귀에 들리는 가청주파수 밖의 범위로 주파수를 설정해서 듀티비로 속도제어하시오!(20khz)
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
//무조건 정회전
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
//시작하자 마자 속도는 0
TIM2->CCR3 = 0; //0~255
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PB1을 누르면 속도는 0%으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
TIM2->CCR3 = 0;
}
//PA8을 누르면 속도는 78%으로 설정
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
TIM2->CCR3 = 200;
}
//PB2를 누르면 속도를 100%으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
TIM2->CCR3 = 255;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
4.STM32에서 CCR에 입력하는 값으로 0~100을 입력했을때 DC모터의 속도가 0~100%구간으로 조절되도록 설정하시오!
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
//무조건 정회전
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
//시작하자 마자 속도는 0
TIM2->CCR3 = 0; //0~100
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//PB1을 누르면 속도는 0%으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
TIM2->CCR3 = 0;
}
//PA8을 누르면 속도는 50%으로 설정
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
TIM2->CCR3 = 80;
}
//PB2를 누르면 속도를 100%으로 설정
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
TIM2->CCR3 = 100;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
5.PA0에 연결된 가변저항의 노브를 0~100%사이로 조절했을때 DC모터의 속도가 결정되고, PB1을 누르면 역회전설정, PA8을 누르면 브레이크, PB1을 누르면 정회전으로 설정되도록 하시오!(주파수490hz)

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
HAL_ADC_Start(&hadc1);
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
//시작하자 마자 속도는 0
TIM2->CCR3 = 0; //0~255
uint16_t adc_value0 = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
// 값 처리
adc_value0 = HAL_ADC_GetValue(&hadc1); //0~4095
TIM2->CCR3 = 255*adc_value0/4095; //0~255
}
HAL_Delay(10); //ADC입력간격으로 0.01초유지
//PB1을 누르면 역회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
}
//PA8을 누르면 브레이크
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
}
//PB2를 누르면 정회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
6.모터드라이버의 채널2번에 DC모터를 하나더 추가하고 예제5의 결과와 동일하게 바퀴 2개를 동시에 제어하시오!

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); //모터1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //모터2
HAL_ADC_Start(&hadc1);
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
uint16_t adc_value0 = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
// 값 처리
adc_value0 = HAL_ADC_GetValue(&hadc1); //0~4095
TIM2->CCR3 = 255*adc_value0/4095; //0~255
TIM3->CCR1 = 255*adc_value0/4095; //0~255
}
HAL_Delay(10); //ADC입력간격으로 0.01초유지
//PB1을 누르면 역회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
//PA8을 누르면 브레이크
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
//PB2를 누르면 정회전
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
7.예제6번에서 PB6버튼을 누르면 모터1과 2가 둘다 정회전하고, PC5를 누르면 모터1과 모터2가 둘다 역회전하도록 하시오!
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); //모터1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //모터2
HAL_ADC_Start(&hadc1);
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
uint16_t adc_value0 = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
// 값 처리
adc_value0 = HAL_ADC_GetValue(&hadc1); //0~4095
TIM2->CCR3 = 255*adc_value0/4095; //0~255
TIM3->CCR1 = 255*adc_value0/4095; //0~255
}
HAL_Delay(10); //ADC입력간격으로 0.01초유지
//PB1을 누르면 전진
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
//PA8을 누르면 브레이크
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
//PB2를 누르면 후진
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
}
//PB6를 누르면 g턴1
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
//PC5를 누르면 g턴2
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5) == 0){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
8.로터리엔코더를 시계방향으로 살짝 돌려서 팅구면 녹칸다의 자동차가 D모드가 되면서 모터1은 정회전, 모터2는 역회전하면서 전진한다, 반시계방향으로 딱 팅구면 R모드가 되면서 모터1은 역회전, 모터2는 정회전하면서 후진한다, 로터리엔코더를 누르면 P모드가 되면서 멈춘다!(녹칸다의 전기차)

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); //모터1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //모터2
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
//속도는 최대
TIM2->CCR3 = 255; //0~255
TIM3->CCR1 = 255; //0~255
uint8_t old_rot_A = 0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1); //LED(P)
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//A핀의 rising edge를 검출한다
//rising edge가 발생했을때 B의 신호가 HIGH면 CCW, LOW면 CW방향!
uint8_t now_rot_A = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11);
if(now_rot_A == 1 && old_rot_A == 0){
uint8_t now_rot_B = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12);
if(now_rot_B){
//CCW R모드
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}else{
//CW D모드
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 0); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 1); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
}
}
old_rot_A = now_rot_A;
HAL_Delay(10); //로터리엔코더 노이즈 방지용
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == 0){
//P모드
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 0); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
9.예제8에서 동일한 조건인데, 속도는 처음에 0으로 시작해서 로터리엔코더의 스위치를 계속 누르고 있으면 1씩 증가해서 최대 255까지 올라간다! 그리고 누르고있다가 떼면 감소해서 0으로 내려온다!
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); //모터1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //모터2
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
//속도는 0으로 시작
int speed = 0;
TIM2->CCR3 = 0; //0~255
TIM3->CCR1 = 0; //0~255
uint8_t old_rot_A = 0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1); //LED(P)
int mode = 1; //0이면 R, 1이면 P, 2이면 D
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//A핀의 rising edge를 검출한다
//rising edge가 발생했을때 B의 신호가 HIGH면 CCW, LOW면 CW방향!
uint8_t now_rot_A = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11);
if(now_rot_A == 1 && old_rot_A == 0){
uint8_t now_rot_B = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12);
if(now_rot_B){
//CCW
mode--;
if(mode < 0) mode = 0;
}else{
//CW
mode++;
if(mode > 2) mode = 2;
}
if(mode == 0){
//R
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}else if(mode == 1){
//P
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 0); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 1); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 0); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
}else if(mode == 2){
//D
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 0); //LED(R)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, 0); //LED(P)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, 1); //LED(D)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
}
}
old_rot_A = now_rot_A;
HAL_Delay(10); //로터리엔코더 노이즈 방지용
if(mode == 1){
//속도0
speed = 0;
TIM2->CCR3 = 0; //0~255
TIM3->CCR1 = 0; //0~255
}else{
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_7) == 0){
//누르고있음 속도가 1씩 증가(최대값255)
speed++;
if(speed > 255) speed = 255;
TIM2->CCR3 = speed; //0~255
TIM3->CCR1 = speed; //0~255
}else{
//안누르고있음 속도가 1씩 감소(최소값0)
speed--;
if(speed < 0) speed = 0;
TIM2->CCR3 = speed; //0~255
TIM3->CCR1 = speed; //0~255
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
10.녹칸다가 터미널에서 usart2로 문자 ‘0’을 전송하면 모터2개는 멈춘다! ‘1’을 전송하면 정회전하고 ‘2’를 전송하면 역회전하도록 하시오!(이때 속도는 최대속도)

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); //모터1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //모터2
//초기상태(브레이크, 속도0)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
TIM2->CCR3 = 255; //0~255
TIM3->CCR1 = 255; //0~255
char recv;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//시리얼입력으로 문자 1개를 받아서 '0','1','2'를 구분한다!
if(HAL_UART_Receive(&huart2, &recv, 1, 500) == HAL_OK){
if(recv == '0'){
//브레이크
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
HAL_UART_Transmit(&huart2, "P mode!\n", 8, 100);
}else if(recv == '1'){
//정회전
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 0); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 1); //IN4
HAL_UART_Transmit(&huart2, "D mode!\n", 8, 100);
}else if(recv == '2'){
//역회전
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0); //IN1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, 1); //IN2
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 1); //IN3
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0); //IN4
HAL_UART_Transmit(&huart2, "R mode!\n", 8, 100);
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}

