본문 바로가기
Embedded/MCU

S32K144EVB를 이용한 PWM 실습(1)

by kjy1010 2024. 1. 24.

S32K144EVB를 이용하여 ADC 테스트를 하고, FreeMASTER로 모니터링하는 실습을 진행해보도록 하겠습니다.

 

ADC의 결과값을 PWM 듀티로하여 LED로 출력하기

 

1. PWM 회로도 설정

FTM0 사용 : PTD15 -> Red LED

LED OUT Full-up
- PTD0 : Blue LED
- PTD15 : Red LED
- PTD16 : Green LED

 

2. PWM Driver 설정

기존 GPIO 설정된 것에서 FTM0를 추가하면 PTD15 에러가 발생합니다.

따라서 기존 GPIO의 PTD15 사용 하지 않은것으로 변경합니다.

 

3. flexTimer_PWM 선택

 

4. FTM initialization 설정

Default로 설정합니다.

  • FTM0
  • System Clock
  • Edge Aligned PWM
  • Software Trigger
  • Immediate

4번 과정 진행시 참고

5. FTM Configuration 설정

Default로 설정합니다.

  • PWM Frequency : 1,000Hz

5번 과정 진행시 참고

 

6. FTM Channels Configuration 설정

Default로 설정합니다.

  • Channel 0
  • Channel Polarity : Active low
  • Duty Cycle : 0%

6번 과정 진행시 참고

 

7. Update Code

 

8. PWM 초기 함수 호출

// Initialize FTM PWM
FTM_DRV_InitPwm(INST_FLEXTIMER_PWM_1, &flexTimer_pwm_1_PwmConfig);

 

9. PWM 초기 PWM 선정

  • PWM Ch 1, 1KHz, 0% Duty 등 선정해줍니다.
  • peripherals_flexTimer_pwm_1.c의 내용 참고 (아래 코드)
/* PWM configuration for flexTimer_pwm_1 */
ftm_pwm_param_t flexTimer_pwm_1_PwmConfig =
{
    1U, /* Number of independent PWM channels */
    0U, /* Number of combined PWM channels */
    FTM_MODE_EDGE_ALIGNED_PWM, /* PWM mode */
    0U, /* Dead time value */
    FTM_DEADTIME_DIVID_BY_1, /* Dead time prescale */
    1000U, /* PWM frequency */
    flexTimer_pwm_1_IndependentChannelsConfig, /* The independent PWM channels configuration structure */
    NULL, /* Combined PWM channels configuration structure */
    &flexTimer_pwm_1_FaultConfig /* PWM fault configuration structure */
};

 

10. main.c파일에서 ADC Result 값을 PWM Duty로 설정

  • ADC_Raw : 0 ~ 4096
  • ADC_Voltage : 0 ~ 5.0V
  • PWM_Raw : 0 ~ 32768(2^15)
  • PWM_Percent : 0 ~ 100.0%
  • 아래 코드를 참고
// PWM Duty Conversion from ADC
#define PWM_GAIN    8  // 32768/4096

uint16_t FAN_Raw = 0U;  //0% =0, 100% = 2^15
float 	 FAN_Duty = 0.0f; // 0 ~ 100.0%

for (;;)
  {
	/* Insert a small delay to make the blinking visible */
	//delay(720000);

	/* Toggle output value LED0 & LED1 */
	//PINS_DRV_TogglePins(LED_PORT, 1 << LED_BLUE);
	//PINS_DRV_TogglePins(LED_PORT, 1 << LED_BLUE);

	// Configure ADC channel and software trigger a conversion
	ADC_DRV_ConfigChan(INST_ADC_CONFIG_1, 0U, &adc_config_1_ChnConfig0);

	// Wait for the conversion to be done
	ADC_DRV_WaitConvDone(INST_ADC_CONFIG_1);

	// Store the channel result into a local variable
	ADC_DRV_GetChanResult(INST_ADC_CONFIG_1, 0U, &ADC_Raw);

	// Convert PWM Duty from ADC, 0(0%) ==> 4096(100% = 2^15 = 32768)
	FAN_Raw = ADC_Raw * PWM_GAIN;
	FAN_Duty = (float)FAN_Raw / 32768 * 100; // 0 ~ 100%

	// update PWM Duty From ADC Result: ch0,
	FTM_DRV_UpdatePwmChannel(INST_FLEXTIMER_PWM_1, 0, FTM_PWM_UPDATE_IN_DUTY_CYCLE, FAN_Raw, 0U, true);

	// Call polling function whenever target board is free to or should process FreeMASTER commands(in polling mode)
    FMSTR_Poll();
  }

 

11. 디버깅 결과

(좌) : ADC가 0일때 / (우) : ADC가 2123일때

 

12. FreeMaster 설정하기

S32K144EVB를 이용하여 ADC 실습편에서 설정했기에 해당 내용을 참고하여 진행하시기 바랍니다.

https://kjy1010.tistory.com/80

 

S32K144EVB를 이용한 ADC 실습(1)

S32K144EVB를 이용하여 ADC 테스트를 하는 실습을 진행해보도록 하겠습니다. 추가로 실습환경 구축단계에서 설치했던 FreeMASTER 를 이용해 모니터링까지 진행하겠습니다. ADC 실습 포텐션 미터로 들어

kjy1010.tistory.com

https://kjy1010.tistory.com/81

 

S32K144EVB를 이용한 ADC 실습(2)

이전 포스팅에서 S32 Design Studio for S32 Platform에서 FreeMaster사용을 위한 Setting을 완료하였습니다. 이제 FreeMaster를 실행하여 실습을 위한 Setting을 진행하도록 하겠습니다. FreeMASTER 프로젝트 생성 및

kjy1010.tistory.com

 

12. Oscilocope 실행 결과

 

 

'Embedded > MCU' 카테고리의 다른 글

S32K144EVB를 이용한 SPI 실습(2)  (0) 2024.01.24
S32K144EVB를 이용한 SPI 실습(1)  (2) 2024.01.24
S32K144EVB를 이용한 ADC 실습(2)  (0) 2024.01.24
S32K144EVB를 이용한 ADC 실습(1)  (0) 2024.01.24
S32K144EVB를 이용한 LED 실습  (0) 2024.01.24