반응형

[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 */
 }
반응형
Posted by 덕력킹
,