아두이노 프로 PORTENTA C33의 PWM 기본 설정 주파수는 얼마인가요?
아두이노는 오랜 기간 제품 간 하위 호환성을 유지해 왔습니다. 새로운 아두이노 프로 PORTENTA C33도 예외는 아닙니다. 아두이노 우노와 마찬가지로, PORTENTA C33의 PWM(Pulse Width Modulation, 펄스 폭 변조) 기본 설정 주파수는 8비트 해상도로 대략 490Hz입니다. PWM 기본 설정값은 analogWrite( ) 함수를 사용하여 접근한다는 것을 기억하십시오.
많은 프로젝트의 경우 괜찮은 출발점이지만, 특히 모터 제어가 포함된 고급 프로젝트의 경우 바람직하지 않습니다. 낮은 주파수는 가청 범위이며 PWM의 8비트 해상도도 개선할 수 있습니다. 특히 C33의 르네사스 Arm Cortex 프로세서의 성능을 고려할 경우 더욱 그렇습니다. 이 소자는 익숙한 analogWrite( ) 함수의 기본 설정과 한계를 훨씬 뛰어넘는 성능을 발휘할 수 있습니다.
이 게시글은 C33의 PWM을 활성화하는 방법을 알려줍니다. 이 방법은 듀티 사이클에 분수(부동 소수점) 값을 사용할 수 있어서 PWM 주파수를 임의의 값으로 설정할 수 있습니다. 가장 좋은 점은 이 코드가 이미 아두이노 IDE에 설치되어 있다는 것입니다. 그림 1은 설정에 사용된 하드웨어를 보여줍니다.
그림 1: 아두이노 프로 PORTENTA C33의 PWM은 듀티 사이클을 부동 소수점 백분율로 설정하여 임의의 주파수로 설정할 수 있습니다.
PORTENTA C33의 PWM 코드는 어디에 있나요?
PWM 코드를 찾기 위해서는 아두이노 IDE가 내부적으로 어떻게 동작하는 지 알아볼 필요가 있습니다. 우선, 프로그램을 컴파일(검증)하기 전에 정확한 아두이노 마이크로컨트롤러를 식별해야만 한다는 것을 모두가 알고 있습니다. 이는 IDE가 선택한 마이크로컨트롤러에 맞게 프로그램을 컴파일하도록 지시하기 때문에 중요합니다. 고전적인 blinky 프로그램이 완벽한 예입니다. 하이 레벨 아두이노 코드는 모든 아두이노 제품군에 동일하지만, 컴파일된 기계어는 예를 들어 마이크로칩 ATmega(이전 Atmel)와 르네사스 Arm의 경우 매우 다릅니다.
원하는 아두이노 기판을 선택하면, IDE는 관련된 하드웨어 전용의 파일 묶음을 사용하도록 지시를 받습니다. 윈도우 컴퓨터에서, C33용 PWM 파일의 이름은 pwm.h와 pwm.cpp이며, 다음 위치에 있습니다:
C:\Users\your_name\AppData\Local\Arduino15\packages\arduino\Hardware\renesas_portenta\1.1.0
이 IDE 과정과 관련하여 복잡한 단계가 더 있지만, 우리의 논의에는 이 엄청나게 간략화된 설명만으로도 충분합니다.
PORTENTA C33의 PWM 주파수와 펄스 폭은 어떻게 변경할 수 있나요?
이 과정은 비교적 간단합니다. pwm.cpp와 pwm.h 쌍에 포함된 사전 빌드 된 PwmOut 클래스를 활용하기만 하면 됩니다. 아래 예제 코드에서 볼 수 있듯이, pwm.h의 인클루드로 코드를 시작합니다. 다음 단계는 PwmOut의 인스턴스를 인스턴스화하는 것입니다. 이 코드에서 해당 인스턴스를 myPWM라고 하겠습니다. myPWM을 특정 입출력 핀, 이 예제 코드에서는 D6와 연결하여 myPWM를 인스턴스화합니다. 마지막 단계는 myPWM.begin( )을 사용하여 PWM 인스턴스를 활성화시키는 것입니다. 다른 조치가 없다면, PWM은 듀티 사이클이 50%이고 490Hz인 기본 설정으로 구동될 것입니다.
pwm.h와 pwm.cpp 파일을 살펴보면 PWM을 설정 및 조정하는 다양한 방법이 포함되어 있는 것을 알 수 있을 것입니다. 이 예제 코드에서는, myPWM.period_us(40); 구문을 사용하여 PWM을 25kHz에 동작하도록 설정하였습니다. 마지막으로, myPWM.pulse_perc(D_perc); 구문을 사용하여 듀티 사이클을 조정합니다. 듀티 사이클 백분율(D_perc)은 부동 소수점이어서 PWM 듀티 사이클을 미세하게 제어할 수 있습니다. 이 시연에서 PWM은 영상 1에서와 같이 듀티 사이클이 0%에서 100%로 천천히 변화한 다음 다시 천천히 0%로 되돌아옵니다.
#include "pwm.h"
#define PWM_PIN D6
PwmOut myPWM(PWM_PIN); // constructor associating the PWM with a particular pin
void setup() {
pinMode(PWM_PIN, OUTPUT);
Serial.begin(9600);
myPWM.begin();
myPWM.period_us(40);
}
void loop() {
static float D_perc = 0;
static bool state = 1;
if (state) {
D_perc += 0.25;
if (D_perc > 100){
state = 0;
D_perc = 100;
}
} else {
D_perc -= 0.25;
if (D_perc < 0){
state = 1;
D_perc = 0;
}
}
myPWM.pulse_perc(D_perc);
Serial.println(D_perc);
delay(100);
}
데모 코드를 사용한 결과
데모 프로그램의 결과를 영상 1에서 볼 수 있습니다. Digilent Analog Discovery의 화면 캡쳐와 함께 아두이노 IDE의 직렬 모니터 데이터도 볼 수 있습니다. 25kHz 신호(40us)는 매우 안정적인 것으로 보입니다. 듀티 사이클은 단계별 0.25%씩 부드럽게 변화하고 있습니다.
영상 1: 아두이노 프로 PORTENTA C33가 생성한 25kHz PWM 신호가 0.25%씩 부드럽게 증가하고 있습니다.
마무리 소감
확실히 최적화된 해결책은 아닙니다. 그러나 구현하기 비교적 쉬웠으며, 결과도 서보 모터 제어를 포함할 다음 기사용으로는 훌륭한 것으로 보입니다. 또한, 듀티 사이클 제어가 부동 소수점 백분율로 표현되었다는 점은 교육적 관점에서 도움이 될 것입니다.
여러분의 요구사항에 맞게 코드를 단순화하고 수정하는 것은 여러분에게 맡기겠습니다. 팁과 제안을 해주십시오. 더 나아가, 이 고급 PWM 기술을 여러분의 프로젝트에 사용한 경험을 공유해 주시기 바랍니다.
감사합니다,
APDahlen
연관된 아두이노 교육 콘텐츠는 이 링크를 참조해 주시기 바랍니다.
저자 정보
미합중국 해안경비대(USCG) 소령(LCDR)으로 전역한 Aaron Dahlen은 DigiKey에서 애플리케이션 엔지니어로 근무하고 있습니다. 27년간의 군 복무 동안 기술자 및 엔지니어로서 쌓아온 그 만의 전자 및 자동화에 대한 지식은 12년간의 교단을 통해 (상호 연계되어) 더욱 향상되었습니다. 미네소타 주립대학, Mankato에서 전기공학 석사(MSEE) 학위를 받은 Dahlen은 ABET(Accreditation Board for Engineering and Technology, 미국 공학 기술 인증 위원회) 공인 전기공학 과정을 가르치고, EET(Electrical Engineering Technology, 전기공학 기술) 과정의 프로그램 조정관으로 일했으며, 군 전자 기술자에게 부품 수준의 수리에 대해 가르쳤습니다. 미네소타 주 북부의 집으로 돌아와 이런 류의 연구와 글쓰기를 즐기고 있습니다. LinkedIn | Aaron Dahlen - Application Engineer - DigiKey
영문 원본: Advanced PWM Functionality with the Arduino PORTENTA Pro C33