[ST_MICRO]/STM32H72018. 12. 1. 04:53

STM32H7 CubeMx를 이용한 PWM출력 테스트 - 1Mhz PWM

STM32H7 CubeMx를 이용한 PWM출력 테스트 - 1Mhz PWM


STM32CubeMx를 실행해 프로젝트 생성후 핀맵 할당한다.

STM32H7_EVM 보드의 TIM2_CH1(PA5)에  PWM출력 되도록 했다.





TIM2에서 PWM 모드 설정해 주면 된다.







STM32H7 CubeMx 프로젝트 생성후 아래와 같이 HAL코드(HAL_TIM_PWM_Start 함수)로 PWM 출력을 시작 할 수 있다.


  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

  //주파수 편경
  TIM2->ARR = 100-1;// 100 x 5ns

  //펄스폭 가변
  TIM2->CCR1 = 50-1;





생성된 코드를 돌려보면 PWM이 2Mhz로 출력이 된다.
뭐가 설정이 잘못 되었나?
APB2 클럭 최대가 100Mhz로 되어 있어 타이머에 100Mhz가 공급될것으로 생각하고 있었는데...
CubeMX에서 클럭 설정 부분을 잘 보니 TIMER의 경우 200Mhz가 공급 된다고 되어 있다.







그러면 ARR레지스터에 100을 입력 하면 2Mhz로 출력이 되는것이 맞는것 같다.
TimeClk
200000000
Prescale
1
클럭당시간
0.000 000 005
ARR값
100
PWM주파수
2000000


PWM을 50단계까지 생각한다면 최대 PWM주파수를 4Mhz까지 출력 가능 할것 같다.

1Mhz로 구동한다면 200단계 정도 인데... 고속 PWM제어에 바로 쓰기는 약간 아쉬움이 있는것 같다.



기존 STM32F0 PWM 출력 테스트와 비교하면 4배 정도(48Mhz->200Mhz 기준) 좋은것 같다.


참고로 STM32F7 PWM 출력 테스트도 비교할 만하다.

Posted by nexp
TAG PWM, STM32H7

댓글을 달아 주세요

[ST_MICRO]/STM32F0x2017. 6. 3. 03:01

STM32 CubeMX - PWM HAL Code 테스트

STM32 CubeMX - PWM HAL Code 테스트






STM32F0의 TIMx 클럭은 PCLK가 소스가 된다. 쵀대 48Mhz로 설정 가능













STM32CubeMX 를 이용하여 TIM1, TIM3 설정탭에서 PWM을 설정한다.






파라 미터 설정은 적정한 값으로 설정한다.


10khz 주파수로 PWM 출력을 하려면 어떻게 설정 해야 할까?
10Khz는 100us 이므로 ARR 레지스터에 100us가 되는 값을 설정하면 된다.

먼저 48Mhz를 48로 나누어 1Mhz -> 1us로 되도록 하고 ARR값에 100을 넣으면 100us 가 된다. (주의 사항은 0부터 시작하므로 1을 빼준 값을 설정해야 한다.)







  //프리스케이일
  TIM1->PSC = 48-1;

  //주파수 편경
  freq = 100;// 100us
  TIM1->ARR = freq-1;

  //펄스폭 가변
  TIM1->CCR1 = freq/2-1;





이렇게 설정하고 구동 시켜보면 10khz 주파수로 PWM 출력 되는것을 확인 할 수 있다.





그럼 STM32F0에서 최대 PWM 주파수는 얼마 까지 가능할까?

48Mhz -> 0.20833333ns 이므로 100단계 PWM을 생각 한다면 480Khz 정도 될것 같다.



1Mhz로 PWM출력을 내려고 하면 50단계도  되지 않는 수준이다.

8비트 해상도 256단계 정도로 설정한다면 최대 187.5Khz정도 이다.




STM32 PWM출력 Start

//PWM CH1 Start

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);




STM32 펄스폭 및 주파수 설정

  //펄스폭 가변

  TIM1->CCR1 = 50-1;



  //주파수 변경

  TIM1->ARR = 100-1;





STM32F0 PWM 테스트 코드

int main(void)

{


  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* Configure the system clock */

  SystemClock_Config();


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_TIM1_Init();


  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);


  //펄스폭 가변

  TIM1->CCR1 = 50-1;


  //주파수 변경

  TIM1->ARR = 100-1;


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */


  }

  /* USER CODE END 3 */


}





Posted by nexp
TAG PWM, STM32F0

댓글을 달아 주세요

[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

댓글을 달아 주세요