디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

혹시 PID제어에 대해 아시는 분 계신가요?

Grinder갤로그로 이동합니다. 2010.11.25 00:48:40
조회 746 추천 0 댓글 2


프로그래밍이라고는 10여년 전에 정보처리기능사 딴다고 비주얼베이직 깨작거린거랑 5년쯤 전에 교양? 어쨌든 C++ 날림으로 한학기 기초만 배운것 뿐인데 졸업논문쓰러 들어간 제어공학 연구실에선 대뜸 적응형퍼지 제어기를 짜야된다 그러고.... 여차저차해서 PID로 타협이되어 코딩을 하게 됐습니다.

외부인터럽트다 뭐다, 공개된 소스도 별로 없고 그나마 있는것들은 정보도 여기저기 가려서 띄엄띄엄공개해서(물론 제가 까막눈이라 모르는것이겠지만) 쓸수도 없고, 해서 독학해서 PID 제어 코드를 짜는데까지는 성공했습니다.

해서 일단 모터 2개를 놓고 하나는 오픈루프, 하나는 PID제어로 돌리고 차이를 보려고 했는데.... 별 차이가 안보이네요-_-;

AVR 카페같은데 질문을 올려도 \'실물이 아니라 시뮬레이션이라 안되는 것일 수도 있다\'는 댓글정도 외에는 조언해 주는 분도 안계시고.... 코드가 안좋다거나 하는 지적은 많이 받지만--;

혹시나 조언을 얻을 수 있을까 해서 프로그래밍 갤러리에 질문 올립니다.

첨부한 그림은 프로테우스 회로도이고, 주석에도 써놨지만 엔코더 모터는 Current입력을 해보니 최고 920rpm정도로 올라가고, 엔코더는 24PPR입니다.

KP KI KD는 처음엔 1 0 0으로 시작했다가 별 차이가 안보여서 어처구니없는 숫자를 넣어본겁니다.

혹시 코드에 무슨 문제가 있는지 아시는분은 조언해주시면 감사하겠습니다.




#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
typedef unsigned char   byte;
typedef unsigned int    word;
#define cbi(REG8,BITNUM) REG8 &= ~(_BV(BITNUM))
#define sbi(REG8,BITNUM) REG8 |= _BV(BITNUM)
void delay (int d);
volatile unsigned int count0 = 0;
volatile unsigned int count1 = 0;
volatile unsigned long encoder_T0 = 0;
volatile unsigned long encT_0 = 0;
volatile float motor_signal0;
 
void ex_int(void) {    // external interrupt initialization
 SREG |= 0x80;      // enable external interrupt
 EIMSK |= 0x03;     // 0,1 enable
 EICRA = 0x0a;      // falling edge
}


ISR(INT0_vect) {       // INT0 핀에 엔코더 펄스가 입력되면 count0 증가, 주기는 500us
 count0++;
 _delay_us(500);
}


ISR(INT1_vect) {       // INT1 핀에 엔코더 펄스가 입력되면 count1 증가, 주기는 500us
 count1++;
 _delay_us(500);
}


void ex_int0(void){    // TCNT1과 count0을 이용해 모터의 회전 주기 검출
    encoder_T0= count0*1000 + TCNT1;
    TCNT1=0;
    count0=0;
 encT_0 = encoder_T0*48;//encoder_T의 2배는 A펄스의 주기이고, 엔코더는 1회전당 24펄스. 따라서 encT_0은 모터0이 1회전하는데 걸리는 시간.
}


void pid0(void) {          // PID 제어 함수


 volatile float error_funct;
 volatile float old_error_funct;
 volatile float old_error_funct2;
 volatile float desired;
 volatile float measured;
 volatile float old_motor_signal;
 volatile double KP = 90.3;
 volatile double KD = 90.1;
 volatile double KI = 200.0;
 volatile float delta_t = 0.005;
 volatile int limit = 100;
 volatile int pwmduty;
 
 pwmduty = OCR3A;
 desired = (pwmduty/256)*920;     // 목표 회전수 계산. MAX rpm = 920.
 measured = (1/encT_0)*60;        // ex_int0에서 검출한 회전주기를 이용해 rpm 검출
  
 // calculate the motor signal according the PID equation.
 // the derivative and the integral are approximated using simple linear approximations.


 error_funct = desired - measured;
 motor_signal0 = old_motor_signal + KP * (error_funct - old_error_funct) + KI * delta_t * (error_funct + old_error_funct) / 2 + (KD / delta_t) * (error_funct - 2 * old_error_funct + old_error_funct2);
 // 선형근사를 이용한 출력 계산식.

 if (motor_signal0 < 0) { // limiting the output
  motor_signal0 = 0;
 }
 if (motor_signal0 > limit) {
  motor_signal0 = limit;
 }


 old_motor_signal = motor_signal0; // update
 old_error_funct2 = old_error_funct;
 old_error_funct = error_funct;


}


int main(void) {
 unsigned char button;


 ex_int();
 DDRG = 0xff; PORTG = 0x01;//Motor CW
 DDRE = 0xff; PORTE = 0x00;//Output
 DDRF = 0xff; PORTF = 0x00;//Switch
 DDRD = 0x00; PORTD = 0x00;//External interrupt


 OCR3A = 128; //duty ratio 50%
 OCR3B = 128;
 TCCR3A = 0xa9;
 TCCR3B = 0x05;


 sei();
 
 do{
  ex_int0();
  pid0();
  button = PINF;
  switch (button) {
   case 0x01:
    if (OCR3A<246) OCR3A = OCR3A + 10 + motor_signal0;
    if (OCR3B<246) OCR3B+=10;
    break;
   case 0x02:
    if (OCR3A>9) OCR3A = OCR3A - 10 - motor_signal0;
    if (OCR3B>9) OCR3B-=10;
    break;
   case 0x04:
    if (OCR3A<250) OCR3A = OCR3A + 5 + motor_signal0;
    if (OCR3B<250) OCR3B+=5;
    break;
   case 0x08:
    if (OCR3A>5) OCR3A = OCR3A - 5 - motor_signal0;
    if (OCR3B>5) OCR3B-=5;
    break;
  }
  delay(20);
 }while(1);


}


void delay (int d) {
 for (int i=0;i<d;i++) _delay_ms(1);
}

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 안됐으면 어쩔 뻔, 누가 봐도 천상 연예인은? 운영자 24/06/17 - -
232154 조지 루카스 노망인 듯 [1] 분당살람갤로그로 이동합니다. 11.01.25 94 0
232153 고3 프로그래밍 모르는놈이 프로그램전공. 돠주세요 [3] 미국놈(70.122) 11.01.25 128 0
232152 가독성을 방해하는 가장 큰 요소 [2] URA!갤로그로 이동합니다. 11.01.25 118 0
232150 nRESET 는 봅니다. [2] iljeomobolt갤로그로 이동합니다. 11.01.25 93 0
232144 Illustrator 좋네요. [3] 테니스짱(168.156) 11.01.25 75 0
232141 난생처음 컴퓨터가 제 말을 이해해줬어요!!ㅋ 곰들\'ⓧ\'갤로그로 이동합니다. 11.01.25 127 0
232139 횽들 파일 입출력하는데 이해가 안가는 부분이 있는데 [1] 농농이랑마군갤로그로 이동합니다. 11.01.25 75 0
232138 예전에 근무하던 회사에서 윈도우7을 훔쳐왔는데말야 [8] 싸군(175.193) 11.01.25 204 0
232135 횽들 C언어의 C도 모르는 사람인데 나같은사람들을위한 책 추천좀해줘.. [3] ㅁㄴㅇ(218.39) 11.01.25 126 0
232134 오늘은 130라인정도 코딩한거 같다능. DMW(125.138) 11.01.25 137 0
232133 횽들 차세대 우분투는 X폐기 시킨다면서? [15] 초랭이(221.147) 11.01.25 286 0
232129 100이면 이거 코딩 가능? 사운드 긁어오는.. [2] 1(182.208) 11.01.25 130 0
232128 야이 볕진드라~ 갑자원(61.255) 11.01.25 57 0
232127 형들 웹 비즈니스 창업와 개발자에 관한 질문 부탁드릴게요 [6] ㅁㄴㅇㄹ(59.19) 11.01.25 88 0
232126 미로 back tracking으로 빠져나가는건데 머리빠지겠다 ㅠㅠ [8] 농농이랑마군갤로그로 이동합니다. 11.01.25 105 0
232123 비주얼스튜디오 2008 깔때 이렇게 에러나는데 [3] 궁금이(121.160) 11.01.25 97 0
232121 구글 검색엔진이 순간 검색어 로 바뀐뒤로 풋사과1갤로그로 이동합니다. 11.01.25 129 0
232120 역전의 여왕 ㅠㅜ 유리한갤로그로 이동합니다. 11.01.25 80 0
232117 횽들 간만임..ㅠ 뜸금없이 타이핑문제 질문좀..ㅠ [3] 괴물왕녀갤로그로 이동합니다. 11.01.25 108 0
232116 안녕하세요 프로그래밍 갤러리 여러분 [5] 마쏘갤로그로 이동합니다. 11.01.25 92 0
232115 이게 그렇게 맛있어요??? [5]    갤로그로 이동합니다. 11.01.25 150 0
232114 안드로이드 개발진형들 Rokon엔진에 대해 물어볼게 이썽! 잉여요(124.3) 11.01.25 200 0
232111 나 램은 3g인데 씨퓨가 2.40임 [5] (115.161) 11.01.25 93 0
232110 포인터 발림 ㅠㅠ 오잉(121.189) 11.01.24 95 0
232109 자기 참조 구조라면서 정의되지 않은 타입의 포인터를 정의할수있다고 [3] ㄴㅇ(175.124) 11.01.24 66 0
232107 아나 씨빨 나 해킹당하고있어 니미 [6] (115.161) 11.01.24 219 0
232103 프로그래밍 갤러리 여러분 도와주세요 ㅠ_ㅠ D드라이브가 날라간거같습니다 [4] ㅠ_ㅠ(59.1) 11.01.24 801 0
232102 웹소켓 지랄이나 한번 해보려고 했는데 내장맛마늘(110.15) 11.01.24 64 0
232101 파이썬 ㅁㅁ [1] ㅁㅁㄹㄹ(175.199) 11.01.24 80 0
232098 루비 재밌어 루비 [10] Rei@디씨갤로그로 이동합니다. 11.01.24 127 0
232096 로그가 2기가인데 보통 어떻게처리함? [3] 히밤리눅스갤로그로 이동합니다. 11.01.24 61 0
232095 나도 C언어 공부하고싶은데 [1] 박구갤로그로 이동합니다. 11.01.24 83 0
232094 IRC서버를 말이야~ [1] (175.120) 11.01.24 49 0
232093 진짜 장인들이 한땀한땀 만드는건 프로그래밍이구나 [1] 복학생(218.49) 11.01.24 82 0
232092 복수전공 어떻게 생각하남여 [1] 한마음택배갤로그로 이동합니다. 11.01.24 51 0
232090 프로그램 짠거 라인 어떻게 세?? [5] 부락페스티발갤로그로 이동합니다. 11.01.24 103 0
232089 돌아온yoi를 공격한 놈들을 알아냈닷! [2] 분당살람갤로그로 이동합니다. 11.01.24 76 0
232088 이제 마우스, 키보드 쓰는 데스크탑 운영체제는 [6] 분당살람갤로그로 이동합니다. 11.01.24 82 0
232087 아싸 컴 깔고 한달간 백신 안깔았는데 바이러스 안나옴 히히    갤로그로 이동합니다. 11.01.24 44 0
232086 ㄳㄳ 늅이라 몰랐뜸 공지사항 보라고한 횽 ㄳ [3] 무마취시술갤로그로 이동합니다. 11.01.24 104 0
232085 알약에서 아주 낮음 바이러스는 뭐가 있을까 [3]    갤로그로 이동합니다. 11.01.24 78 1
232084 형들 저 초보잔데 제가 만든 프로그램 다른 컴퓨터에선 실행이안되넴?? [8] 무마취시술갤로그로 이동합니다. 11.01.24 104 0
232083 형들 포인터 요것좀 알려주세요 [5] 포인터(175.117) 11.01.24 97 0
232082 이제 스타벅스 못 먹겠다 퉤퉤 [4] 분당살람갤로그로 이동합니다. 11.01.24 123 0
232081 횽들 바이너리파일만으로 압축구조를 파악한다는건 미친짓이야? [11] 일광면(119.198) 11.01.24 121 0
232080 이거 뭐야? 치료해야데? [7] (125.177) 11.01.24 110 0
232078 디씨 프갤러들은 프로그래머중에서 급이 어떡해됨? [4] ^_^(113.59) 11.01.24 125 0
232075 ((필독))횽들 비전공자가 들으며 좋은 컴공 수업!! [12] 쉐이킷(123.143) 11.01.24 251 0
232074 노트북중에 말이야 [1] sdfd(61.106) 11.01.24 72 0
232073 야이생키들아 [2] 핫바리(1.99) 11.01.24 85 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2