정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

엔코더 장착형 기어드 dc 모터
sadaqw | 2021-05-14

안녕하세요 저희가 엔코더 장착형 기어드  dc모터를 사용하고 있는데요 현재  pid  제어를 통한 360도를 돌리는게 목표 입니다 보드는 아두이노 메가를쓰고 있습니다  현재 문제점은 모터가 제어가 되지 않고 계속 회전하고 있는 상태 입니다.  문제점을 알려주시면 감사하겠습니다. 아래는 저희 코드를 보시면 아시겠지만 저희가 지금 인터럽트를 사용하지 않는 상태로 제어를 하길 원합니다.(추후에 다수의 모터를 연결할 예정) 답변 달아주시면 감사하겠습니다. 

 

#include <Encoder.h>

long encoder  = 0;

const int DIR = 8; // 메가 8번핀 
const int PWM = 9; //메가 9번핀

Encoder myEnc(2, 3); // 모터 드라이버의  int 1,2번 핀을 메가 2,3 번핀에 연결  

double Kp = 10;
double Ki = 0.02;
double Kd = 5;

 

float total_error = 0;
float change_error = 0;
float last_error = 0;

 

long Setvalue = 360;
long newPosition  = 0;
double PWMvalue = 0;

 

void Motor(char Switch, char Speed)
{
  digitalWrite(DIR, Switch);
  analogWrite(PWM, Speed);

}


void setup() {          // 초기화 한거
  Serial.begin(115200);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {


  encoder = myEnc.read();                //앤코더를 읽는다 
  newPosition = encoder/3.9;           //저희 모터가 1회전하는데에 엔코더 값이 1404 입니다. 

  float error = Setvalue - newPosition;
  float control_P = Kp*error;
  
  float total_error = error+total_error;
  float control_I = Ki * total_error;

  float change_error = error - last_error;
  float control_D = Kd*change_error;
  
  PWMvalue = control_P + control_I + control_D;
  PWMvalue = constrain(abs(PWMvalue), 0, 255);

  Motor(LOW, PWMvalue);
  
  if( Setvalue > newPosition)
  {
    Motor(LOW, PWMvalue);
  }
  else
  {
    Motor(HIGH,PWMvalue);
  }
  
  if (error == 0)
  {
    Motor(LOW, PWMvalue);
  }


  Serial.print("control_P = ");
  Serial.print(control_P);
  Serial.print("     control_I = ");
  Serial.print(control_I);
  Serial.print("     control_D = ");
  Serial.print(control_D);
  Serial.print("     Setvalue = ");
  Serial.print(Setvalue);
  Serial.print("     newPosition = ");
  Serial.print(newPosition);
  Serial.print("     error = ");
  Serial.print(error);
  Serial.print("     PWMvalue = ");
  Serial.println(PWMvalue);

  last_error = error;
}

이전글   |    아두이노 센서의 변화량 값이 양수인지 음수인지 알아내는 법좀요 ㅠㅜ... 2021-05-10
다음글   |    온습도에 따라 자동으로 켜지는 액체모기퇴치제 ... 2021-05-14