STM32 MCU 는 PSOC5과 같이 포트를 맘대로 바꾸기 어려워서,

이런 저런 기능을 사용하고 나면 못쓰는 기능들이 생깁니다.

저의 경우에는, TIMx PWM_CHx 핀을 쓰고 싶은데, 없고 TIMx PWM_CHxN 핀은 있어서,
뭐가 다른가 하고 테스트를 해보게 되었습니다.
물론, 메뉴얼을 좀 읽어 보니까 Complementary outputs 기능을 사용할 경우에는 의미가 있지만, 그 내용은 일단 생략하고,
단순한 PWM 출력만을 놓고 테스트 해 봤을 때는, 이름만 다르지 전혀 차이가 없이 사용 가능했습니다.

이 테스트는 STM32F411 Nucleo 보드에서 진행 하였고, 다음과 같은 포트를 사용했습니다.








TIM2 의 설정은 PWM 출력 1개가 나오는데, 이건 오실로 스코프로 찍기 쉽게 
펄스 하나를 TIM2 Update 인터럽트에 맞춰서 내보내도록 설정 한 것으로 중요한 내용이 아니라서 통과하고,
TIM1 의 PWM_CH1 과 PWM_CH2N 을 완벽하게 같은 조건으로 설정하고 포트 출력을 확인해 봤습니다.

[TIM1 PWN 채널 출력 설정]





[위의 설정에 따른 결과]





[설명]
위의 설정은 TIM2 Update INT 마다 TIM1 의 PWM_CH1 과 PWM_CH2N 을 완전히 똑같은 조건으로,
(One Pulse Mode, 5-repeat , 주기 : 5ms, Duty : 1/10) 출력하도록 프로그램을 했고,
오실로 스코프로 출력을 측정한 사진입니다.

결론은 일반적인 PWM 신호를 포트로 출력할 경우는, PWM_CHx 나 PWM_CHxN 은 동일한 출력을 내므로,
PWM_CHx 가 없고 PWM_CHxN 만 있다면 그것을 써도 무방하다.

다만, 프로그램에서 출력 함수가 다르다.
PWM_CHx 출력 함수는 HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)인데,
PWM_CHxN 출력 함수는 HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) 입니다.

다음은 CUBEMX 툴로 설정된 내용을 KEIL 코드로 변환한 소스 중에서,
제가 임의로 추가한 부분입니다.
다음은 먼저 main.c 파일의 main() 함수에서 TIM2 Update Interrupt 시작하는 코드와 TIM2 PWM 포트 출력 코드 이고,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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_TIM1_Init();
  MX_TIM2_Init();
 
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);
  HAL_TIM_Base_Start_IT(&htim2);
    HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_1);
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
 
  }
  /* USER CODE END 3 */
 
}
cs

이 TIM2 인터럽트에 의해 TIM1_PWM_CH1 과 TIM2_PWM_CH2N 을 출력하는 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
    if (htim->Instance == TIM2)
    {
        HAL_TIMEx_OCN_Start(&htim1,TIM_CHANNEL_1);
        HAL_TIM_OC_Start(&htim1,TIM_CHANNEL_2);
    }
    else if (htim->Instance == TIM1)
    {
    }
  /* NOTE : This function Should not be modified, when the callback is needed,
            the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
cs


전체 프로젝트를 첨부해 둡니다.

pwm_chN_out.zip



+ Recent posts