- PWM 신호의 기초
- 하드웨어 설정 및 요구 사항
- Nuvoton N76E003 마이크로 컨트롤러 LED 디밍에 대한 회로 다이어그램
- N76E003 Nuvoton 마이크로 컨트롤러의 PWM 핀
- N76E003 Nuvoton 마이크로 컨트롤러의 PWM 레지스터 및 기능
- Nuvoton N6E003 마이크로 컨트롤러의 PWM 작동 모드
- PWM 용 Nuvoton N76E003 프로그래밍
- 코드 플래싱 및 출력 테스트
펄스 폭 변조 (PWM)는 정의 된 주파수 및 듀티 사이클로 연속 펄스 신호를 생성하기 위해 마이크로 컨트롤러에서 일반적으로 사용되는 기술입니다. 요컨대 PWM은 주파수가 일정하면서 펄스의 폭을 변경하는 것입니다.
PWM 신호는 주로 서보 모터 또는 LED의 밝기를 제어하는 데 사용됩니다. 또한 마이크로 컨트롤러는 출력 핀에서 로직 1 (High) 또는 로직 0 (Low) 만 제공 할 수 있으므로 DAC 또는 디지털-아날로그 변환기를 사용하지 않는 한 다양한 아날로그 전압을 제공 할 수 없습니다. 이러한 경우 마이크로 컨트롤러는 가변 듀티 사이클을 사용하여 PWM을 출력하도록 프로그래밍 할 수 있으며이를 가변 아날로그 전압으로 변환 할 수 있습니다. 이전에는 다른 많은 마이크로 컨트롤러에서도 PWM 주변 장치를 사용했습니다.
- ARM7-LPC2148 PWM 튜토리얼: LED 밝기 제어
- MSP430G2를 사용한 펄스 폭 변조 (PWM): LED 밝기 제어
- MPLAB 및 XC8과 함께 PIC 마이크로 컨트롤러를 사용하여 PWM 생성
- STM32F103C8의 펄스 폭 변조 (PWM): DC 팬 속도 제어
- PIC 마이크로 컨트롤러의 GPIO 핀에서 PWM 신호 생성
- Raspberry Pi PWM 튜토리얼
- ESP32를 사용한 PWM 튜토리얼
이 자습서에서는 N76E003 마이크로 컨트롤러 장치의이 PWM 신호를 사용하여 제어 할 LED를 인터페이스합니다. 필요한 하드웨어 설정의 종류와 마이크로 컨트롤러를 어떻게 프로그래밍해야하는지 평가할 것입니다. 그 전에 PWM 신호의 몇 가지 기본 사항을 이해하겠습니다.
PWM 신호의 기초
아래 이미지에는 일정한 PWM 신호가 표시됩니다.
위의 이미지는 동일한 ON 시간 과 동일한 OFF 시간을 가진 일정한 구형파에 지나지 않습니다. 신호의 총주기가 1 초라고 가정합니다. 따라서 켜짐 시간과 꺼짐 시간은 500ms입니다. 이 신호를 통해 LED가 연결되면 LED는 500ms 동안 켜지고 500ms 동안 꺼집니다. 따라서 투시도에서 LED가 꺼지지 않고 직접 5V 신호로 켜지면 실제 밝기의 절반으로 LED가 켜집니다.
이제 위 이미지에서 볼 수 있듯이 듀티 사이클이 변경되면 앞에서 설명한 것과 동일한 원리를 사용하여 LED가 실제 밝기의 25 %로 켜집니다. 펄스 폭 변조 (PWM)에 대해 더 알고 싶다면 링크 된 기사를 확인하십시오.
하드웨어 설정 및 요구 사항
이 프로젝트의 요구 사항은 PWM을 사용하여 LED를 제어하는 것입니다. N76E003과 인터페이스하려면 LED가 필요합니다. N76E003 개발 보드에서 LED를 사용할 수 있으므로이 프로젝트에서 사용됩니다. 다른 구성 요소는 필요하지 않습니다.
말할 것도없이 N76E003 마이크로 컨트롤러 기반 개발 보드와 Nu-Link 프로그래머가 필요 합니다. 프로그래머가 전원으로 사용되지 않는 경우 추가 5V 전원 공급 장치가 필요할 수 있습니다.
Nuvoton N76E003 마이크로 컨트롤러 LED 디밍에 대한 회로 다이어그램
아래 회로도에서 볼 수 있듯이 테스트 LED는 개발 보드 내부에서 사용할 수 있으며 포트 1.4에 연결됩니다. 맨 왼쪽에는 프로그래밍 인터페이스 연결이 표시됩니다.
N76E003 Nuvoton 마이크로 컨트롤러의 PWM 핀
N76E003에는 20 개의 핀이 있으며 그중 10 개의 핀을 PWM으로 사용할 수 있습니다. 아래 이미지는 빨간색 사각형 상자에 강조 표시된 PWM 핀을 보여줍니다.
보시다시피 강조 표시된 PWM 핀은 다른 용도로도 사용할 수 있습니다. 그러나 핀의 다른 용도는 핀이 PWM 출력용으로 구성된 경우 사용할 수 없습니다. PWM 출력 핀으로 사용되는 핀 1.4는 다른 기능을 잃게됩니다. 그러나이 프로젝트에는 다른 기능이 필요하지 않기 때문에 문제가되지 않습니다.
핀 1.4를 출력 핀으로 선택하는 이유는 내장 된 테스트 LED가 개발 보드의 해당 핀에 연결되어 있으므로 외부 LED가 필요하지 않기 때문입니다. 그러나 20 핀 중이 마이크로 컨트롤러에서는 10 핀을 PWM 출력 핀으로 사용할 수 있으며 다른 PWM 핀은 출력 관련 목적으로 사용할 수 있습니다.
N76E003 Nuvoton 마이크로 컨트롤러의 PWM 레지스터 및 기능
N76E003은 1/1 ~ 1/128 중에서 선택할 수있는 프리스케일러와 함께 PWM 클록으로 나눈 시스템 클록 또는 타이머 1 오버플로를 사용합니다. PWM주기는 16 비트주기 레지스터 PWMPH 및 PWMPL 레지스터를 사용하여 설정할 수 있습니다.
마이크로 컨트롤러에는 PG0, PG1, PG2, PG3, PG4 및 PG5라는 6 개의 PWM 신호를 생성하는 6 개의 개별 PWM 레지스터 가 있습니다. 그러나 각 PWM 채널은 동일한 16 비트주기 카운터 를 공유하기 때문에주기는 동일하지만 각 PWM 의 듀티 사이클은 {PWM0H, PWM0L}이라는 이름의 다른 16 비트 듀티 사이클 레지스터를 사용하기 때문에 서로 다를 수 있습니다., {PWM1H, PWM1L}, {PWM2H, PWM2L}, {PWM3H, PWM3L}, {PWM4H, PWM4L} 및 {PWM5H, PWM5L}. 따라서 N76E003에서 6 개의 PWM 출력은 서로 다른 듀티 사이클로 독립적으로 생성 될 수 있습니다.
다른 마이크로 컨트롤러와 달리 PWM을 활성화해도 I / O 핀이 PWM 출력으로 자동 설정되지 않습니다. 따라서 사용자는 I / O 출력 모드를 구성해야합니다.
따라서 애플리케이션에 필요한 것이 무엇이든 첫 번째 단계는 PWM 출력으로 어떤 1 개 또는 2 개 또는 2 개 이상의 I / O 핀을 결정하거나 선택하는 것입니다. 하나를 선택한 후 I / O 핀은 PWM 신호를 생성하기 위해 Push-Pull 모드 또는 Quasi-bidirectional로 설정해야합니다. 이것은 PxM1 및 PxM2 레지스터를 사용하여 선택할 수 있습니다. 이 두 레지스터는 x가 포트 번호를 나타내는 I / O 모드를 설정합니다 (예: 포트 P1.0 레지스터는 P1M1 및 P1M2, P3.0의 경우 P3M1 및 P3M2 등).
구성은 아래 이미지에서 볼 수 있습니다.
그런 다음 다음 단계는 특정 I / O 핀에서 PWM을 활성화하는 것입니다. 이를 위해 사용자는 PIOCON0 또는 PIOCON1 레지스터 를 설정해야합니다. 레지스터는 PIOCON0 및 PIOCON1이 PWM 신호에 따라 다른 핀을 제어하므로 핀 매핑에 의존합니다. 이 두 레지스터의 구성은 아래 이미지에서 볼 수 있습니다.
보시다시피 위의 레지스터는 6 가지 구성을 제어합니다. 나머지는 PIOCON1 레지스터를 사용하십시오.
따라서 위의 레지스터는 나머지 4 개의 구성을 제어합니다.
Nuvoton N6E003 마이크로 컨트롤러의 PWM 작동 모드
다음 단계는 PWM 작동 모드를 선택하는 것입니다. 각 PWM은 독립, 동기 및 데드 타임 활성화 모드의 세 가지 작동 모드를 지원 합니다.
독립 모드 는 6 개의 PWM 신호를 독립적으로 생성 할 수있는 솔루션을 제공합니다. 이는 LED 관련 작동 또는 부저를 켜고 제어해야하는 최대 횟수입니다.
동기식 모드 설정한다 PG1 동일한 위상의 PWM 출력 / 3 / 5 PG0 / 2 / 4 독립 PWM 출력 신호들을 제공 PG0 / 2 / 4와 동일. 이것은 주로 3 상 모터를 제어하는 데 필요합니다.
데드 타임 삽입 모드는 조금 복잡하고, 특히 산업용 애플리케이션에서, 실제 모터의 응용 프로그램에 사용되는 비트입니다. 이러한 애플리케이션에서 보완 PWM 출력은 GPIB와 같은 전력 스위칭 장치의 손상을 방지하는 "데드 타임"삽입이어야합니다. 이 모드에서는 PG0 / 2 / 4가 독립 모드와 동일한 방식으로 PWM 출력 신호를 제공하지만 PG1 / 3 / 5는 이에 따라 PG0 / 2 / 4의 "외상 PWM 신호"출력을 제공하는 방식으로 구성이 설정됩니다. PG1 / 3 / 5 듀티 레지스터를 무시합니다.
위의 세 가지 모드는 아래 레지스터 구성을 사용하여 선택할 수 있습니다.
다음 구성은 PWMCON1 레지스터를 사용하여 PWM 유형을 선택하는 것입니다.
따라서 위의 레지스터를 사용하여 선택할 수있는 두 가지 PWM 유형을 사용할 수 있습니다. 에지 정렬에서 16 비트 카운터는 0000H에서 {PWMPH, PWMPL}의 설정 값까지 카운트 업 한 다음 0000H부터 시작하여 단일 슬로프 작동을 사용합니다. 출력 파형은 왼쪽 가장자리로 정렬됩니다.
그러나 중앙 정렬 모드에서 16 비트 카운터는 0000H에서 {PWMPH, PWMPL}까지 카운트 업하여 듀얼 슬로프 작동을 사용하고 다시 카운트 다운하여 {PWMPH, PWMPL}에서 0000H로 이동합니다. 출력은 중앙 정렬되며 겹치지 않는 파형을 생성하는 데 유용합니다. 이제 마지막으로 아래 레지스터에서 확인할 수있는 PWM 제어 작업-
클럭 소스를 설정하려면 CKCON 클럭 제어 레지스터를 사용하십시오.
PWM 출력 신호는 PMEN 레지스터를 사용하여 마스킹 할 수도 있습니다. 이 레지스터를 사용하여 사용자는 출력 신호를 0 또는 1로 마스킹 할 수 있습니다.
다음은 PWM 제어 레지스터입니다.
위의 레지스터는 PWM을 실행하고, 새주기 및 듀티로드를로드하고, PWM 플래그를 제어하고, PWM 카운터를 지우는 데 유용합니다.
관련 비트 구성은 다음과 같습니다.
클록 분할기를 설정하려면 PWM 클록 분할기에 PWMCON1 레지스터 를 사용하십시오. 5 번째 비트는 그룹 모드가 활성화 된 그룹 PWM에 사용되며 처음 3 개의 PWM 쌍에 대해 동일한 듀티 사이클을 제공합니다.
PWM 용 Nuvoton N76E003 프로그래밍
코딩은 간단하며이 튜토리얼에 사용 된 전체 코드는이 페이지 하단에서 찾을 수 있습니다. LED는 P1.4 핀에 연결됩니다. 따라서 P1.4 핀은 PWM 출력에 사용되어야합니다.
메인 프로그램에서 설정은 각각의 순서로 이루어집니다. 아래 코드 줄은 PWM을 설정하고 P1.4 핀을 PWM 출력으로 구성합니다.
P14_PushPull_Mode;
푸시 풀 모드에서 핀 P1.4를 설정하는 데 사용됩니다. 이것은 Function_define.h 라이브러리에 다음과 같이 정의됩니다.
#define P14_PushPull_Mode P1M1 & = ~ SET_BIT4; P1M2- = SET_BIT4 PWM1_P14_OUTPUT_ENABLE;
다음 라인은 핀 P1.4에서 PWM을 활성화하는 데 사용됩니다. 이것은 또한 Function_define.h 라이브러리 에서 다음과 같이 정의됩니다.
#define PWM1_P14_OUTPUT_ENABLE BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; SFRS- = 0x01; PIOCON1- = 0x02; TA = 0xAA; TA = 0x55; SFRS & = 0xFE; EA = BIT_TMP //P1.4 as PWM1 출력 활성화 PWM_IMDEPENDENT_MODE;
아래 코드는 PWM을 독립 모드로 설정하는 데 사용됩니다. 에서 Function_define.h의 도서관, 그것은 된 직후 정의
#define PWM_IMDEPENDENT_MODE PWMCON1 & = 0x3F PWM_EDGE_TYPE;
그런 다음 EDGE 유형 PWM 출력을 설정해야합니다. 에서 Function_define.h의 도서관, 그것은 된 직후 정의
#define PWM_EDGE_TYPE PWMCON1 & = ~ SET_BIT4 set_CLRPWM;
다음으로 SFR_Macro.h 라이브러리 에서 사용할 수있는 PWM 카운터 값을 지워야합니다.
#define set_CLRPWM CLRPWM = 1
그 후 PWM 클록이 Fsys 클록으로 선택되고 사용되는 분할 계수는 64 분할입니다.
PWM_CLOCK_FSYS; PWM_CLOCK_DIV_64;
둘 다 다음과 같이 정의됩니다.
#define PWM_CLOCK_FSYS CKCON & = 0xBF #define PWM_CLOCK_DIV_64 PWMCON1- = 0x06; PWMCON1 & = 0xFE PWM_OUTPUT_ALL_NORMAL;
아래 코드 줄은 다음과 같이 정의 된 0으로 출력 PWM 신호를 마스킹하는 데 사용됩니다.
#define PWM_OUTPUT_ALL_NORMAL PNP = 0x00 set_PWM_period (1023);
그런 다음 PWM 신호의주기 시간을 설정해야합니다. 이 함수는 PWMPL 및 PWMPH 레지스터의주기를 설정합니다. 16 비트 레지스터이므로이 함수는 비트 시프 팅 방법을 사용하여 PWM주기를 설정합니다.
void set_PWM_period (unsigned int value) { PWMPL = (value & 0x00FF); PWMPH = ((값 & 0xFF00) >> 8); }
그러나 1023 및 8 비트 기간 외에 사용자는 다른 값도 사용할 수 있습니다. 기간을 늘리면 부드럽게 어두워 지거나 희미 해집니다.
set_PWMRUN;
그러면 SFR_Macro.h 라이브러리에 정의 된 PWM이 다음과 같이 시작됩니다.
#define set_PWMRUN PWMRUN = 1
다음으로 while 루프 에서 LED가 켜지고 계속 희미 해집니다.
while (1) { for (value = 0; value <1024; value + = 10) { set_PWM1 (value); Timer1_Delay10ms (3); } for (값 = 1023; 값> 0; 값-= 10) { set_PWM1 (값); Timer1_Delay10ms (2); } } }
듀티 사이클은 PWM1L 및 PWM1H 레지스터에서 듀티 사이클을 설정하는 함수 인 set_PWM1 ();에 의해 설정됩니다.
void set_PWM1 (unsigned int 값) { PWM1L = (값 & 0x00FF); PWM1H = ((값 & 0xFF00) >> 8); set_LOAD; }
코드 플래싱 및 출력 테스트
코드가 준비되면 컴파일하고 컨트롤러에 업로드하십시오. 환경을 처음 접하는 경우 Nuvoton N76E003 시작하기 자습서를 확인하여 기본 사항을 알아보십시오. 아래 결과에서 볼 수 있듯이 코드는 경고 0 개와 오류 0 개를 반환하고 Keil의 기본 깜박임 방법을 사용하여 깜박입니다. 응용 프로그램이 작동하기 시작합니다.
재 구축 시작: 프로젝트: PWM 재 구축 대상 'Target 1' 조립 STARTUP.A51… compiling main.c… compiling Delay.c… linking… 프로그램 크기: data = 35.1 xdata = 0 code = 709 creating ". \ Objects \ pwm"… ". \ Objects \ pwm"의 hex 파일 -오류 0 개, 경고 0 개. 빌드 시간 경과: 00:00:05
하드웨어가 전원에 연결되어 있고 예상대로 작동했습니다. 이는 온보드 LED의 밝기가 감소한 다음 증가하여 PWM 듀티 사이클의 변화를 나타냅니다.
이 튜토리얼의 전체 작업은 아래 링크 된 비디오에서도 찾을 수 있습니다. 튜토리얼을 즐겼기를 바라며 궁금한 점이 있으면 유용한 정보를 배웠기를 바랍니다. 댓글 섹션에 남겨 주시거나 다른 기술 질문에 대한 포럼을 사용할 수 있습니다.