[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

댓글을 달아 주세요

[ST_MICRO]/STM82014. 5. 5. 22:00

STM8S - PWM테스트 (DC모터 속도 제어)

STM8S - PWM테스트 (DC모터 속도 제어)



16비트 타이머 TIM1, TIM2를 이용하여 PWM출력을 각각 4, 3채널씩 출력 가능하다. 

그리고 특이사항으로 PD4는 BEEP 핀이고 1, 2 , 4 kHz 로 사운드 출력을 할수 있다. (이 기능을 사용하려면 옵션비트 AFR7 을 리맵해야 한다고 한다.)

PC6(HS)/SPI_MOSI [TIM1_CH1]

PC7(HS)/SPI_MISO[TIM1_CH2]

PC3(HS)/TIM1_CH3/[TIM1_CH1N]

PC4(HS)/TIM1_CH4/CLK_CCO/AIN2/[TIM1_CH2N]


PD4(HS)/TIM2_CH1/UART1_CK/BEEP

PD3(HS)/TIM2_CH2/AIN4/ADC_ETR

PA3(HS)/TIM2_CH3/[SPI_NSS]

PC5(HS)/SPI_SCK [TIM2_CH1]



STM8S PWM출력 블록도





STM8S PWM을 테스트 하기 위해 PWM출력을 간단한 모터 드라이버 모듈 BA608 을 이용하였다. ADC로 입력되는 가변저항의 전압값에 따른 모터 속도 제어를 테스트 해보았다. 


STM8-SS EVM보드에는 PD4/TIM2_CH1 에 PWM출력이 된다.



모터 드라이버 BA608 모듈 연결은 GND와 PWM신호만 연결하면 된다.




STM8S PWM초기화 함수

STM8 PWM 출력은 15Khz로 설정하고 10bit로 제어 하도록 설정했다.

//STM8 PWM출력 함수

#define SetPwm21(Value)              TIM2->CCR1H = (Value >> 8);\

                                    TIM2->CCR1L = (Value);


//STM8 PWM초기화 함수

void InitPwm2(void)

{

    TIM2_TimeBaseInit(TIM2_PRESCALER_1, 1024); //16000000/1024->15625


    // PWM1 Mode configuration

    TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_HIGH);

    TIM2_OC1PreloadConfig(ENABLE);

    TIM2_ARRPreloadConfig(ENABLE);


    TIM2_Cmd(ENABLE);

}




STM8S PWM 출력 테스트 예제코드

int main( void )

{

    unsigned int cnt = 0;

    unsigned int adc = 0;

    SystemInit();

    

    DebugInit(BAUD_115200);

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

    

    Led1Init();

    Led1On();    

    

//ADC초기화

    AdcInit(0);

//PWM초기화

    InitPwm2();


enable();



    while(1)

    {

        adc = AdcRead(ADC1_CHANNEL_3);

        SetPwm21(adc);

    }

    

    return 0;

}



STM8S PWM테스트 동영상


Posted by nexp

댓글을 달아 주세요

[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

댓글을 달아 주세요

Cortex-M/EFM322013. 4. 30. 23:30

EFM32G210 EVM - PWM테스트 (RGB LED 제어)

EFM32G210 EVM - PWM테스트 (RGB LED 제어)





EFM32는 6개의 PWM출력을 할수 있다. PWM을 이용하여  [Xmega32-EX EVM] 확장 테스트 보드에서 RGB LED 조면제어 테스트를 해 보았다.


EFM32 PWM 기능

- Up-count PWM

- Up/down-count PWM

- Predictable initial PWM output state (configured by SW)

- Buffered compare register to ensure glitch-free update of compare values




EFM32 PWM 출력 핀맵

EFM32는 PWM출력을 위한 2개의 타이머가 있고 각각 3채널, 6개의 PWM을 출력할 수 있다.






EFM32G210F128 Timer 블록도




3채널 PWM 출력 테스트를 위해 Xmega32-EX 확장 테스트 보드의 3색 컬러 LED를 이용하였다.




EFM32 PWM테스트 동영상





EFM32 PWM 초기화 코드

void InitPwm0(void)

{   

    //Enable clock for TIMER0 module

    CMU_ClockEnable(cmuClock_TIMER0, true);

   

    //Set CC0 location 4 pin (PA0) as output

    GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 0);    

    // Set CC1 location 4 pin (PA1) as output 

    GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 0);

    // Set CC2 location 4 pin (PA2) as output 

    GPIO_PinModeSet(gpioPortA, 2, gpioModePushPull, 1);      

  

    

    // Route CC0 to location 3 (PD1) and enable pin

    TIMER0->ROUTE |= (TIMER_ROUTE_CC0PEN | TIMER_ROUTE_CC1PEN |TIMER_ROUTE_CC2PEN | TIMER_ROUTE_LOCATION_LOC1); 


  

    /* Select CC channel parameters */

    TIMER_InitCC_TypeDef timerCCInit = 

    {

    .eventCtrl  = timerEventEveryEdge,

    .edge       = timerEdgeBoth,

    .prsSel     = timerPRSSELCh0,

    .cufoa      = timerOutputActionNone,

    .cofoa      = timerOutputActionNone,

    .cmoa       = timerOutputActionToggle,

    .mode       = timerCCModePWM,

    .filter     = false,

    .prsInput   = false,

    .coist      = false,

    .outInvert  = false,

    };


    

    /* Configure CC channel 0 */

    TIMER_InitCC(TIMER0, 0, &timerCCInit);

    /* Configure CC channel 1 */

    TIMER_InitCC(TIMER0, 1, &timerCCInit);

    /* Configure CC channel 2 */

    TIMER_InitCC(TIMER0, 2, &timerCCInit);

    

    

    /* Set Top Value */

    TIMER_TopSet(TIMER0, TOP);

    

    TIMER_CompareBufSet(TIMER0, 0, 0x7F);

    TIMER_CompareBufSet(TIMER0, 1, 0x7F);

    TIMER_CompareBufSet(TIMER0, 2, 0x7F);

  

    /* Select timer parameters */  

    

    /* With a clock of 48MHZ, a divider of 512 and a resolution of

     256/8 bit the PWM period frequency is approx  366 hz */

    

    TIMER_Init_TypeDef timerInit =

    {

    .enable     = true,

    .debugRun   = true,

    .prescale   = timerPrescale512,

    .clkSel     = timerClkSelHFPerClk,

    .fallAction = timerInputActionNone,

    .riseAction = timerInputActionNone,

    .mode       = timerModeUp,

    .dmaClrAct  = false,

    .quadModeX4 = false,

    .oneShot    = false,

    .sync       = false,

    };

    

    /* Configure timer */

    TIMER_Init(TIMER0, &timerInit);  

}



EFM32 PWM 테스트 소스코드

int main(void)

{

    char r,g,b;

    unsigned int cnt = 0;


    _SystemInit();


    // Ensure core frequency has been updated 

    SystemCoreClockUpdate();

    // Setup SysTick Timer for 1 msec interrupts  

    if (SysTick_Config(SystemCoreClock / 1000)) while (1) ;



    Led1Init();

    Led1Off();

    

    DebugInit(BAUD_115200);

    DebugPrint("EFM32 PWM Test\r\m");

    

   

    InitPwm0();

    LED_RgbSet(r, g, b);

    

while(1)

{

      if(msTicks>10)

      {

          msTicks = 0;

          g= 255-r;

          b= 128-g;

          

          LED_RgbSet(r, g, b);

          if(r<=1)

          {

              r=255;

              

              

              Delay(200);

          }

          else  r -=1;

      }

  }

}




Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC16F2012. 8. 18. 18:17

[PIC16F150x EVM] PIC16F1509 ADC, PWM 테스트

[PIC16F150x EVM] PIC16F1509 ADC, PWM 테스트

 

 

 

 

PIC16F1509는 4개의 10비트 PWM출력이 있다. 20Mhz에서 최대 208khz, 6.5bit 해상도로 출력 가능하다.

 

 

 

 

PIC16F1509 PWM초기화 코드

void Pwm1Init(void)
{
 Cbi(TRISC, BIT5);Cbi(ANSELC, BIT5);

 PWM1CON = 0x00; 
 T2CON = 0b00000111;
 
 PR2 = 255;

 PWM1DCH = PWM1DCL = 0x00; 
 
 T2CON = 0b00000100;  
 
 PWM1DCH = 0b00100000;


 PWM1EN = 1;

 PWM1OE = 1;

 PWM1OUT = 0

 PWM1POL = 0;

 }



void PWM1_SET(unsigned int Duty)

{

PWM1DCH = (Duty >> 2); PWM1DCL = (Duty << 6);

}

 

 

 

PIC16F157x PWM출력 핀맵

 

 

PIC16F1509 ADC, PWM테스트 예제 소스코드

ADC 4에 연결되어 있는 VR값에 따라 PWM을 가변하여 출력 하는 예제 코드 이다.

 

void main(void)
{
 unsigned int ad_value;
 unsigned int pwm = 0;

 SystemInit();
    Led1Init();
 Led1On();
 
 U0_Init(BAUD_57600);
 DebugPrint("PIC16F1509 EVM Test\r\n");
 
 AdcInit();
 Pwm1Init();
 
    while(1)
    {
 
  ad_value = AdcRead(4);
 
  pwm = ad_value;
  PWM1_SET(pwm);


  DebugPrint("PWM(ADC)=%d\r\n", pwm);;
  Delay(50);
    }
}

 

 

 

PIC16F1508 ADC, PWM테스트 동영상

ADC에 연결되 가변저항의 전압값에 따라 PWM을 출력하여 램프 밝기를 조절하는 테스트 동영상

 

 

 

Posted by nexp

댓글을 달아 주세요