디시인사이드 갤러리

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

갤러리 본문 영역

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

Grinder갤로그로 이동합니다. 2010.11.25 00:48:40
조회 756 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
348114 마침 나도 운영체제 수업 책 공룡책인데 7판 하고 8판 많이 다름? [6] WM_USER+100(123.140) 13.03.06 177 0
348110 헐 형들..ㅜㅜ ㅇㅇ(223.62) 13.03.06 35 0
348109 예전부터 느끼는 거지만 프갤 글은 영양가가 없다 [4] 에어로홍갤로그로 이동합니다. 13.03.06 108 0
348105 파이썬 딕셔너리 비교하려고하는데... [9] ㅍㅍㅍㅍ(1.245) 13.03.06 156 0
348103 아 x밤 api 코딩 짜증나 죽겠네.... [1] 호좁이(112.216) 13.03.06 72 0
348100 프로그래밍 숙제와 관련된 사진과 내용이 있어야 합니다. [2] d(1.214) 13.03.06 84 0
348099 c수업갔는데 vc6.0을 쓰겠데 6.0 [10] 마이리틀포니짱짱갤로그로 이동합니다. 13.03.06 188 0
348098 횽들 간단한 파일 입출력 문제 좀 도와줭 ㅜㅠ [4] 김삼디(110.9) 13.03.06 91 0
348097 두껍다 드립치지마라 [5] dot(113.30) 13.03.06 177 0
348096 공룡책 보지 마라. 이거면 충분하다. [1] os(182.211) 13.03.06 253 0
348095 공룡책 원서 1페이지에 한시간걸림 [3] ㅇㅇ(110.70) 13.03.06 137 0
348094 회사다 ??(61.74) 13.03.06 40 0
348093 분산시스템이라는 과목 어때요? [2] 길가던놈갤로그로 이동합니다. 13.03.06 63 0
348092 컴공과 졸업생중에 전공따라 취업하는애 간추려봤더니 ww(121.186) 13.03.06 204 0
348091 웹에서 php 작업하기 좋은 에디터 추천좀여 ㅎㅎ [9] Mayu갤로그로 이동합니다. 13.03.06 155 0
348090 대학을 안가봐서 그런데 컴공학과 이런데는 [8] (125.177) 13.03.06 238 1
348088 자라 [1] 루비•‿•갤로그로 이동합니다. 13.03.06 55 0
348087 이정도면 이력 죽이는거냐??????????????????????? [2] (125.177) 13.03.06 217 0
348086 전산계열 병역특례에 대해 질문좀 드리겠습니다. [14] (58.232) 13.03.06 129 0
348085 안드레기 프로그래밍 정복 3판 담달에 나오네 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ [2] (125.177) 13.03.06 98 0
348084 hot to program 시리즈는 뭐가 본좌냐?????????????? [2] (125.177) 13.03.06 57 0
348083 다음에가봐라 미친새끼들졸라많다 [4] ㅈㄷㄱ(175.215) 13.03.06 194 5
348082 정전협정 백지화? [2] 이모군(175.114) 13.03.06 70 0
348081 가끔 프로젝트할때 내가 잘알지도 못하는 언어로 해야된다는게 좆같을뿐 [1] 푸조(121.186) 13.03.06 101 0
348079 교수가 닥치고 프리 뛰래 ss(121.186) 13.03.06 166 0
348078 님들 전 특기자가 아니라 그저 스토리를 만드려는거 뿐임 [4] ㅇㄹㄹ(210.219) 13.03.06 46 0
348077 게임할때 창모드가 렉덜걸려 아니면 전체모드가 덜걸려 ? [1] 연댕(183.108) 13.03.05 81 0
348076 드림위버 코드 정리 거지같네요 [1] 네로시엔갤로그로 이동합니다. 13.03.05 48 0
348074 군복이랑 전투화 꺼내놨다. D-15인데 개전15일 후에 입소하라는 거냐? 운지(218.48) 13.03.05 65 1
348073 대학때 화일처리론 안들으면 영향받는 과목이? DB임? [3] ㅇㅇ(121.161) 13.03.05 169 0
348072 vmware도 그래픽 영향타냥 ??? [2] 연댕(183.108) 13.03.05 84 0
348071 난 그냥 책 받았는데 [1] 네로시엔갤로그로 이동합니다. 13.03.05 43 0
348070 다들 공룡책만 빠는데 난 이책으로 공부함. [1] ㅇㅇㅇ(1.209) 13.03.05 159 0
348067 프갤횽들 이제갓고딩된새끼인데(진지글) [11] ㅇㄹㄹ(210.219) 13.03.05 163 0
348059 우분투 느린이유 [1] 룰루루루(116.33) 13.03.05 68 0
348058 공룡책은 학부때 다 띠는거 아니냐? ㅋㄱ(183.96) 13.03.05 89 0
348057 아니 ㅋㅋㅋ 그게중요한게아니라 CentOS돌렸을땐 빠르게잘만돌아갔다 [3] 사레레통령갤로그로 이동합니다. 13.03.05 87 0
348054 밑에 우분투 느리다고한사람인디 울집컴성능말해주겟삼..느릴이유가없삼 [4] 사레레통령갤로그로 이동합니다. 13.03.05 73 0
348053 안녕하세요 이 현상에 대해서좀ㅜㅜ [2] 걍손님(118.39) 13.03.05 77 0
348052 VMware로 우분투돌렸는데 왜케느리냐? 램1GB,CPU1개,하드20GB [10] 사레레통령갤로그로 이동합니다. 13.03.05 91 0
348051 전자게이나 전기게이나 내가 볼땐 그게 그거.. [1] ㅋㄱ(183.96) 13.03.05 59 0
348050 컴공2학년인데 자바 강의 교수님이 아예영어로 말하네..ㅋㅋ다른과목들도영어 [3] 사레레통령갤로그로 이동합니다. 13.03.05 162 0
348049 형들 VMware로 우분투 깔았는데 내원래컴퓨터보다 훨씬느린이유가뭐야? [4] 사레레통령갤로그로 이동합니다. 13.03.05 100 0
348047 루트 알고나니까 잼있네여 [2] 무식(61.255) 13.03.05 71 0
348046 자바스크립트 vs 자바 vs 파이선 [2] 8구(121.186) 13.03.05 129 0
348045 닷넷 vs api [3] 11(211.194) 13.03.05 66 0
348042 기구설계 이것도 프로그래밍 영역임? [4] 있기없기(118.44) 13.03.05 82 0
348041 스프링 이거 다 필요한거임? [3] 부스타(14.36) 13.03.05 99 0
348039 공룡책 [1] ?(175.203) 13.03.05 113 0
348038 공룡책이뭐임?;; [5] 나라용갤로그로 이동합니다. 13.03.05 210 0
뉴스 이봉원, ♥박미선 ‘건강 문제’로 눈물…“그래도 많이 괜찮아져” 디시트렌드 06.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2