디시인사이드 갤러리

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

갤러리 본문 영역

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

Grinder갤로그로 이동합니다. 2010.11.25 00:48:40
조회 748 추천 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 - -
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
234279 웹 종나 쉽지. ㅋㅋㅋㅋ [2] 계백(61.255) 11.02.12 123 0
234278 뭐야 드림하이에 수지 오버니삭스로 나오네? [1] 초밥술사갤로그로 이동합니다. 11.02.12 852 0
234277 형님들 좆밥질문만해서 죄송하지만 마지막질문이니 한번만봐주세요 [6] 늅늅이(202.150) 11.02.12 60 0
234276 형님들 좆밥질문만해서 죄송하지만 하나만 알려주심 안될까욤 [4] 늅늅이(202.150) 11.02.12 81 0
234275 firewall이 이정도는 되야지 [3] 멍게엔열무(110.15) 11.02.12 136 0
234274 야 늬들은 전에 그 버블볼인가 만든 꼬맹이 어떻게 생각하냐? [1] 투데이(121.161) 11.02.12 93 0
234273 플래시 액션스크립트에서 ByteArray()가 뭐하는것인가요 [3] 강횡성갤로그로 이동합니다. 11.02.12 115 0
234272 extern "C"<--여기서 C가의미하는것이 정확히좀 ㅇㅅㅇ;; [6] 미니앵두갤로그로 이동합니다. 11.02.12 174 0
234271 님들 이게 무슨뜻이에요 [5] 강횡성갤로그로 이동합니다. 11.02.12 103 0
234270 이제 프갤에 봇이안보이네요 [9] (220.89) 11.02.12 178 0
234268 동해 폭설... 쉣더.. [1] 고래고래(121.183) 11.02.12 110 0
234267 ipconfig /all 치는데 왜꺼지지 공유기여서그런가 [2] 풋사과1갤로그로 이동합니다. 11.02.12 83 0
234266 형님들 개 좆밥질문해서 죄송하지만 왜 오류나는지좀 알려주심안대여??? [5] 늅늅이(202.150) 11.02.12 88 0
234265 웹이 쉬운거야?? [1] ㅅㄱ(219.241) 11.02.12 78 0
234264 웹이 만만하다고 깔게아니라 [3] ㄷㅈ(121.88) 11.02.12 160 0
234263 직장생활시 디팬스는 생활화 해야함.... [5] ㅅㄱ(219.241) 11.02.12 163 0
234262 첫 직장에서 4년째 근무 중 [7] 박뮤탈갤로그로 이동합니다. 11.02.12 255 0
234261 횽들 내가 C 공부 어느정도 끝내고 Java를 공부했느데 말이야 [3] 대마법서오즈갤로그로 이동합니다. 11.02.12 175 0
234260 씨,씨발, 싸,싸,싼다!!! [4] 땡칠도사갤로그로 이동합니다. 11.02.12 303 0
234255 어제의 영어떡밥 종결.txt [10] Minryu갤로그로 이동합니다. 11.02.12 267 0
234254 왠지 이런거 하고 싶어 [2] ssonacy갤로그로 이동합니다. 11.02.12 111 0
234253 c공부 테크트리 짜봤음. 고수만 좀 봐주셈 [6] 이마트(116.45) 11.02.12 250 0
234252 횬들..C->C++->C#->WPF 이렇게 가도 되나? MFC빼먹고..? [4] 냠냠(115.138) 11.02.12 309 0
234251 만만한게 웹이지. 십숑퀴드라. 계백(61.255) 11.02.12 81 0
234249 웹플머 하지마라 뉴비쇼키들아. [2] 캐닭(112.133) 11.02.12 181 1
234248 게임회사는 왜 연봉이 적은걸까요? [6] ㅇㅇ(121.137) 11.02.12 381 0
234247 회사 그만둔다 말했다... [2] 캐닭(112.133) 11.02.12 140 0
234245 프겔의 루비스트들은 보라능 [2] DMW(125.138) 11.02.12 148 0
234242 난 취직하려고 프로그래밍 배웠음 학원에서 [6] (125.176) 11.02.12 224 0
234241 직장생활 6개월정도 한 뉴비입니다 늅늅 [2] 야메떼♥갤로그로 이동합니다. 11.02.12 162 0
234240 지금쯔음 적절할것같은짤 [4] !!!!!!(110.8) 11.02.12 117 0
234238 내가쓴걸지우는데 자꾸 블록(드래그같이)씌워져서 지워짐 ㅠㅠ 이럴수가(58.122) 11.02.11 62 0
234237 횽들 디시 검색 프로그램이나 크롬 js소스 같은거 없음여? ㅇㅇㅇ? ㅇㅇㅇ(121.144) 11.02.11 128 0
234236 이런 인젝션막음?? [6] Pr0xy갤로그로 이동합니다. 11.02.11 172 0
234235 해커들이 스마트폰용 바이러스 해킹툴 않심나 [2] 풋사과1갤로그로 이동합니다. 11.02.11 162 0
234233 mfc에서 mainframe이나 app에서 view 호출할 때 궁금한점. [3] 츄퐈춥스갤로그로 이동합니다. 11.02.11 250 0
234232 식빵 [4] SODmaster갤로그로 이동합니다. 11.02.11 84 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2