'dsPIC33_STUDY'에 해당되는 글 2건

  1. 2016.09.26 dsPIC33 PWM 테스트
  2. 2016.08.17 dsPIC33 EVM - I2C 테스트
[Microchip]/dsPIC33-SM2016. 9. 26. 18:41

dsPIC33 PWM 테스트

dsPIC33 PWM 테스트

dspic_pwm.pdf



dsPIC33FJ32MC302/304, dsPIC33FJ64MCX02/X04 and dsPIC33FJ128MCX02/X04 시리즈는 Motor Control PWM (MCPWM)을 제공하기 때문에 모터 제어용 PWM만 테스트 했는데 이번에 일반 dsPIC33은 MCPWM모듈을 제공하지 않기 때문에  Output Compare module를 이용하여 PWM을 출력 할수 가 있다.



블록도를 보면 Timer2, 3을 기준으로 PWM을 생성할 수 있다. 


PWM출력은 OCFA(OC1:PD0~OC4:PD3) 핀과 OCFB(OC5:PD4~OC8:PD7) 핀에 할당되어 있다.




OCxCON: Output Compare x Control Register


OCTSEL: Output Compare x Timer Select bit

1 = Timer3 is the clock source for Output Compare x

0 = Timer2 is the clock source for Output Compare x



OCM<2:0>: Output Compare x Mode Select bits

111 = PWM mode with fault protection. PWM mode on OCx, Fault pin is enabled

110 = PWM mode without fault protection. PWM mode on OCx, Fault pin is disabled

101 = Continuous Pulse mode. Initialize OCx pin low, generate continuous output pulses on OCx pin

100 = Delayed One-Shot mode. Initialize OCx pin low, generate single output pulse on OCx pin

011 = Toggle mode. Compare event toggles OCx pin

010 = Active High One-Shot mode. Initialize OCx pin high, compare event forces OCx pin low

001 = Active Low One-Shot mode. Initialize OCx pin low, compare event forces OCx pin high

000 = Module Disabled. Output Compare module is disabled




dsPIC33 PWM 모드별 출력 상태








dsPIC33 PWM 테스트 소스 코드


void InitTimer2(void)

{

//타이머2 설정

T2CONbits.TON = 1; //초기치 타이머2 동작 ON

T2CONbits.TSIDL = 0; //아이들 모드시에도 동작 설정

T2CONbits.TGATE = 0; //TGATE 동작 모드 금지

T2CONbits.TCKPS1 = 0; //프리스케일러 분주비 1:1,TCKPS<1:0> = 00

T2CONbits.TCKPS0 = 0;

T2CONbits.TCS = 0; //내부 클럭 소스 사용( Fosc / 2 = Tcy)


TMR2 = 0; //TMR2 초기화

PR2 = 4096; //10khz

}


void InitPwm1(int Enable)

{

if(Enable)

{

InitTimer2();

//OC1CON 레지스터 설정

OC1CONbits.OCSIDL = 0; //아이들 모드시에도 동작 설정

OC1CONbits.OCFLT = 0; //PWM Fault 핀 입력 사용 불가능 설정

OC1CONbits.OCTSEL = 0; //타이머 2 설정

OC1CONbits.OCM = 6; //PWM 모드와 Fault핀 사용 불가 설정, OCM<2:0> = 110

 

//SetPwm1(MAX_PWM_VALUE/2);

SetPwm1(0);

}

else

{

SetPwm1(0);

OC1CONbits.OCM = 0;

}


}



void SetPwm1(unsigned int Value)

{

OC1R = Value;

OC1RS = Value;

}



void __attribute__((__interrupt__)) _OC1Interrupt(void)

{

IFS0bits.OC1IF = 0;

}



Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC2016. 8. 17. 03:24

dsPIC33 EVM - I2C 테스트

dsPIC33 EVM - I2C 테스트




dspic33_i2c.pdf


dsPIC33 EVM  보드의 I2C는 RG2(SCL), RG3(SDA)에 연결되어 있다.





dsPIC33 I2C 초기화 코드

void i2c_init(unsigned int Speed)

{

OpenI2C1( I2C_ON, I2C_BRG );

}




dsPIC33 I2C Read/Write 소스 코드

unsigned char i2c_read_byte(unsigned char Addr, unsigned char reg)
{
unsigned char data = 0;
unsigned char SlaveAddress = Addr;
char i2cData[10];
int DataSz;
int Index = 0;
i2cData[0] = (SlaveAddress << 1) | 0;
i2cData[1] = reg;
DataSz = 2;
StartI2C1();
IdleI2C1();
while( DataSz )
{
MasterWriteI2C1( i2cData[Index++] );
IdleI2C1();
DataSz--;
if( I2C1STATbits.ACKSTAT )
break;
}
RestartI2C1();
i2c_wait(10);
IdleI2C1();
MasterWriteI2C1( (SlaveAddress << 1) | 1 );
IdleI2C1();
data = MasterReadI2C1();
StopI2C1();
IdleI2C1();
return data;
}
void i2c_write_byte(unsigned char Addr, unsigned char reg, unsigned char data)
{
unsigned char SlaveAddress = Addr;
char i2cData[10];
int DataSz;
int Index = 0;
char status;
i2cData[0] = (SlaveAddress << 1) | 0;
i2cData[1] = reg;
i2cData[2] = data;
DataSz = 3;
StartI2C1();
IdleI2C1();
while( DataSz )
{
MasterWriteI2C1( i2cData[Index++] );
IdleI2C1();
DataSz--;
if( I2C1STATbits.ACKSTAT )
break;
}
StopI2C1();
IdleI2C1();
}






















dsPIC33 EVM을 이용한 I2C 온습도 센서 테스트 예제



Posted by nexp

댓글을 달아 주세요