STM32F303k8+HAL로 상보 PWM 생성을 시도했다
9127 단어 STM32STM32CubeMX
소개
어쨌든 상보 PWM (Complementary PWM)을 생성하고 싶었기 때문에 시도했습니다.
나는 수색으로 했기 때문에 여러 가지 부적절한 점이 있다고 생각합니다.
그 때 지적해 주시면 수정하겠습니다.
내용
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_pointstatic 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_functionvoid 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에서 출력되지 않습니다.
가능하면 빌드하고 쓰고 움직여 오실로에서 보면 다음과 같은 파형을 얻을 수 있다고 생각합니다.
방법은 우선입니다.
잘 모르는 것, 질문 등이 있으면 감사합니다.
Reference
이 문제에 관하여(STM32F303k8+HAL로 상보 PWM 생성을 시도했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/r_u__r_u/items/c71ce07071a8c8673428
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드는 양이 많아서보기가 어렵 기 때문에 나중에 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에서 출력되지 않습니다.가능하면 빌드하고 쓰고 움직여 오실로에서 보면 다음과 같은 파형을 얻을 수 있다고 생각합니다.
방법은 우선입니다.
잘 모르는 것, 질문 등이 있으면 감사합니다.
Reference
이 문제에 관하여(STM32F303k8+HAL로 상보 PWM 생성을 시도했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/r_u__r_u/items/c71ce07071a8c8673428텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)