디시인사이드 갤러리

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

갤러리 본문 영역

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

Grinder갤로그로 이동합니다. 2010.11.25 00:48:40
조회 750 추천 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 - -
234336 징징글 진로상담글 올리지 말래놓곤 상항 댓글은 성한다 [3] 비우그라갤로그로 이동합니다. 11.02.12 52 0
234335 c잘하시는분 배열쪽 잘하시는분 한번봐주세요 ㅠㅠ 공부하는데막혀서 [30] 도와주세용(202.30) 11.02.12 204 0
234334 php만 종나 파도 , 최소한 굶어죽진 않아 [1] 계백(61.255) 11.02.12 116 0
234333 현재 다른직종에서 일하고있는 사람인데요 프로그래머로 이직 추천합니까? [18] (125.176) 11.02.12 256 0
234332 프갤마피아 방장뇬 진짜 강퇴시키네 씨빨 긔염(211.176) 11.02.12 60 0
234331 moolzo?? 물죠?? moolzom?? 물좀?? 이거 머지? 비우그라갤로그로 이동합니다. 11.02.12 308 0
234330 근데 요즘애들 해킹이니 어쩌구 떠들어도 우리 때도 옛날에 다 했지않나?ㅋ [5] 곰들\'ⓧ\'갤로그로 이동합니다. 11.02.12 168 0
234327 왜 이렇게 징징글이 더 많아졋지 [7] 일광면(119.198) 11.02.12 196 0
234326 + 업적왕 이명박 플레이어.swf - 우정왕은 내가 직접 만들었당께 + [11] 아따(218.48) 11.02.12 239 0
234325 익플, 파폭, 크롬 자바스크립트 질문 뉴비(203.170) 11.02.12 119 0
234324 연탄은 뻘로있냐 계백(61.255) 11.02.12 61 0
234323 이런거 배울떄 쓰는것좀 가르쳐줘 [5] 풋사과1갤로그로 이동합니다. 11.02.12 140 0
234322 구글에서 엑티브엑스 돌아간다고 좋아라 했지만.... ㅅㄱ(219.241) 11.02.12 80 0
234321 무기보급한다. 툴 무료로 가져가 칭쁘갤로그로 이동합니다. 11.02.12 124 0
234320 아 형들 근본적인 질문좀 [6] ㅁㄴㅇ?(175.113) 11.02.12 128 0
234319 꼭한국에만있어야하나?해외취업안되나? [1] kkll/;(121.182) 11.02.12 152 0
234318 35살에 짤려서 닭집하는 애들이 있는가하면... [5] ㅅㄱ(219.241) 11.02.12 315 0
234317 닭을 튀기면서 닭튀기는 기계에다가 프로그래밍 풋사과1갤로그로 이동합니다. 11.02.12 184 3
234316 많은 초보자들이 하는 실수들. [5] 할리의본링갤로그로 이동합니다. 11.02.12 247 0
234315 억울하면 자기사업해 이넘들!!! [5] 계백(61.255) 11.02.12 144 0
234314 과연 프로그래머가 10억을 벌수 있을까 [3] ㅋㅌㄴ(175.113) 11.02.12 223 0
234313 노트북 추천 해달라는 글이 보여서 걍 씀 [1] 할리의본링갤로그로 이동합니다. 11.02.12 130 0
234312 역분석 구조와 원리 책 괜찮나요? [4] 할리의본링갤로그로 이동합니다. 11.02.12 113 0
234311 아...시발 주위에 프로그래머들 좀 암울하다...... [2] (125.176) 11.02.12 277 0
234310 방학이어서그런지 숙제갤이 조용하네요 미니앵두갤로그로 이동합니다. 11.02.12 37 0
234309 심심한데 읽죠 [1] _FL(211.49) 11.02.12 87 0
234308 횽들 포인터공부는 어케해야됨?ㅜ [3] ㅁㄴㅇ?(175.113) 11.02.12 95 0
234307 형들 이거 좀봐줘 [1] 카와이여갤로그로 이동합니다. 11.02.12 50 0
234306 스티브 잡스는 헬로 월드도 못찍는 개초보 [6] 계백(61.255) 11.02.12 214 0
234305 나는 아마 평생토록 풀지 못할 미스테리... [2] 곰들\'ⓧ\'갤로그로 이동합니다. 11.02.12 97 0
234304 근디 그 학원에서도 vmware로 가르치는거 같은디 [5] 시불라미갤로그로 이동합니다. 11.02.12 143 0
234303 html 배우고 있는데 재밌네요 ㅎㅎ [3] ㅈㄷㄹㄷㄹㅈ(125.176) 11.02.12 114 0
234302 테크트리 운운하는 생퀴들의 공통된 특징 [3] DMW(125.138) 11.02.12 274 0
234301 델파이 배우자 [1] (61.43) 11.02.12 100 0
234299 횽들 동적 메모리 할당 좀 물어봅세 [3] Deanex(116.124) 11.02.12 93 0
234298 요즘 대형포탈사이트 개인계정 해킹당하는건 왜 당하는거냐? [3] d(118.217) 11.02.12 163 0
234294 니ㅁ들 컴퓨터 성별은 머임? [3] 미클갤로그로 이동합니다. 11.02.12 123 0
234293 수학잘하는 애들이 프로그래밍도 잘함 [13] (125.176) 11.02.12 322 0
234291 형들 게임같은거 파일들 분해하고 할려면 뭘 배워야 하나요? [3] ㅇㅇ(119.195) 11.02.12 105 0
234290 웹이 쉽다는애들은 어떤부류에 사람들이여? [4] ㅅㄱ(219.241) 11.02.12 130 0
234289 html5를 배우고 싶은데.. [1] vnt(219.255) 11.02.12 101 0
234288 프로그래밍 하는새끼들 거의다 오타쿠 기질이 있음 [4] (125.176) 11.02.12 205 0
234287 웹 종니 쉽지. [2] qewr(125.132) 11.02.12 112 0
234286 해골책과 용책 샀는데 기대된다 Type1nject갤로그로 이동합니다. 11.02.12 133 0
234285 자바개발자 하늘에별따기 [7] 시크한훈남갤로그로 이동합니다. 11.02.12 331 0
234284 인터넷에서 html 기초문법책파는거 만큼 돈쉽게 버는게 없을것같다. [4] ㄷㅈ(121.88) 11.02.12 116 0
234283 초밥술사님 이런초밥은 초밥인가여 ㅇㅅㅇ? [4] 미니앵두갤로그로 이동합니다. 11.02.12 114 0
234282 그대는 객체지향을 이해하고 있는가? - 천재플머 명언 - [8] 천재플머(121.139) 11.02.12 214 0
234281 디시 왜 이래 [8] 미클갤로그로 이동합니다. 11.02.12 144 0
234280 니들 20년전에 윈도우 전문가, 한글 워드 전문가라는 직종이 있었다. [3] 계백(61.255) 11.02.12 146 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2