STM32F303k8+HAL로 상보 PWM 생성을 시도했다

9127 단어 STM32STM32CubeMX

소개



어쨌든 상보 PWM (Complementary PWM)을 생성하고 싶었기 때문에 시도했습니다.

나는 수색으로 했기 때문에 여러 가지 부적절한 점이 있다고 생각합니다.
그 때 지적해 주시면 수정하겠습니다.

내용


  • CubeMX에서 설정
  • 생성 된 프로그램에 추가 점

  • CubeMx에서 설정



    먼저 303k8 용 프로젝트를 만듭니다.

    이번에는 nucleo-303k8을 사용합니다.

    초기 상태는 이런 느낌입니다.



    pinout 탭



    트리의 Peripherals에서 TIM1을 확장하고 Channel1 설정PWM Generation CH1 CH1N.

    그러면
    18pin → TIM1_CH1
    13pin → TIM1_CH1N
    로 설정됩니다.



    303k8에서 상보 PWM은 Advanced timer 인 TIM1 만 사용할 수 있습니다.

    TIM2 및 TIM3과 같은 General-purpose timer는 상보 PWM을 지원하지 않으므로 조심하십시오.
    [3/10 추가]
    TIM15, 16, 17에도 상보 채널이있는 것처럼 보이지만 아직 시도하지 않았습니다.

    configuration 탭



    핀 설정이 완료되면 구성 탭으로 이동하여 TIM1의 각 값을 설정합니다.



    값을 설정하는 탭은
    - 카운터 설정
    - PWM Generation Channel 1 and 1N
    두 가지입니다.

    먼저 카운터 설정 탭에서 PWM 주파수를 설정하십시오.

    이번에는 20kHz에서 PWM을 출력하도록 Prescaler와 Counter Period를 결정합니다.

    동작 클럭은 내부 8MHz를 사용하기 때문에
    Prescaler:0
    카운터 기간 : 400-1
    (카운트는 0부터이므로 1 당긴 399를 설정한다)
    예.

    PWM Generation Channel 1 and 1N 탭에서
    모드: Assymetric PWM1
    예.

    [3/9 추가]
    데드 타임 설정은 CubeMx에서도 가능합니다.
    Break And Dead Time management 탭의 맨 아래 열에
    Dead Time : 10 (0-255의 임의 값)
    로 설정하십시오.
    CubeMx 측에서 설정하면 코드 재생성 등에 편리합니다.



    지금까지 설정하면 코드를 생성합니다.


    프로그램에 추가



    코드는 양이 많아서보기가 어렵 기 때문에 나중에 Github 등으로 올립니다.

    [3/10 추가]
    여기에 올라 있습니다. Src/main.c가 본체입니다.

    이번에는 변경된 포인트와 추가 된 함수에 대해 설명합니다.

    변경점



    [3/9 추가]
    위와 같이 CubeMx 측에서 설정해 버리는 것이 코드 재생성 등일 때 편합니다.

    변경할 포인트는 MX_TIM1_Init 함수의 한 곳입니다.

    change_point
    static void MX_TIM1_Init()
    {
    ......
      sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
      sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
      sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
      sBreakDeadTimeConfig.DeadTime = 10; 
      sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
      sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
      sBreakDeadTimeConfig.BreakFilter = 0;
      sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
      sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
      sBreakDeadTimeConfig.Break2Filter = 0;
      sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
      if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    sBreakDeadTimeConfig.DeadTime = 10;이제 데드 타임을 설정하십시오.
    값은 8 비트에서 0-255 사이입니다. 이번에는 우선 10입니다.

    user 함수 추가



    또한 PWM을 쉽게 처리 할 수 ​​있도록 다음 기능을 정의합니다.
    프로토 타입 선언은 적절하게 부탁드립니다.

    user_function
    void user_tim1_pwm_setvalue(float value)
    {
       TIM_OC_InitTypeDef sConfigOC;
       sConfigOC.OCMode = TIM_OCMODE_ASSYMETRIC_PWM1;
       sConfigOC.Pulse = (uint32_t)((400)*value);
       sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
       sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
       sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
       sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
       sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
       HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
       HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
       HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    }
    

    이 함수가 상보로 출력 할 때의 포인트입니다.

    출력 할 값을 결정합니다.sConfigOC.Pulse = (uint32_t)((400)*value);
    설정 값을 반영합니다.HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    CH1로 출력합니다.HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);CH1N으로 출력합니다.HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    맨 마지막 HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);이 없으면 CH1N에서 출력되지 않습니다.

    가능하면 빌드하고 쓰고 움직여 오실로에서 보면 다음과 같은 파형을 얻을 수 있다고 생각합니다.



    방법은 우선입니다.

    잘 모르는 것, 질문 등이 있으면 감사합니다.

    좋은 웹페이지 즐겨찾기