[Microchip]/dsPIC33E2014. 4. 6. 22:00

dsPIC33E - PWM 테스트 (HIGH-SPEED PWM MODULE)

dsPIC33E - PWM 테스트 (HIGH-SPEED PWM MODULE)



dsPIC33EPXXXMC20X/50X 시리즈는 모터제어를 위해 3채널(6 PWM)의 HIGH-SPEED PWM MODULE 이 있다.

70Mhz에서 7.14 ns의 듀티폭을 제어할 수 있다.


dsPIC33E PWM 핀맵

26-PWM1L/T5CK/RB15

25-PWM1H/T3CK/RB14


24-PWM2L/CTPLS/RB13

23-PWM2H/RB12


22-PWM3L/RB11

21-PWM3H/RB10




dsPIC33E PWM 블록도




dsPIC33E PWM 초기화 코드

void InitMCPWM(void)

{

    PTCON = 0x0000;

    PTPER = 16000; //1000

    PHASE1 = 0;

    PDC1 = 16000;


    DTR1 = 0;

    ALTDTR1 = 0;


    PWMKEY = 0xABCD;

    PWMKEY = 0x4321;


    IOCON1 = 0xCC00;

    PWMCON1 = 0x0000;


    PWMKEY = 0xABCD;

    PWMKEY = 0x4321;


    FCLCON1 = 0x0003;

    PTCON2 = 0x0003; //clock prescaler

    PTCON = 0x8000;

}




dsPIC33EP PWM 테스트 동영상

dsPIC33EP32 의 PWM을 이용하여 가변저항의 전압값에 따라 3색 컬러 LED의 밝기를 출력하는 테스트




dsPIC33E - PWM 테스트 예제 코드

int main(void)

{

unsigned int gPwm1Value = MAX_PWM_VALUE;

float adc = 0.0;


//Init System

SystemInit();


DebugInit(BAUD_115200);

DebugPrint("PWM Test\r\n");


//Init LED

Led1Init();

Led1Off();


AdcInit();


InitMCPWM();


while(1)

{

gAdcData[0] = AdcRead(0);

adc = (float)gAdcData[0]*(float)(MAX_PWM_VALUE/MAX_ADC_VALUE);

SetPwm1(adc);

}

}





Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 6. 21:00

dsPIC33E - ADC 테스트

dsPIC33E - ADC 테스트

dsPIC 은 10/12bit SAR ADC로 변환 속도는 최대 1.1Msps 이다. dsPIC33E에서는 약간의 변화가 있었는데 레지스터 맵이 조금 변경되어 기존코드의 수정이 필요 하다.

dsPIC33E ADC블록도
가장 큰 변화는 ADC1BUF가 FIFO형태로 변경된것 같다.



dsPIC33E ADC초기화 코드
//------------------------------------------------------------------------------
// Function Routine
//ADC Initialize
void AdcInit(void)
{
//ADCON1 레지스터 설정
AD1CON1bits.SAMP = 0; //ADC 샘플/홀드 홀딩
AD1CON1bits.ASAM = 1; //ADC 변환 즉시 샘플링 시작 설정
AD1CON1bits.SIMSAM=0; //순서대로 멀티플 채널 샘플 설정
AD1CON1bits.SSRC = 7; //샘플 클럭 설정: 내부 카운터 샘플링 끝나고 변환시작
AD1CON1bits.FORM = 0; //데이터 출력 형식: Integer 
//(DOUT = 0000 dddd dddd dddd)
AD1CON1bits.AD12B =1; //AD변환 비트 값 설정: 12-bit, 1-channel ADC operation
AD1CON1bits.ADDMABM=0; //DMA 버퍼를 Scatter/Gather 모드로 쓰기 설정

//AD1CON2 레지스터
AD1CON2bits.CSCNA=0; //CH0+ 입력에 대한 스캔 입력 설정: Scan inputs
AD1CON2bits.VCFG = 0; //AD변환 기준 전압 설정: Vreg+ = Vdd, Vreg- = Vss

//AD1CON3 레지스터
AD1CON3bits.ADCS = 0x08;//0x3F; //ADC 변환 클럭 설정 : 최대치 설정 
//Tad=Tcy*(ADCS+1)=(1/40M)*64 = 1.6us (625KHz)
//10비트 ADC 변환 시간 Tc = 12*Tad = 19.2us (52KHz)
AD1CON3bits.SAMC=1; //Auto Sample Time = 31*Tad
AD1CON3bits.ADRC=0; //ADC Clock을 시스템 클럭 사용 설정

//AD1CON4 Register 레지스터
AD1CON4bits.DMABL=0; //아날로그 입력당 DMA 버퍼 영역 설정: 1 워드 설정
//AD1CHS 레지스터 : ADC1 입력 채널 1,2,3 선택
AD1CHS123=0; //여기에서는 CH1,CH2,CH3을 사용 안함, 디폴트 값 0

//AD1CHS0 레지스터 : 
AD1CHS0=0; //디폴트 값

//AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
AD1CSSL = 0;

//AD1PCFGL 레지스터
AD1CSSL = 0x0000;
AD1CSSLbits.CSS0=1;   
AD1CSSLbits.CSS1=1;  


//ADC1 인터럽트 설정
IFS0bits.AD1IF = 0; //ADC1 인터럽트 플래그 클리어
IEC0bits.AD1IE = 0; //ADC1 인터럽트 시작 설정

//ADC1 컨버터 동작 개시 설정
AD1CON1bits.ADON = 1; //ADC1 컨버터 동작 
}



dsPIC33E ADC Test 동영상
가변저항에 의해 변화되는 전압값을 그래프로 표시


Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33E2014. 4. 5. 21:30

dsPIC33E - UART 테스트

dsPIC33E - UART 테스트





dsPIC33E UART 블록도




dsPIC33E UART 초기화 코드

UART도 약간의 레지스터 변화가 있어 코드수정이 필요하다.


void U0_Init(unsigned char baud)

{

U0_TXINIT();

U0_RXINIT();


U0_SetBaud(baud);


U1MODEbits.STSEL = 0; // 1 스톱 비트

U1MODEbits.PDSEL = 0; // No 패리티, 8비트  데이터 전송

U1MODEbits.ABAUD = 0; // Autobaud 중지

U1MODEbits.BRGH = 1;


U1STAbits.UTXISEL1 = 1; //인터럽트 사용 중지

U1STAbits.UTXISEL0 = 1; //인터럽트 사용 중지

U1STAbits.URXISEL  = 0; //1 문자 수신후, 인터럽트 발생


U1MODEbits.UARTEN   = 1; //UART1 모듈 동작 시작 설정

U1STAbits.UTXEN     = 1; //UART1 Tx 동작 설정


IFS0bits.U1TXIF = 0; //UART1 송신 인터럽트 플래그 클리어

IFS0bits.U1RXIF = 0; //UART1 수신 인터럽트 플래그 클리어


IEC0bits.U1TXIE = 0; //UART1 송신 인터럽트 중지

IEC0bits.U1RXIE = 0; //UART1 수신 인터럽트 중지


IEC4bits.U1EIE = 0; //UART1 에러 인터럽트 중지

}




dsPIC33E UART 송수신 함수

#define u0_WaitForReceive() while(!IFS0bits.U1RXIF);(IFS0bits.U1RXIF = 0)

#define u0_RxData() (U1RXREG)


#define u0_TxData(Data) (U1TXREG = Data)

#define u0_WaitForSend() while(!U1STAbits.TRMT)


#define u0_IsReceiveData() (IFS0bits.U1RXIF)



unsigned char U0_GetByte(void)

{

u0_WaitForReceive();

return u0_RxData();

}


void U0_PutByte(unsigned char Data)

{

u0_TxData(Data);

u0_WaitForSend();

}




Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2013. 3. 10. 06:24

[dsPIC33F-SM EVM] UART 테스트 - dsPIC33F128MC 사용

[dsPIC33F-SM EVM] UART 테스트 - dsPIC33F128MC 사용

 

dsPIC33의 QFN 타입은 포트 리맵 기능이 있어 UART 핀맵을 변경할 수 있다.

dsPIC33FJ128MC804 를 사용한 보드에서 테스트 할 때 기록해 둘 필요가 있어 정리해 본다.

 

dsPIC33-SM EVM에서 UART는 RC3/RP19(TXD), RC4/RP20(RXD)에 할당되어 있다.

 

실제 코드에서 PPS설정은 아래와 같이 해 주면 된다.

 

#define PPS_CINFIG()     _U1RXR = 20;\
                                         _RP19R  = 3;\

 

 

 

 

 

Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC24F2013. 1. 12. 23:30

[PIC24F16KA EVM] ADC 테스트 - TSL251 Light to Voltage Converter

[PIC24F16KA EVM] ADC 테스트 - TSL251 Light to Voltage Converter

 

 

PIC24F16KA는 500ksps 10bit ADC를 내장하고 있다.

하드웨어적으로 약간의 차이는 있지만 코드는 dsPIC33 ADC 테스트와 거의 호환이 된다.

 

 

 

 

PIC24F ADC 테스트 동영상

PIC24의 ADC는 10bit이고 광센서 TSL251 Light to Voltage Converter를 이용해서 ADC값을 출력해 보았다.

LX1971 센서와 비교해서 광센서의 성능차이도 확이해 볼 수 있다.

 

 

 

 

PIC24F ADC 초기화코드

void AdcInit(void)
{
 //ADCON1 레지스터 설정
 AD1CON1bits.SAMP = 0;  //ADC 샘플/홀드 홀딩
 AD1CON1bits.ASAM = 1;  //ADC 변환 즉시 샘플링 시작 설정
// AD1CON1bits.SIMSAM=0;  //순서대로 멀티플 채널 샘플 설정
 AD1CON1bits.SSRC = 7;  //샘플 클럭 설정: 내부 카운터 샘플링 끝나고 변환시작
 AD1CON1bits.FORM = 0;  //데이터 출력 형식: Integer

 //AD1CON2 레지스터
 AD1CON2bits.CSCNA=0;  //CH0+ 입력에 대한 스캔 입력 설정: Scan inputs
 AD1CON2bits.VCFG = 0;  //AD변환 기준 전압 설정: Vreg+ = Vdd, Vreg- = Vss

 //AD1CON3 레지스터
 AD1CON3bits.ADCS = 0x3F; //ADC 변환 클럭 설정 : 최대치 설정
        //Tad=Tcy*(ADCS+1)=(1/40M)*64 = 1.6us (625KHz)
        //10비트 ADC 변환 시간 Tc = 12*Tad = 19.2us (52KHz)
 AD1CON3bits.SAMC=31;   //Auto Sample Time = 31*Tad
 AD1CON3bits.ADRC=0;   //ADC Clock을 시스템 클럭 사용 설정

 //AD1CHS0 레지스터 :
// AD1CHS0=0;     //디폴트 값

 //AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
 AD1CSSL = 0;
  Sbi(AD1CSSL, BIT0);  //AN0 ~ AN1 AD 입력 핀 설정


 //ADC1 인터럽트 설정  
 IFS0bits.AD1IF = 0;   //ADC1 인터럽트 플래그 클리어
 IEC0bits.AD1IE = 0;   //ADC1 인터럽트 시작 설정

 //ADC1 컨버터 동작 개시 설정
 AD1CON1bits.ADON = 1;  //ADC1 컨버터 동작
}

 

 

#define adc_WaitForCoversion()    while(!AD1CON1bits.DONE)
#define adc_GetData()       (ADC1BUF0)
#define adc_SetChannel(Ch)     //AD1CSSL = ~(Ch);AD1PCFGL = (Ch); 
#define adc_Run()       AD1CON1bits.SAMP = 0;

 

 

//Read ADC Value
unsigned int AdcRead(unsigned char Channel)
{
 adc_SetChannel(Channel);
 adc_Run();

 adc_WaitForCoversion();

 return adc_GetData();
}

 

 

 

 

Posted by nexp

댓글을 달아 주세요