디시인사이드 갤러리

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

갤러리 본문 영역

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

Grinder갤로그로 이동합니다. 2010.11.25 00:48:40
조회 747 추천 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 - -
233518 간단한 포인터 질문 [1] 금호족기(61.75) 11.02.05 84 0
233517 이거 왜 이미지 퀄차이가 나는겅미? [3] 흠냐리(61.255) 11.02.05 178 0
233515 마크주커버그가 페이스북... [5] 낰칰(58.230) 11.02.05 301 0
233513 [김지수갤러리] 감성뮤지션 김지수의 22번째 생일떡 돌리러왔어요! [10] ♪옥뚤♬갤로그로 이동합니다. 11.02.05 186 0
233512 안녕하세요 프로그래밍 입갤하려는 젖밥입니다 [1] 개밥바라기.갤로그로 이동합니다. 11.02.05 148 0
233510 올리디버거 스트링에 안뜨는 문구는 어떻게 찾죠? [5] 123(116.34) 11.02.05 124 0
233509 파이썬 이제 배워보려고 하는데요.. [4] 아오(220.79) 11.02.05 185 0
233508 카울리에서 개인 블로그를 무료APP로 만들어주는 서비스를 하잖소? 흠냐리(61.255) 11.02.05 89 0
233507 Best GUI designer for eclipse? [7] VL갤로그로 이동합니다. 11.02.05 231 0
233506 친구가 집을 불태워먹었습니다 [3] 꿀레(14.33) 11.02.05 238 0
233505 음~ [10] 배스커빌갤로그로 이동합니다. 11.02.05 109 0
233504 배치파일 초고수님있나요? [2] ☣➎➊➎☣갤로그로 이동합니다. 11.02.05 138 0
233503 했당!!! 쿄쿄쿄나는야 해결사! [2] 흠냐리(61.255) 11.02.05 101 0
233502 노키아가 안드로이드 폰을 만들면 좋을텐데.. [3] sadf(119.193) 11.02.05 90 0
233501 헐 이거 어떻게 없애여? [2] 흠냐리(61.255) 11.02.05 120 0
233500 맥주가 생각나서 사왔다만 [1] 건꼬(211.59) 11.02.05 126 0
233499 백지에게 c언어 책추천좀요 [3] 늅늅이(211.41) 11.02.05 240 0
233498 php [3] SODmaster갤로그로 이동합니다. 11.02.05 91 0
233497 아뢰옵기 황송하오나 답답한 마음에 php질문하나 올립니다. [25] 형님들(125.129) 11.02.04 162 0
233496 놋북에 개발툴 세팅하는데 .3(203.223) 11.02.04 97 0
233495 C# ] 프로세스에 관해서 허허벌판갤로그로 이동합니다. 11.02.04 149 0
233493 제일 낮은 계층이라고 하면 역시 [1] Rei@디씨갤로그로 이동합니다. 11.02.04 103 0
233492 v4가 포화상태라서 v6체제로 가는거임? [5] (220.94) 11.02.04 145 0
233491 아 형들 그리고 리눅스 멀티부팅이여 [6] 늅늅이(211.41) 11.02.04 106 0
233490 형들 뉴비가 리눅스 부팅 질문좀여! [4] 늅늅이(211.41) 11.02.04 87 0
233489 공익중인넘인데여 [3] ㅇㅇㅇ(220.94) 11.02.04 100 0
233488 오늘 프갤은 흥했군!! [2] SODmaster갤로그로 이동합니다. 11.02.04 57 0
233487 아래 레지스터 저장 머시기 글... [1] 116.44(116.44) 11.02.04 84 0
233485 수학 잘하면 좋은거 있당 [2] ㅇㅇ(121.130) 11.02.04 145 0
233484 그래도 영어보다는 수학이 재미있지 않나?? [4] SODmaster갤로그로 이동합니다. 11.02.04 130 0
233482 근데 IPv4는 이거 그대로 씀? [1] 하앍하앍(123.199) 11.02.04 80 0
233480 ipv6로 전세계가 오늘부터? 전환 시작 들어간다면서요 [1] vF(211.49) 11.02.04 204 0
233479 그래... study와 learn도 구별 못하는 애들하고 뭔 말을 하겠니 [1] 좍이(59.7) 11.02.04 111 0
233478 요즘 술만 먹으면 죽겠음 [2] 116.44(116.44) 11.02.04 54 0
233477 하악하악 [1] SODmaster갤로그로 이동합니다. 11.02.04 37 0
233476 아 그리고 접때 물어봤던건데 [2] 하앍하앍(123.199) 11.02.04 62 0
233475 누산기구조?? 어큐뮤레이터 알키텍쳐??? [11] 하앍하앍(123.199) 11.02.04 176 0
233474 안녕하세요 질문하나 올립니다 [4] 융전10(125.176) 11.02.04 46 0
233473 니들이 학부때까지 공부한건 수학이 아냐 - _- [4] 좍이(59.7) 11.02.04 250 0
233472 To nccpu 생각놀이갤로그로 이동합니다. 11.02.04 74 0
233470 수학논란 종결 [6] 왁스맛치즈갤로그로 이동합니다. 11.02.04 281 0
233469 제일 꼴 사나운거는 [5] nccpu(49.23) 11.02.04 166 0
233467 온라인 게임 퀘스트를 [14] 마법사게이맨(175.115) 11.02.04 177 0
233466 코더 무시하네 ㅋ [3] 뷁끼(59.7) 11.02.04 110 0
233465 원래 전산직은 야근을 할 수밖에 없다 [3] Rei@디씨갤로그로 이동합니다. 11.02.04 171 0
233462 정보보안전문가도 개발자와 비슷한건가요? [1] 두두두두두두(120.136) 11.02.04 323 0
233461 올리디버거 함수내부로 들어갔을떄 다시 나오는법 없나여?? [3] 2(116.34) 11.02.04 100 0
233460 설날때 하도 캐정전이라 마인크 하고 왔더니 와인&고사리(110.15) 11.02.04 73 0
233459 형들 IT기술병 특기병 어때?? [12] 형들(122.36) 11.02.04 287 0
233458 수학 잘한다고 프로그래밍 잘한다는건 납득이 안가는데 [7] 3123(116.34) 11.02.04 190 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2