[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]/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]/dsPIC33-SM2010. 5. 16. 09:00

dsPIC33 DAC 테스트

dsPIC33 DAC 테스트


dsPIC33 에는 DAC모듈이 있다. Audio DAC라는 이름으로 거의 Audio전용의 DAC모듈이라 생각하면 된다.
이 모듈 이용하면 여러가지 활용도가 많을것 같아 테스트 하면서 정리해 본다.

Audio Digital-to-Analog Converter (DAC) 특징
• 16-bit resolution (14-bit accuracy)
• Second-Order Digital Delta-Sigma Modulator
• 256 X Over-Sampling Ratio
• 128-Tap FIR Current-Steering Analog Reconstruction Filter
• 100 KSPS Maximum Sampling Rate
• User controllable Sample Clock
• Input Frequency 45 kHz max
• Differential Analog Outputs
• Signal-To-Noise: 90 dB
• 4-deep input Buffer
• 16-bit Processor I/O, and DMA interfaces

dsPIC33 DAC블록도


DAC 출력 특성
16비트 DAC이므로 DSC1RDAT 레시스터에 값을 쓰면 아래와 같은 출력된다. 일반 DAC용도로 쓰려면 외부에 신호 변환 소자가 필요할것 같다.



[dsPIC33-SM EVM] 모듈의 핀맵
dsPIC33FJ128M804를 사용한 dsPIC-33 EVM모듈은 CN2의 RB11, RB12, RB13, RB14에 각각 연결되어 있다.





dsPIC DAC출력 테스트 동영상



dsPIC33 DAC 모듈 초기화 함수

void initDac(void)
{
 Sbi(AD1PCFGL, BIT6|BIT7);

 //Initiate DAC Clock
 ACLKCONbits.SELACLK = 0;  // FRC w/ Pll as Clock Source
 ACLKCONbits.AOSCMD = 0;  // Auxiliary Oscillator Disabled
 ACLKCONbits.ASRCSEL = 0;  // Auxiliary Oscillator is the Clock Source
 ACLKCONbits.APSTSCLR = 7;  // FRC divide by 1 

 DAC1STATbits.ROEN = 1;   // Right Channel DAC Output Enabled 
 DAC1STATbits.RMVOEN= 1;  // Right Channel DAC Output Enabled  

 DAC1STATbits.LOEN = 1;   // Left Channel DAC Output Enabled 
 DAC1STATbits.LMVOEN= 1;  // Left Channel DAC Output Enabled  
 DAC1DFLT = 0x8000;   // DAC Default value is the midpoint 
 
 // 103.16KHz   // 8.038KHz  // 44.211KHz // 25KHz
 DAC1CONbits.DACFDIV = 5;       //76;    //13;       // 23; //  // Divide High Speed Clock by DACFDIV+1
 
 // DAC1CONbits.FORM = 1;   // Data Format is signed integer
 DAC1CONbits.FORM = 0;   // Data Format is signed integer
 DAC1CONbits.AMPON = 0;   // Analog Output Amplifier is enabled during Sleep Mode/Stop-in Idle mode

 DAC1CONbits.DACEN = 1;   // DAC1 Module Enabled
}

//DAC 테이터 출력
#define DAC1Out(Data)                         while(DAC1STATbits.REMPTY != 1; DAC1RDAT = (Data);


dsPIC DAC 테스트 소스코드 - VR의 ADC값에 따라 DA출력
int main(void)
{
 int flag = 0;
 unsigned int adc_val = 0;
 SystemInit();

//Init LED
 Led1Init();
 Led2Init();

 DebugInit(BAUD_115200);
 DebugPrint("dsPIC33 DAC test Program\r\n");
 
 Led1On();
 Led2Off();

 //adc init
 AdcInit();
 initDac();

 while(1)
 {
  if(flag)
  {
   adc_val = AdcRead(0);
   printf("%d\r\n", adc_val);

   //DAC 출력
   DAC1Out(adc_val<<4);

   Delay(10);
  }

}

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2010. 3. 2. 18:35

dsPIC33 ADC 테스트

dsPIC33 ADC 테스트




ADC 변환 비트 모드
AD1CON1bits.AD12B =1;  //AD변환 비트 값 설정: 12-bit, 1-channel ADC operation

AD1CON1bits.ASAM = 1; //자동 AD변환 시작
AD1CON1bits.SiMSAM = 1 //CH0, CH1 .. 동시에 샘플링
AD1CON1bits.FORM<1:0>
 11 : signed factional
 10 : fractional
 01 : signed integer
 00 : integer


ADC 채널 선택
CHPS<1:0>: ADC 채널 선택
When AD12B = 1, CHPS<1:0> is: U-0, Unimplemented, Read as ‘0’
1x =Converts CH0, CH1, CH2 and CH3
01 =Converts CH0 and CH1
00 =Converts CH0

ex)  AD1CON2bits.CHPS=0;   //AD 변환 채널 설정 : CH0


ADC Ref선택


ex)
AD1CON2bits.VCFG = 0;  //AD변환 기준 전압 설정: Vreg+ = Vdd, Vreg- = Vss

AD1CHS0: ADC1 입력 채널 0 선택

CH0NB: Channel 0 Negative Input Select for Sample B bit
1 = Channel 0 negative input is AN1
0 = Channel 0 negative input is VREF


CH0SB<4:0>: Channel 0 Positive Input Select for Sample B bits
dsPIC33FJ32MC304, dsPIC33FJ64MC204/804, and dsPIC33FJ128MC204/804 devices only:
01000 = Channel 0 positive input is AN8

00010 = Channel 0 positive input is AN2
00001 = Channel 0 positive input is AN1
00000 = Channel 0 positive input is AN0
dsPIC33FJ32MC302, dsPIC33FJ64MC202/802, and dsPIC33FJ128MC202/802 devices only:
00101 = Channel 0 positive input is AN5

00010 = Channel 0 positive input is AN2
00001 = Channel 0 positive input is AN1
00000 = Channel 0 positive input is AN0.


CH0NA: Channel 0 Negative Input Select for Sample A bit
1 = Channel 0 negative input is AN1
0 = Channel 0 negative input is VREF

CH0SA<4:0>: Channel 0 Positive Input Select for Sample A bits
dsPIC33FJ32MC304, dsPIC33FJ64MC204/804, and dsPIC33FJ128MC204/804 devices only:
01000 = Channel 0 positive input is AN8

00010 = Channel 0 positive input is AN2
00001 = Channel 0 positive input is AN1
00000 = Channel 0 positive input is AN0
dsPIC33FJ32MC302, dsPIC33FJ64MC202/802, and dsPIC33FJ128MC202/802 devices only:
00101 = Channel 0 positive input is AN5

00010 = Channel 0 positive input is AN2
00001 = Channel 0 positive input is AN1
00000 = Channel 0 positive input is AN0



AD1CSSL: ADC1 INPUT SCAN SELECT REGISTER


CSS<8:0>: ADC Input Scan Selection bits
1 = Select ANx for input scan
0 = Skip ANx for input scan


AD1PCFGL: ADC1 PORT CONFIGURATION REGISTER

PCFG<8:0>: ADC Port Configuration Control bits
1 = Port pin in Digital mode, port read input enabled, ADC input multiplexor connected to AVSS
0 = Port pin in Analog mode, port read input disabled, ADC samples pin voltage

ex)
 //AD1CSSL 레지스터 : AN0 ~ AN15 아날로그 입력 핀 설정
 Cbi(AD1CSSL, BIT0|BIT1);  //AN0 ~ AN1 AD 입력 핀 설정

 //AD1PCFGL ADC포트 설정  
 Sbi(AD1PCFGL, BIT0|BIT1);  //AN0 ~ AN1 까지 모든 핀 아날로그 입력 핀 설정


AD1CHS123: ADC1 입력 채널 선택



dsPIC ADC테스트 동영상



dsPIC ADC 테스트 소스코드

#include "system.h"
#include "serial.h"

int main(void)
{
 int flag = 0;
 unsigned int adc_val = 0;
 SystemInit();

 //Init LED
 Led1Init();
 Led2Init();

 DebugInit(BAUD_115200);

 DebugPrint("dsPIC33 ADC test Program\r\n");
 
 Led1On();
 Led2Off();

 //adc init
 AdcInit();

 while(1)
 {
  if(flag)
  {
   adc_val = AdcRead(0);
   printf("%d\r\n", adc_val);
   Delay(10);
  }

  if(DebugIsByte())
  {
   Led2Toggle();

   switch(U0_GetByte())
   {
    case '0':
     Led1Off();
     DebugPrint("Led1 Off\r\n");
     break;

    case '1':
     Led1On();
     DebugPrint("Led1 On\r\n");
     break;

    case '3':
     flag = 1;
     break;

    case '4':
     flag = 0;
     break;
  }
 }
}


 

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-SM2010. 2. 1. 11:43

[dsPIC33-SM EVM] 보드 관련 자료 - dsPIC33FJ128MC804

[dsPIC33-SM EVM] 보드 관련 자료 - dsPIC33FJ128MC804



기존 dsPIC33 소형 모듈 PCB가 남아 있지 않아 이번에 [SM-Type EVM] 으로 표준화 해서 제작해 보았다.



44핀 패키지 중 가장 기능이 좋은 dsPIC33FJ128MC804으로 보드 조립



[SM-Type EVM]이라 USB2UART, Bluetooth, Zigbee와 같은 통신 모듈을 연결 가능하다.





dsPIC33 확장 테스트 보드

 

 

dsPIC33F-SM rev2 회로도

 

 


 

Posted by nexp

댓글을 달아 주세요