이전 기사에서는 STM32를 사용한 ADC 변환에 대해 살펴 보았습니다. 이 튜토리얼에서는 STM32의 PWM (Pulse Width Modulation)에 대해 배우고 PWM 기술을 사용하여 LED의 밝기 또는 DC 팬의 속도를 제어하는 방법을 배웁니다.
신호에는 아날로그와 디지털의 두 가지 유형이 있습니다. 아날로그 신호에는 (3V, 1V… 등)과 같은 전압이 있고 디지털 신호에는 (1 '및 0 's)가 있습니다. 센서 출력은 아날로그 신호이며 이러한 아날로그 신호는 ADC를 사용하여 디지털로 변환됩니다. 마이크로 컨트롤러는 디지털 만 이해하기 때문입니다. 이러한 ADC 값을 처리 한 후 다시 아날로그 장치를 구동하기 위해 출력을 아날로그 형식으로 변환해야합니다. 이를 위해 PWM, DAC (디지털-아날로그) 변환기 등과 같은 특정 방법을 사용합니다.
PWM (Pulse with Modulation)이란 무엇입니까?
PWM은 모터의 속도, LED 밝기 등의 디지털 값을 사용하여 아날로그 장치를 제어하는 방법입니다. 모터와 LED가 아날로그 신호에서 작동한다는 것을 알고 있습니다. 그러나 PWM은 순수한 아날로그 출력을 제공하지 않으며 PWM은 듀티 사이클에 의해 제공되는 짧은 펄스에 의해 생성되는 아날로그 신호처럼 보입니다.
PWM의 듀티 사이클
PWM 신호가 HIGH (on time)로 유지되는 시간의 비율을 듀티 사이클이라고합니다. 신호가 항상 ON이면 100 % 듀티 사이클이고 항상 꺼져 있으면 0 % 듀티 사이클입니다.
듀티 사이클 = Turn ON 시간 / (Turn ON 시간 + Turn OFF 시간)
STM32의 PWM
STM32F103C8에는 15 개의 PWM 핀과 10 개의 ADC 핀이 있습니다. 7 개의 타이머가 있으며 각 PWM 출력은 4 개의 타이머에 연결된 채널에서 제공됩니다. 16 비트 PWM 분해능 (2 16), 즉 카운터이며 변수는 65535까지 커질 수 있습니다. 72MHz 클럭 속도로 PWM 출력은 약 1 밀리 초의 최대주기를 가질 수 있습니다.
- 따라서 65535의 값은 LED의 전체 밝기와 DC 팬의 전체 속도 (100 % 듀티 사이클)를 제공합니다.
- 마찬가지로 32767의 값은 LED의 절반 밝기와 DC 팬의 절반 속도 (50 % 듀티 사이클)를 제공합니다.
- 13107의 값은 (20 %) BRIGHTNESS 및 (20 %) SPEED (20 % Duty Cycle)를 제공합니다.
이 튜토리얼에서는 PWM 기술로 LED의 밝기와 DC 팬의 속도를 변경하기 위해 전위차계와 STM32를 사용합니다. 16x2 LCD는 ADC 값 (0-4095)과 출력되는 수정 된 변수 (PWM 값) (0-65535)를 표시하는 데 사용됩니다.
다음은 다른 마이크로 컨트롤러를 사용한 몇 가지 PWM 예입니다.
- MPLAB 및 XC8과 함께 PIC 마이크로 컨트롤러를 사용하여 PWM 생성
- Raspberry Pi를 사용한 서보 모터 제어
- PWM을 사용하는 Arduino 기반 LED 조광기
- MSP430G2를 사용한 펄스 폭 변조 (PWM)
여기에서 모든 PWM 관련 프로젝트를 확인하십시오.
필요한 구성 요소
- STM32F103C8
- DC 팬
- ULN2003 모터 드라이버 IC
- LED (빨간색)
- LCD (16x2)
- 전위차계
- 브레드 보드
- 배터리 9V
- 점퍼 와이어
DC 팬: 여기에 사용 된 DC 팬은 구형 PC의 BLDC 팬입니다. 외부 전원이 필요하므로 9V DC 배터리를 사용합니다.
ULN2003 모터 드라이버 IC: 모터가 단방향이고 팬에 외부 전원이 필요하기 때문에 모터를 한 방향으로 구동하는 데 사용됩니다. 여기에서 ULN2003 기반 모터 드라이버 회로에 대해 자세히 알아보십시오. 아래는 ULN2003의 그림 다이어그램입니다.
핀 (IN1 ~ IN7)은 입력 핀이고 (OUT 1 ~ OUT 7)은 해당 출력 핀입니다. COM에는 출력 장치에 필요한 양의 소스 전압이 제공됩니다.
LED: RED 빛을 방출하는 RED 컬러 led가 사용됩니다. 모든 색상을 사용할 수 있습니다.
전위차계: 두 개의 전위차계가 사용되며 하나는 ADC에 대한 아날로그 입력을위한 전압 분배기이고 다른 하나는 LED의 밝기를 제어하기위한 것입니다.
STM32의 핀 세부 사항
PWM 핀이 웨이브 형식 (~)으로 표시되는 것을 볼 수 있듯이 15 개의 핀이 있고 ADC 핀은 녹색으로 표시되며 10 개의 ADC 핀이 아날로그 입력에 사용됩니다.
회로도 및 연결
STM32와 다양한 구성 요소의 연결은 다음과 같습니다.
아날로그 입력 (ADC)이있는 STM32
회로 왼쪽에있는 전위차계는 3.3V 핀의 전압을 조절하는 전압 조정기로 사용됩니다. 전위차계의 출력, 즉 전위차계의 중앙 핀은 STM32의 ADC 핀 (PA4)에 연결됩니다.
LED가있는 STM32
STM32 PWM 출력 핀 (PA9)은 직렬 저항과 커패시터를 통해 LED의 양극 핀에 연결됩니다.
저항기 및 커패시터가있는 LED
직렬로 연결된 저항과 병렬로 연결된 커패시터는 PWM 핀에서 직접 생성 될 때 아날로그 출력이 순수하지 않기 때문에 PWM 출력에서 정확한 아날로그 파형을 생성하기 위해 LED와 연결됩니다.
ULN2003이있는 STM32 및 팬이있는 ULN2003
STM32 PWM 출력 핀 (PA8)은 ULN2003 IC의 입력 핀 (IN1)에 연결되고 ULN2003의 해당 출력 핀 (OUT1)은 DC FAN의 음극선에 연결됩니다.
DC 팬의 양극 핀은 ULN2003 IC의 COM 핀에 연결되고 외부 배터리 (9V DC)도 ULN2003 IC의 동일한 COM 핀에 연결됩니다. ULN2003의 GND 핀은 STM32의 GND 핀에 연결되고 배터리 음극은 동일한 GND 핀에 연결됩니다.
STM32 (LCD 포함) (16x2)
LCD 핀 번호 |
LCD 핀 이름 |
STM32 핀 이름 |
1 |
접지 (Gnd) |
접지 (G) |
2 |
VCC |
5V |
삼 |
VEE |
전위차계 중심의 핀 |
4 |
등록 선택 (RS) |
PB11 |
5 |
읽기 / 쓰기 (RW) |
접지 (G) |
6 |
활성화 (EN) |
PB10 |
7 |
데이터 비트 0 (DB0) |
연결 없음 (NC) |
8 |
데이터 비트 1 (DB1) |
연결 없음 (NC) |
9 |
데이터 비트 2 (DB2) |
연결 없음 (NC) |
10 |
데이터 비트 3 (DB3) |
연결 없음 (NC) |
11 |
데이터 비트 4 (DB4) |
PB0 |
12 |
데이터 비트 5 (DB5) |
PB1 |
13 |
데이터 비트 6 (DB6) |
PC13 |
14 |
데이터 비트 7 (DB7) |
PC14 |
15 |
LED 긍정적 |
5V |
16 |
LED 네거티브 |
접지 (G) |
오른쪽의 전위차계는 LCD 디스플레이의 대비를 제어하는 데 사용됩니다. 위의 표는 LCD와 STM32의 연결을 보여줍니다.
STM32 프로그래밍
이전 튜토리얼과 마찬가지로 FTDI 프로그래머를 사용하지 않고 USB 포트를 통해 Arduino IDE로 STM32F103C8을 프로그래밍했습니다. Arduino IDE로 STM32 프로그래밍에 대해 배우려면 링크를 따르십시오. Arduino 에서처럼 프로그래밍을 진행할 수 있습니다. 마지막에 완전한 코드 가 제공됩니다.
이 코딩에서는 왼쪽 전위차계의 중앙 핀에 연결된 ADC 핀 (PA4)에서 입력 아날로그 값을 가져와 아날로그 값 (0-3.3V)을 디지털 또는 정수 형식 (0-4095)으로 변환합니다. 이 디지털 값은 PWM 출력으로 추가로 제공되어 LED 밝기와 DC 팬의 속도를 제어합니다. 16x2 LCD는 ADC 및 매핑 된 값 (PWM 출력 값)을 표시하는 데 사용됩니다.
먼저 LCD 헤더 파일을 포함하고 LCD 핀을 선언하고 아래 코드를 사용하여 초기화해야합니다. 여기에서 STM32와 LCD 인터페이스에 대해 자세히 알아보십시오.
#포함
다음으로 STM32의 핀을 사용하여 핀 이름을 선언하고 정의합니다.
const int analoginput = PA4; // 전위차계로부터의 입력 const int led = PA9; // LED 출력 const int fan = PA8; // 팬 출력
이제 setup () 내부에서 일부 메시지를 표시하고 몇 초 후에 지우고 INPUT 핀 및 PWM 출력 핀을 지정해야합니다.
lcd.begin (16,2); // LCD 준비 중 lcd.clear (); // LCD lcd를 지 웁니다 .setCursor (0,0); // 커서를 row0 및 column0에 설정 lcd.print ("CIRCUIT DIGEST"); // 회로 다이제스트를 표시합니다. lcd.setCursor (0,1); // 열 0 및 행 1에 커서 설정 lcd.print ("PWM USING STM32"); // STM32를 사용하여 PWM 표시 delay (2000); // 지연 시간 lcd.clear (); // LCD pinMode (analoginput, INPUT); // 핀 모드 아날로그 입력을 INPUT으로 설정 pinMode (led, PWM); // PWM 출력으로 led 핀 모드 설정 pinMode (fan, PWM); // 핀 모드 팬을 PWM 출력으로 설정
Analog 입력 핀 (PA4)은 pinMode (analoginput, INPUT)에 의해 INPUT으로 설정되고 , LED 핀은 pinMode (led, PWM)에 의해 PWM 출력으로 설정되고, 팬 핀은 pinMode (fan, PWM)에 의해 PWM 출력으로 설정됩니다. 여기서 PWM 출력 핀은 LED (PA9) 및 팬 (PA8)에 연결됩니다.
다음으로 void loop () 함수에서 ADC 핀 (PA4)에서 아날로그 신호를 읽고 아래 코드를 사용하여 아날로그 전압을 디지털 정수 값 (0-4095)으로 변환하는 정수 변수에 저장합니다. int valueadc = analogRead (analoginput);
여기서 주목해야 할 중요한 것은 STM32의 채널 인 PWM 핀은 16 비트 해상도 (0-65535)를 가지고 있으므로 아래와 같은 맵 기능을 사용하여 아날로그 값으로 매핑해야합니다.
int 결과 = map (valueadc, 0, 4095, 0, 65535).
매핑을 사용하지 않으면 전위차계를 변경하여 팬의 전체 속도 또는 LED의 전체 밝기를 얻지 못합니다.
그런 다음 pwmWrite (led, result) 를 사용하여 PWM 출력을 LED에 쓰고 pwmWrite (fan, result ) 함수 를 사용하여 팬에 PWM 출력을 씁니다 .
마지막으로 다음 명령어를 사용하여 아날로그 입력 값 (ADC 값)과 출력 값 (PWM 값)을 LCD 디스플레이에 표시합니다.
lcd.setCursor (0,0); // 커서를 row0 및 column0에 설정 lcd.print ("ADC value ="); // "" 라는 단어를 인쇄합니다. lcd.print (valueadc); // 값 표시 adc lcd.setCursor (0,1); // 열 0과 행 1에 커서 설정 lcd.print ("Output ="); // ""에있는 단어를 인쇄합니다 . lcd.print (result); // 값 결과 표시
데모 비디오와 함께 완전한 코드가 아래에 제공됩니다.