[Microchip]/dsPIC33-SM2009. 6. 12. 18:52

[dsPIC MotorDriver] PID제어 PC프로그램 작성

[dsPIC MotorDriver] PID제어 PC프로그램 작성



PC에서 PID값을 설정 및 위치를 제어하고 엔코더 값을 읽어올 수 있는 프로그램 작성



dsPIC33 PID 제어 테스트 동영상
Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2009. 6. 11. 18:50

[dsPIC MotorDriver] PWM테스트

[dsPIC MotorDriver] PWM테스트

dspic33_mcpwm.pdf






dspic의 PWM출력 핀은 GPIO와 공통으로 사용할 수 있도록 되어 있으므로 PWM기능으로 설정할 필요가 있다. PWMCON1레지스터의 PMODx, PENxH, PENxL 비트를 설정하면 된다.
PWM1CON1

 

PMODx : PWM 출력모드 설정
 1 = 개별모드
 0 = Complementray
PENxH : PWMxH I/O 동작설정
 1 = PWM핀으로 사용
 0 = I/O용으로 사용
PENxL : PWMxL I/O설정
 1 = PWM핀으로 사용
 0 = I/O용으로 사용

OVCON
OVCON  레지스터는 각각의 PWM출력핀을 임의로 제어할 수 있는 오브라이드 기능을 설정하기 위한 레지스터이다.
1일때 PWM active상태.

 

dsPIC33-SM EVM의 PWM 핀맵

RB14->PWM1H1
RB15->PWM1L1

RB12->PWM1H2
RB13->PWM1L2

 

  


dspic PWM출력 설정 소스코드

void InitMCPWM(void)
{
 PTPER = FCY/FPWM - 1; //40Mhz/10K 10Khz
 
 //enable PWMs, PWM1,2,3 : Independent 모드로 사용
 PWMCON1 = PWM1L_PEN|PWM1H_PEN|PWM1_MOD_IND|PWM2_MOD_IND|PWM3_MOD_IND;
 OVDCON = PWM1L_EN|PWM1H_EN;

 SEVTCMP = PTPER;
 PWMCON2 = 0x0F00; // 16회 마다 Special Event Triger 발생 --> ADC 수행
 PTCON = 0x8000;  // start PWM . PWM Time Base: free running 모드
 return;
}

//PWM 출력
#define SetPwm1(Value)    PDC1 = (Value)


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2009. 6. 11. 18:41

[dsPIC MotorDriver] QEI 테스트

[dsPIC MotorDriver] QEI 테스트


 
dsPIC33은 PPS기능을 제공해 Pin map을 PRx 핀에 원하는 형태로 설정할 수 있다.
입력과 출력에따라 설정 방법은 다른데 UART의 경우  RPINR18에 입력 RP를 설정하면 된다.
 
//U1RX를 RP20에 입력으로 연결
RPINR18bits.U1RXR = 20;
 
//RP19를 U1TX에 연결
RPOR9bits.RP19R = 3;
 
 
PPS제어를 위해서는 UNLOCK_PPS() 해서 설정하고, 설정후에는 LOCK_PPS() 를 해 주어야 한다.
이 설정은 런타임시 한번만 가능한것 같다. <- 좀더 알아볼 필요가 있음.
그래서 config.h 에 핀맵 정의을 한번에 할수 있도록 했다.
 
 
dsPIC33  QEI블록도
16비트라 약간의 아쉬움은 있지만 나름 편리하고 상당히 간단하게 제어 가능하다



dsPIC QEI 타이밍도




QEI 엔코더 구조





//QEI모듈 초기화 함수
void initQEI(void)
{
 QEI1CONbits.QEIM  = 5; // QEI_MODE_x2_MATCH
 QEI1CONbits.SWPAB  = 0; // QEI_INPUTS_SWAP
 QEI1CONbits.QEISIDL = 1; // QEI_IDLE_STOP
 QEI1CONbits.POSRES = 0; // QEI_INDEX_RESET_DISABLE
 QEI1CONbits.PCDOUT = 0; // QEI_NORMAL_IO
 QEI1CONbits.POSRES = 0; // POS_CNT_ERR_INT_DISABLE
 QEI1CONbits.TQCS = 0;
 QEI1CONbits.UPDN_SRC = 1;
 
 DFLT1CONbits.QECK = 6; // QEI_QE_CLK_DIVIDE_1_128
 DFLT1CONbits.QEOUT = 0; // QEI_QE_OUT_ENABLE
 
 MAX1CNT = 0xFFFF;
 POS1CNT = 0;
}
 
 
dsPIC QEI테스트 결과 시리얼 출력
dsPIC33 EVM test Program.
QEI=0
QEI=2
QEI=4
QEI=6
QEI=6
QEI=8
QEI=10
QEI=14
QEI=20
QEI=22
QEI=26

diPIC33 QEI 테스트 동영상

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2009. 6. 10. 17:09

[dsPIC33 MotorDriver] 타이머 인터럽트 테스트

[dsPIC33 MotorDriver] 타이머 인터럽트 테스트
모터 제어기가 수행될 타이머 인터럽트는 가장 기본 사항이 될것같다. 일반적으로 사용되는 제어 주기인 1ms로 설정해 테스트

dsPIC의 타이머 인터럽트는 상당히 간단하다. 먼저 인터럽트 초기화 하고 클럭 소스의 설정을 위해 TCS비트를 설정하는데 0이면 내부 Tcy를 선택한다. Tcy는 Fosc/2 이므로 80Mhz/2 인 40Mhz가 된다. 그리고 이 클럭소스를 TCKPS비트 설정으로 1/8/64/256 으로 분주 할 수 있다.
타이머 인터럽트 PR1 레지스터 값과 일치할때 발생한다.

dsPIC Timer 블록도



1ms 주기로 인터럽트 생성하기 하기 위한 PR1값 설정은 625이다. 계산법은 아래와 같다.
40Mhz / 64 = 625000Hz -> 1.6us
1ms = 1000us => 1000us/1.6us = 625


dsPIC Timer1 초기화 함수
void Init_Timer1( void )
{
 //타이머1 인터럽트 세팅
 IFS0bits.T1IF = 0;  //타이머1 인터럽트 플래그 초기화
 IPC0bits.T1IP = 4;  //타이머1 인터럽트 우선순위 레벨4로 설정(디폴트값임)
 IEC0bits.T1IE = 1;  //타이머1 인터럽트 동작 모드로 설정
 
 //타이머1 설정
 T1CONbits.TCS = 0;  //내부 클럭 소스 사용( Fosc / 2 = Tcy)

 T1CONbits.TCKPS1 = 1; //프리스케일러 분주비 64:1,TCKPS<1:0> = 10
 T1CONbits.TCKPS0 = 0;  

 T1CONbits.TSYNC = 0; //외부 클럭 소스와 동기화 금지
 
 // 256:1 , 1m 카운팅 값 설정
 PR1 = 625;  

 //타이머1 동작 스타트(T1CONbits.TON = 1)
 T1CONbits.TON = 1;
}

인터럽트 핸들러
void __attribute__((__interrupt__)) _T1Interrupt(void)
{
  // reset Timer 1 interrupt flag
  IFS0bits.T1IF = 0;
 
   m_TimerTick1++;
   return;
}

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2009. 6. 10. 17:04

[dsPIC33 Motor Driver] DC모터 드라이버 보드 제작

[dsPIC33 Motor Driver] DC모터 드라이버 보드 제작



dsPIC33FxMC 를 이용하여 제작한 모터 드라이버용으로 테스트 실험 내용을 기록할 계획임


dsPIC33F202모듈
사용자 삽입 이미지


1


테스트할 모터

Posted by nexp

댓글을 달아 주세요