DSPIC33EP64MC504 70 MIPS Motor Control and General Purpose Family

 

70MIPS DSPIC (DSPIC33E)이 출시되었다. CORTEX-M3와 dspic 중 어떤것이 매리트 있을까?

 

데이터 버스 너비 : 16bit
프로그램 메모리 크기 : 64KB
데이터 RAM 크기 : 8KB
최대 클록 주파수 : 32KHz
프로그래밍 가능한 I/O의 수 : 35
타이머 수 : 7
장치 MIPS : 70 MIPs

CAN (#, type) 1 ECAN

PWM Resolution bits 6
Motor Control PWM Channels 6
Quadrature Encoder Interface (QEI) 1

2-UART
2-SPI
2-I2C

TAG DSPIC
[dsPIC EVM] MP3 Module (VS1033) 테스트



[NET EVM] 보드를 이용하면 W5100과 같은 이더넷 모듈이나 TFT LCD 모듈을 연결하여 테스트 할수 있고 VS1033과 같은 MP3 모듈을 연결하여 네트웍 라디오를 테스트 해 볼 수 있다.





ADC0 -> RB0



dsPIC33 MP3모듈 HAL Driver 코드
//-----------------------------------------------------------------------------
// VS1033 모듈 HAL
#define VS_DREQ_BIT      BIT6
#define VS_DREQ_PORT     PORTB

#define VS_CS_BIT      BIT4
#define VS_CS_PORT      PORTB

#define VS_XDCS_BIT      BIT5
#define VS_XDCS_PORT     PORTB

#define VS_RST_BIT      BIT3
#define VS_RST_PORT      PORTB

#define VS1003_CS_H()      Sbi(VS_CS_PORT, VS_CS_BIT)
#define VS1003_CS_L()      Cbi(VS_CS_PORT, VS_CS_BIT)

#define vs1003_enable()      VS1003_CS_L()
#define vs1003_disable()     VS1003_CS_H()

#define VS1003_XDCS_H()      Sbi(VS_XDCS_PORT, VS_XDCS_BIT)
#define VS1003_XDCS_L()      Cbi(VS_XDCS_PORT, VS_XDCS_BIT)


#define VS1003_RESET_H()     //Sbi(VS_RST_PORT, VS_RST_BIT)
#define VS1003_RESET_L()     //Cbi(VS_RST_PORT, VS_RST_BIT)

#define IsVs1003DataReady()     (GPIOA->IDR&VS_DREQ_BIT)

#define VS_SendByte       SPI1_WriteReadByte
#define VS_InitSpi()      SPI1_Init()
#define VS_SpiSpeed_Low()        SPI1_SetSpeed(SPI_SPEED_1MHZ)
#define VS_SpiSpeed_High()     SPI1_SetSpeed(SPI_SPEED_4MHZ)


#define MP3_PORT_INIT()      Cbi(TRISB, BIT3|BIT4|BIT5);Sbi(TRISB, BIT6);\
                                         VS1003_CS_H();VS1003_XDCS_H();VS1003_RESET_H()
//-----------------------------------------------------------------------------



dsPIC33 SD Card HAL Driver 코드
#define _SPI1_ENABLE    1

//-----------------------------------------------------------------------------
// SD Card HAL
#define _DEBUG_FAT_FILE                 1

#define MMC_CS_PORT      LATB
#define MMC_CS_BIT      BIT7

#define MMC_CS_INIT()     TRISB=0;MMC_CS_HIGH();

#define MMC_CS_HIGH()     Sbi(MMC_CS_PORT, MMC_CS_BIT)
#define MMC_CS_LOW()     Cbi(MMC_CS_PORT, MMC_CS_BIT)
#define MMC_ASSERT_INIT()    MMC_CS_INIT();MMC_CS_HIGH()
#define MMC_ASSERT()     MMC_CS_LOW()
#define MMC_DEASSERT()     MMC_CS_HIGH()


#define MMC_SpiInit()     SPI1_Init()
#define MMC_SendByte     SPI1_WriteReadByte
#define MMC_Send(Data)      SPI1_WriteByte(Data)
#define MMC_Recv()      SPI1_WriteReadByte(0xFF)
#define MMC_RecvP(Data)     MMC_Send(0xFF); (*(Data)=SPI1_ReadByte())
#define MMC_SPISpeed     SPI1_SetSpeed

#define SPI_Mode3()

#define FAT_MAX_NUM_FILE          50

#define FCLK_SLOW()             MMC_SPISpeed(SPI_SPEED_1MHZ) 
#define FCLK_FAST()             MMC_SPISpeed(SPI_SPEED_MAX)
//-----------------------------------------------------------------------------
[dsPIC33 EVM] TFT LCD 출력 속도 테스트



dsPIC33 은 최대 40Mhz로 동작하고 SPI속도 또한 빠르므로 TFT LCD 테스트 해 두면 좋을것 같다. 8비트 방식으로 TFT LCD연결 가능한 확장 테스트 보드 중에서 [EXP_DSP] 보드가 적당할것 같다.

8비트 제어모드에서 1프레임 출력시 60ms 정도 걸린다. (옵티마이즈 한후)



[dsPIC33 EVM] TFT LCD테스트 동영상
SPI 최대 클럭 속도는 13Mhz로 SD Card를 이용하여 BMP파일을 출력 해 보았다.





[dsPIC33 EVM] TFT LCD관련 회로도





[dsPIC33] 리맵관련 자료

[Microchip]/dsPIC | 2011.01.09 21:18
Posted by nexp
[dsPIC33] 리맵관련 자료
dsPIC33은 PPS기능을 제공해 Pin map을 PRx 핀에 원하는 형태로 설정(remap)할 수 있다. 입력과 출력에따라 설정 방법은 다르다. PPS제어를 위해서는 UNLOCK_PPS() 해서 설정하고, 설정후에는 LOCK_PPS() 를 해 주어야 한다.

입력핀일 경우
예를 들어 UART의 경우  RPINR18 레지스터에 입력 RP를 설정하면 된다.

//U1RX를 RP20번 핀에 입력으로 연결
RPINR18bits.U1RXR = 20;      
or
_U1RXR = 20;



RPINR18은 UART레지 리맵 레지스터 이다.




출력핀일 경우
U1TX 입력은 3번이므로 3을 할당하면 된다.

//RP19핀을 U1TX에 연결
_RP19R = 3;




[dsPIC33 EVM] rev3 보드 제작

[Microchip]/dsPIC | 2010.09.10 18:14
Posted by nexp
[dsPIC33 EVM] rev3 보드 제작


[dsPIC33 EVM] PCB도 얼마 남지 않아 표준핀맵으로 다시 제작 했다.

USB2UART, Bluetooth,Zigebee와 같은 통신 모듈을 연결할 수 있도록 했고 좀더 심플하게 정리 했다.



확장 테스트 보드
LCD, VR, SW, MP3(VS1033)




EXP-ARM 확장 테스트 보드에 연결하여  TFT LCD테스트




[dsPIC33 EVM] rev3 회로도






TAG DSPIC

dsPIC33 DAC 테스트

[Microchip]/dsPIC33-SM | 2010.05.16 09:00
Posted by nexp
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);
  }

}

dsPIC33 ADC 테스트

[Microchip]/dsPIC33-SM | 2010.03.02 18:35
Posted by nexp
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;
  }
 }
}


 

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



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



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



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





dsPIC33 확장 테스트 보드

 

 

dsPIC33F-SM rev2 회로도

 

 


 

[dsPIC33] SPI 테스트

[Microchip]/dsPIC | 2009.12.01 11:56
Posted by nexp
[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)핀 연결이 반대 이므로 주의 해야 한다.


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)

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)