[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

댓글을 달아 주세요

[Microchip]/dsPIC2009. 12. 1. 11:56

[dsPIC33] SPI 테스트

[dsPIC33] SPI 테스트



dsPIC33 SPI 블록도






SPI모드 설정
 SPI2CON1bits.SMP = 0;  //한 주기 클럭 중간에서 데이터 출력 위상 설정
 SPI2CON1bits.CKE = 0;  //MODE 0,0 , 클럭이 LOW 상태에서
 SPI2CON1bits.CKP = 0;  //MODE 0,0 , 데이터 비트 중간에 High







SPI클럭 설정






dsPIC33 SPI 초기화 코드
// SPI 초기화 함수
void SPI1_Init(void)
{
 SPI2CON1bits.DISSCK = 0;  //내부 시리얼 클럭 사용 설정
 SPI2CON1bits.DISSDO = 0;  //SPI모듈 SDO2 핀 사용 설정
 SPI2CON1bits.MODE16 = 0;  //송수신 전송 데이터 크기 : 8비트 설정
 SPI2CON1bits.SMP = 0;  //한 주기 클럭 중간에서 데이터 출력 위상 설정
 
 //SPI 모드 설정 
 SPI2CON1bits.CKE = 0;  //MODE 0,0 , 클럭이 LOW 상태에서
 SPI2CON1bits.CKP = 1;  //MODE 0,0 , 데이터 비트 중간에 High
 SPI2CON1bits.MSTEN = 1;  //마스터 모드 설정
 
  //SPI 보레이트 설정
  SPI2CON1bits.PPRE = 1;   //16:1
  SPI2CON1bits.SPRE = 1;   //8:1

 SPI2CON2bits.FRMEN = 0;  //프레임 모드 사용 중지
 SPI2CON2bits.FRMPOL = 0;  //프레임 동기 신호 액티브 로우
 SPI2CON2bits.FRMDLY = 0;  //프레임 동기 신호 첫번째 클럭 비트 전에 발생

 SPI2STATbits.SPISIDL = 0;  //아이들 모드시에도 계속 SPI 모듈 동작 설정
 SPI2STATbits.SPIROV = 0;  //수신 오버플로우 발생하지 않음
 SPI2STATbits.SPIEN = 1;  //SPI 모듈 사용 설정

 IFS2bits.SPI2IF = 0;   //SPI2 인터럽트 플래그 클리어
 IEC2bits.SPI2IE = 0;   //SPI2 인터럽트 사용 안함, 폴링 방식
 IPC8bits.SPI2IP = 4;   //SPI2 인터럽트 우선순위 = 4(디폴트 값)으로
}


dsPIC SPI 송수신 함수
unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 //전송 가능  체크
 while(SPI2STATbits.SPITBF);
 SPI2BUF = Data;     // 데이터 송신

 //수신 대기
 while(SPI2STATbits.SPIRBF == 0);
 return SPI2BUF;     //데이터 수신
}



dsPIC SPI 연결도
다른 MCU와 다르게 MOSI(SDI), MISO(DSO)핀 연결이 반대 이므로 주의 해야 한다.

Posted by nexp

댓글을 달아 주세요

[Microchip]/dsPIC33-s2009. 9. 15. 00:59

dsPIC33 - dsPIC Remap포트 설정(UART 테스트)


dsPIC33FJ802MC 를 이용하여 여러가지 테스트를 하던중에 UART설정에 오류가 있는걸 확인했다.

dsPIC33은 PPS기능을 제공해 Pin map을 PRx 핀에 원하는 형태로 설정(remap)할 수 있다.
입력과 출력에따라 설정 방법은 다른데 UART의 경우  RPINR18에 입력 RP를 설정하면 된다.
 
//U1RX를 RP20에 입력으로 연결
RPINR18bits.U1RXR = 20;
 
//RP19를 U1TX에 연결
RPOR9bits.RP19R = 3;

 
PPS제어를 위해서는 UNLOCK_PPS() 해서 설정하고, 설정후에는 LOCK_PPS() 를 해 주어야 한다.

그리고 만약 포트가 ADC와 겹쳐있다면 ADC기능을 disable해 주어야 한다.
#define U0_RXINIT()  (AD1PCFGL = 0xFFFF)

테스트 동영상




MPLAB 컴파일러를 업데이트하면  [pps.h]가 추가되는데 이것을 이요하면 쉽게 설정 가능하다.
#define  PPSUnLock      __builtin_write_OSCCONL(OSCCON & 0xbf)
#define  PPSLock      __builtin_write_OSCCONL(OSCCON | 0x40)

Posted by nexp

댓글을 달아 주세요