훈련 과정. 펄스 폭 변조(PWM, PWM). LED 밝기 조절. 아날로그 신호 생성. 회로도 비디오 카드 드라이버를 사용하여 화면 조명 매개변수 변경

그리고 다시 우리는 광 센서를 집어들 것입니다 BH1750. 이번에는 조명 수준에 대한 데이터를 수집하는 것뿐만 아니라 이 데이터를 기반으로 모든 조명 장치의 밝기를 조정할 것을 제안합니다. 태블릿이나 스마트폰의 디스플레이 밝기를 조정하는 것과 유사합니다. 주변 조명이 밝을수록 조명의 밝기가 덜 필요하며, 반대로 주변 조명이 어두울수록 LED, 전구 또는 기타 모든 것이 더 밝아집니다. 예, 이 모든 것은 포토다이오드나 포토레지스터를 기반으로 구성될 수 있지만 이러한 장치는 구성, 교정 등이 필요합니다. BH1750 디지털 광 센서를 사용하는 경우 모든 것이 이미 교정되었으므로 기성 데이터가 I2C 버스를 통해 전송되므로 이러한 작업을 수행할 필요가 없으며 조건과만 비교하면 됩니다. . 간단히 말해서 전원을 켜자 불필요한 움직임없이 모든 것이 즉시 작동하기 시작했습니다. 아이디어에 관심이 있다면 계속 진행하세요.

우리는 다음 구성표에 따라 장치를 구축할 것입니다.

이 계획은 다양한 사용 사례에 맞게 현대화할 수 있고 현대화해야 하기 때문에 아이디어의 싹으로 판명되었지만 이에 대해서는 나중에 자세히 설명합니다.

여기의 모든 것은 이미 우리에게 친숙합니다. Atmega8a는 가장 다양하고 널리 사용되는 마이크로 컨트롤러로 마이크로 컨트롤러로 사용됩니다. 모든 패키지에서 마이크로 컨트롤러를 사용할 수 있습니다. 케이스의 핀 순서를 제외하고는 차이가 없습니다. 디스플레이는 HD44780 기반의 LCD 화면에서 수행됩니다. 내 경우에는 각각 20자씩 4줄의 화면을 사용하지만 크기 1602를 사용할 수도 있습니다. 화면에 표시되는 정보가 많지 않으므로 모든 것이 맞습니다. 디스플레이의 문자 대비를 조정하려면 가변 저항 R2가 필요합니다. 이 저항기의 슬라이더를 회전시키면 화면에서 가장 명확한 판독값을 얻을 수 있습니다. LCD 디스플레이의 백라이트는 디스플레이 보드의 핀 "A"와 "K"를 통해 구성됩니다. 백라이트는 전류 제한 저항 R1을 통해 켜집니다. 값이 높을수록 디스플레이 백라이트가 어두워집니다. 그러나 백라이트 손상을 방지하려면 이 저항을 무시해서는 안 됩니다. 디스플레이 자체는 4비트 회로를 사용하여 마이크로컨트롤러에 연결됩니다. PC6 핀에 무작위 노이즈가 발생할 경우 마이크로컨트롤러가 자발적으로 다시 시작되는 것을 방지하려면 저항 R3이 필요합니다. 저항 R3은 이 핀에 전력 플러스를 끌어와 핀 전체에 전위를 안정적으로 생성합니다. 저항 R4는 I2C 인터페이스용 마이크로 회로의 주소를 담당하는 센서 다리를 접지로 당깁니다. 기사 끝에 있는 소스 코드에서 이 모든 숫자를 볼 수 있습니다. I2C 인터페이스의 올바른 작동을 위해서는 저항 R7 및 R8이 필요합니다. 그들의 도움으로 논리 장치는 전원 공급 장치의 양극으로 당겨지기 때문에 라인에 형성됩니다. 논리 0을 생성할 때 라인은 마스터 또는 슬레이브(마이크로컨트롤러 또는 센서)에 의해 접지됩니다.

회로의 주 전원 공급 장치는 3.3V이며 이는 BH1750 광 센서의 전기적 매개변수에 의해 결정됩니다. 5V는 디스플레이에 전원을 공급하는 데에만 필요합니다. 예를 들어 전원 공급을 위해 3.3V가 필요한 Nokia 5110의 화면을 사용하는 경우 회로에서 5V 전압 조정기를 생략할 수 있습니다. 5V 및 3.3V용 전압 안정기는 유사한 전압에 대해 절대적으로 사용할 수 있으며 선형 및 펄스 안정기를 모두 사용할 수 있습니다.

이제 회로의 현대화에 관해. 기본은 항상 센서 자체와 마이크로 컨트롤러, 전원 회로입니다. 이 기능을 갖춘 LCD 디스플레이는 디버깅에만 필요합니다. 자율적으로 사용할 경우 회로에서 제외될 수 있습니다. 이것이 첫 번째입니다. 두 번째는 회로의 출력, 즉 HL1 LED입니다. 하나의 LED는 넓은 공간을 비출 수 없으며 강력한 LED, 백열등 또는 기타 더 큰 것을 사용해야합니다. 따라서 전류 및 전압 소비가 상대적으로 높은 조명 장치는 마이크로 컨트롤러에 쉽게 연결할 수 없습니다. 그렇지 않으면 단순히 마이크로 컨트롤러를 태울 것입니다. 이렇게 하려면 드라이버나 다른 회로를 사용해야 합니다. 백열 전구가 교류 전압을 사용하는 경우 광시미스터 커플러와 강력한 트라이악을 사용하여 전구의 밝기를 제어해야 합니다(광시미스터를 제어하려면 펌웨어를 조정하기만 하면 됩니다). LED 램프의 경우 전계 효과 트랜지스터의 게이트에 PWM을 적용하고 이를 통해 LED를 켜거나(전류 제한 또는 안정화를 잊지 않고) 제어된 드라이버를 사용할 수 있습니다. 일반적으로 많은 옵션이 있습니다. 각 경우마다 하나가 있습니다. 제시된 회로는 기본 기능이 포함된 원본 회로입니다. 아이디어는 다음과 같습니다.

다음 회로는 BH1750 모듈과 함께 디버그 보드에서 조립 및 디버깅되었습니다.

작동 논리는 복잡하지 않습니다. 센서에서 조도 값을 읽고 이 값을 PWM 신호로 변환합니다. PWM 신호와 조명 수준의 비율을 선택하기만 하면 됩니다.

작업을 디버깅하기 위해 포켓 손전등을 사용하여 조명을 변경했습니다.

또한, 광원이 갑자기 나타나면(우발적일 수 있음) LED가 갑자기 켜지는데 이는 그다지 불편하지 않으므로 부드러운 PWM 레벨 제어가 구현됩니다. 즉, 예를 들어 조명이 낮았습니다. LED가 켜져 있었고 짧은 빛의 펄스가 실수로 센서에 부딪혔습니다. 예를 들어 자동차 헤드라이트에서 LED가 갑자기 꺼졌다가 갑자기 다시 켜졌을 것입니다. 원활한 규제를 위해 즉, 조도가 급격하게 변해도 PWM은 급격하게 변화하지 않고 계산된 값에 도달하는 경향이 있으며 약간의 지연을 거쳐 한 단위씩 증가하거나 감소합니다. 그리고 필요한 값에 도달할 때까지 여러 번 증가 또는 감소가 발생합니다. C 언어의 소스 코드는 기사 마지막 부분에서 볼 수 있습니다.

또한 이 버전에서 마이크로컨트롤러를 프로그래밍하려면 퓨즈 비트의 구성을 알아야 합니다.

이 기사에는 제시된 다이어그램에 따른 마이크로 컨트롤러용 펌웨어, AVR Studio 프로그램의 소스 코드 및 데모 비디오(손전등으로 조정되는 조명 수준에 따라 LED 밝기가 부드럽게 변경됨)가 함께 제공됩니다.

방사성 원소 목록

지정 유형 명칭 수량 메모가게내 메모장
IC1 MK AVR 8비트

ATmega8A

1 메모장으로
IC2 광 센서BH1750FVI-E1 메모장으로
VR1 선형 레귤레이터

L7805AB

1 메모장으로
VR2 선형 레귤레이터

AMS1117-3.3

1 메모장으로
C1, C3, C5, C7 콘덴서100nF4 메모장으로
C2 470μF1 메모장으로
C4 전해콘덴서220μF1 메모장으로
C6 전해콘덴서10μF1 메모장으로
R1 저항기

22옴

1 메모장으로
R2 트리머 저항기10k옴1 메모장으로
R3 저항기

10k옴

1 메모장으로
R4, R7, R8 저항기

4.7k옴

3 메모장으로
R5 저항기

Nextion 디스플레이: http://ali.pub/1xz0e2

나는 이것을 샀다: http://ali.ski/zF01b

먼저 Nextion 디스플레이에서 데이터를 수신하기 위한 블록을 추가해 보겠습니다. 그것은이라고 Nextion Get Attr.

이 블록은 FLProg 프로그램에 있습니다: Nextion HMI 패널 -> 요소 -> 매개변수 가져오기

이 블록의 구성은 다음과 같습니다.

이 블록을 구성하려면 데이터를 수신할 패널을 선택하거나 새 패널을 생성해야 합니다. 그리고 이 패널이 Arduino에 연결되는 방식을 선택하세요.

자, Slider 요소를 생성하고 Nextion 패널에서 해당 요소에 이름과 ID를 할당해 보겠습니다.

매개변수에서 (val)을 선택하고 매초마다 폴링 주기를 선택합니다.

이로써 파라미터 수신 블록 설정이 완료되었습니다.

이 블록의 구성은 다음과 같습니다.

이 블록에서 가장 중요한 것은 이전에 생성된 Nextion 패널을 선택하고 상수를 입력으로 바꾸는 것입니다.

그런 다음 블록을 추가해야 합니다. 번호 변경위치한 기본 요소 -> 숫자 변경 감지기

그리고 다음 구성표에 따라 모두 연결하십시오.

그런 다음 모든 것을 Arduino에 로드하고 디스플레이 밝기를 변경해 보세요.

비디오에서 더 명확하게:

저는 현재 TFT 디스플레이를 사용하는 Arduino 프로젝트를 진행하고 있습니다. 최근에는 겉보기에 단순해 보이는 기능, 즉 밝기 조절 기능을 추가하고 싶었습니다. TFT 디스플레이(UTFT 라이브러리) 작업을 위한 라이브러리 문서에서 필요한 방법을 찾았습니다. setBrightness(br);

우리는 무엇이 필요한가?

  • 기본적으로 ATmega2560 프로세서 기반의 Frearduino ADK v.2.2를 사용했습니다.
  • TFT LCD 메가 쉴드 v.2.2
  • 디스플레이 자체는 7" TFT LCD SSD1963()입니다.
  • UTFT 라이브러리 - TFT 디스플레이 작업을 위한 범용 라이브러리(라이브러리 자체와 문서를 찾을 수 있음)
  • 납땜 인두

하드웨어를 다루자

디스플레이 회로를 열면 mp3032 변환기에 LED-A, PWM, 5V의 세 가지 입력이 있음을 알 수 있습니다. 처음에는 PWM이 비활성화되어 있습니다. 이 입력은 전혀 사용되지 않습니다. 백라이트는 LED-A에 의해 제어됩니다.


디스플레이 뒷면을 보면 "백라이트 제어"라고 표시된 영역을 찾을 수 있습니다. 이곳에서 바로 이러한 입구를 찾을 수 있습니다. PWM 방법을 사용하여 백라이트를 제어하려면 모든 것이 반대인지 확인해야 합니다. LED-A는 비활성화되고 PWM은 활성화됩니다. 이렇게 하려면 점퍼를 다시 납땜해야 합니다. 다음은 그것이 어떻게 생겼는지에 대한 사진입니다:

소프트웨어 부분

우리 라이브러리는 필요한 것을 제공할 수 없기 때문에 필요한 함수를 직접 작성하겠습니다. 이렇게 하려면 디스플레이를 제어하는 ​​컨트롤러(SSD1963)에 대한 설명서를 엽니다. SSD1963은 문서에 설명된 특수 출력을 통해 Arduino에서 전송되는 특수 명령을 사용하여 제어됩니다.

제어는 다음과 같이 수행됩니다. Arduino는 RS(표의 D/C)를 통해 출력합니다. 명령을 전송하려면 0, 데이터를 전송하려면 1입니다. 명령을 전송한 후 RS는 1로 전환되고 필요한 매개변수가 전송됩니다. 모든 명령과 매개변수는 출력 D0-D7을 통해 전송됩니다. ATmega2560이 있는 경우 이러한 출력 8개 모두 포트 C에 결합됩니다.

그럼 먼저 버스를 통해 데이터를 전송하는 함수를 작성해 보겠습니다. 사용 편의성을 위해 UTFT.h에 직접 작성하겠습니다.

Void Lcd_Writ_Bus(uint8_t bla) ( digitalWrite(WR,LOW); //digitalWrite(CS, LOW)를 읽도록 SSD1963 구성; PORTC = bla; //1바이트 형식으로 버스에 데이터 전송 digitalWrite(CS,HIGH) ; 디지털쓰기(WR,HIGH);

라이브러리에 이미 동일한 이름을 가진 함수가 포함되어 있을 수 있으므로 메서드 이름에 주의를 기울일 가치가 있습니다.
명령과 데이터를 출력하는 두 가지 기능을 추가해 보겠습니다.

Void Lcd_Write_Com(uint8_t data) ( digitalWrite(RS,LOW); //RS를 명령 읽기 모드로 전환합니다. 즉, 0 Lcd_Writ_Bus(data); ) void Lcd_Write_Data(uint8_t data) ( digitalWrite(RS,HIGH); //전환 RS에서 데이터 읽기 모드로, 즉 1 Lcd_Writ_Bus(data)

이제 백라이트 설정 자체입니다. 이 모든 작업을 수행하는 방법을 알아 보려면 설명서를 열고 PWM 구성 명령을 찾으십시오.

메모:
PWM은 동적 밝기 제어 시스템인 DBC를 사용하여 제어할 수 있지만 단순화를 위해 사용하지 않았습니다. 원하는 경우 동일한 문서에서 필요한 정보를 찾을 수 있습니다.

따라서 우리에게 필요한 것은 다음과 같습니다.

즉, 먼저 "0xBE" 명령을 전송해야 하며, 그 다음 3개의 매개변수로 신호 주파수, 작동 주기 기간 및 DBC 활성화 여부를 결정하는 세 번째 매개변수(0x01 - 비활성화됨)를 전송해야 합니다. , 0x09 - 활성화됨) .

밝기 자체를 조정하려면 작동 주기의 빈도만 변경하면 됩니다. 데이터를 1바이트로 전송하기 때문에 루프 값은 0부터 255까지 가능합니다. 저는 9개의 밝기 레벨(0부터 8까지)을 정의하기로 결정했습니다. 따라서 256개 값을 모두 9단계로 나누어야 한다. 그러나 단계가 동일하면 밝기가 원하는만큼 원활하게 변하지 않는다는 사실에 주목할 가치가 있습니다. 즉, 이미 예를 들어 4단계에서는 밝기가 거의 최대가 되고, 4~8단계에서는 거의 눈에 띄지 않게 밝기가 변경됩니다. 이를 고려하여 분모가 2인 기하학적 수열을 사용하기로 결정했습니다. 즉, 밝기는 다음 공식을 사용하여 계산됩니다: (2^lvl) - 1, 여기서 lvl은 0에서 8까지의 밝기 수준입니다. 값은 0부터 시작하므로 1을 빼야 합니다. 물론 단계와 값을 직접 선택할 수 있지만 저는 아주 간단한 예를 들었습니다. 이제 코드 자체는 다음과 같습니다.

무효 setBright(byte lvl) ( 바이트 밝기(1); for (byte i(1); i<= lvl; i++) //Возведение в степень brightness *= 2; Lcd_Write_Com(0xBE); //Вывод команды Lcd_Write_Data(0x01); //Ставим частоту 760Гц Lcd_Write_Data(brightness-1); //Выводим длину рабочего цикла Lcd_Write_Data(0x01); //Отключаем DBC }

이제 UTFT.setBright(byte lvl)을 사용할 수 있습니다.


Apple은 iPhone X에 처음으로 OLED 기술을 기반으로 한 디스플레이 패널을 사용했습니다. 그리고 OLED 디스플레이의 장점은 분명하지만 단점은 거의 언급되지 않습니다. 이러한 단점 중 하나는 낮은 밝기 수준에서 LED의 빛을 제어하기 위해 펄스 폭 변조를 사용하기 때문에 낮은 밝기 수준에서 화면이 깜박이는 것입니다. 일반 사용자의 언어로는 어둠 속에서 화면이 깜박입니다.

제조업체는 대부분의 사용자가 눈치채지 못하는 방식으로 화면 깜박임 빈도를 선택합니다. 가장 일반적으로 사용되는 주파수는 240Hz입니다. 이러한 깜박임을 인지하는 상당수의 사람들을 제외하더라도 깜박임을 인지하지 못하지만 피로, 눈물, 눈의 염증 및 충혈, 심지어 편두통까지 경험하는 사람들이 남아 있습니다. 그러한 사람들은 그다지 적지 않습니다. 사용된 연구와 방법론에 따라 그 수는 전체 사용자의 20~30%에 이릅니다.

Android 기기에서는 디밍 필터를 표시하는 앱을 설치하여 OLED 깜박임을 해결할 수 있는 경우가 많습니다. 이를 위해 Lux Dash 애플리케이션을 사용하면 자동 밝기 제어를 유지할 수도 있습니다(다음 기사 중 하나에서 화면 깜박임을 끄도록 올바르게 구성하는 방법에 대해 설명하겠습니다).

밝혀진 바와 같이, iOS에는 유사한 효과를 달성하고 어둠 속에서 디스플레이 깜박임을 완전히 제거할 수 있는 메커니즘이 내장되어 있습니다. 이에 필요한 단계를 살펴보겠습니다. 먼저 OLED 디스플레이에 깜박임이 필요한 이유에 대한 질문에 답하겠습니다.

OLED가 깜박이는 이유: PWM 밝기 제어

OLED 화면의 깜박임은 해당 패널의 밝기를 제어하는 ​​데 사용되는 메커니즘의 직접적인 결과입니다. 화면(IPS 매트릭스를 기반으로 하는 기존 LCD와 OLED 모두)의 밝기를 변경하려면 백라이트 LED(또는 OLED의 경우 개별 LED)에 공급되는 전압을 줄이거나 소위 펄스 폭 변조.

펄스 폭 변조는 LED를 켜고 끄는 방식으로 이미지의 밝기를 제어합니다. 백라이트가 켜지는 기간이 짧을수록, 켜기 사이의 휴지 시간이 길어질수록 사람의 눈이 인지하는 밝기는 낮아집니다. 다음과 같이 보입니다.

피로와 편두통을 증가시키는 것은 색상의 유해한 파란색 성분이나 OLED의 과포화 색상이 아니라 깜박임입니다. 깜박임은 동공이 최대로 확장되고 밝은 섬광이 말 그대로 망막을 덮칠 때 어둠 속에서 눈에 가장 큰 부담을 줍니다.

깜박임 없는 OLED: 신화인가 현실인가?

깜박임 없이 OLED 화면을 조립할 수 있나요? 예, 가능하지만 실제로는 거의 사용되지 않습니다. 이러한 화면의 몇 가지 예 중 하나는 LG G Flex 2 스마트폰에 설치된 P-OLED 매트릭스입니다. 이러한 화면의 단점은 최소 밝기에서 나타나는 다음과 같은 효과였습니다.

LG가 경쟁사보다 매트릭스를 훨씬 더 나쁘게 만들었다고 믿는 것은 실수입니다. 당시 삼성 매트릭스는 품질이 비슷했지만 한 가지 큰 차이점이 있었습니다. 삼성이 모든 주력 제품에 설치하는 OLED 패널은 모든 밝기 수준, 심지어 100%에서도 깜박입니다. 깜박이는 매트릭스의 이미지가 깜박임이 없는 OLED보다 훨씬 더 깨끗하게 보이는 이유는 무엇입니까?

이 효과는 인접한 LED 사이의 매개변수 확산과 관련됩니다. 산란은 모든 제조업체의 매트릭스에 존재하지만 LED에 낮은 전압이 적용될 때 더 많이 나타납니다. 이 효과는 어두운 조건에서 짧은 셔터 속도로 사진을 촬영할 때 디지털 노이즈와 다소 유사합니다. 더 적은 수의 광자가 매트릭스의 감광 요소에 닿고, OLED 다이오드에서 방출되는 더 적은 수의 광자가 많을수록 "역방향 디지털 노이즈"라는 오류가 발생할 가능성이 더 커집니다.

삼성은 LED에 항상 최대 전압을 공급하고, 펄스의 듀티 사이클을 이용해 밝기를 조절해 문제를 해결했다. 그러나 화면이 계속 깜박이는 것이 모든 사람의 취향에 맞는 것은 아니며 많은 제조업체가 하이브리드 접근 방식을 선택했습니다. 특정 값까지는 LED의 전압을 줄여 밝기를 조정합니다. 지정된 최소 레벨(보통 15-50%)을 넘은 후에는 PWM을 사용하여 밝기를 더욱 감소시킵니다.

iPhone X에 대해 구체적으로 말하면 밝기는 다음과 같이 조정됩니다 (iXBT에 따라).

50% 수준까지는 깜박임이 없습니다. 240Hz의 주파수에서 깜박임으로써 밝기를 더욱 감소시킵니다. 이는 Notebookcheck.net 사이트의 독일 리뷰어들에 의해 설득력 있게 시연되었습니다.

화면 깜박임을 확인하는 방법

휴대폰 화면이 깜박이나요? 눈에 깜박임이 없더라도 특별한 장비 없이 집에서 쉽게 유무를 확인할 수 있습니다. 스마트폰에서 배경이 흰색인 페이지를 열고(예: Safari 또는 Chrome 브라우저의 about:blank) 휴대전화를 어두운 방에 놓고 밝기를 최소로 낮추고 다른 스마트폰의 카메라를 해당 위치로 향하게 하면 충분합니다. 화면. 아래 비디오에 표시된 것과 비슷한 것이 나타나면 화면 깜박임이 있는 것입니다.

화면 깜박임이 멈추는 밝기 수준을 확인하려면 제어 센터를 열고 밝기 슬라이더를 부드럽게 움직입니다. 대각선 줄무늬가 사라진다는 것은 특정 밝기 수준에서 PWM이 없음을 의미합니다.

iPhone X의 깜박임 없는 최소 밝기 수준은 50%인 것으로 실험적으로 확인되었습니다. 하지만 밝기를 이 수준으로 유지하면 어두운 환경에서는 장치를 사용하기가 불편할 것입니다. 목표는 화면의 유효 밝기 수준을 낮추되 깜박임을 방지하는 것입니다.

결과적으로 이것은 가능합니다. 이를 위해 iOS 설정에 특수 모드가 있는데, 접근성 > 숙박 시설 표시 설정에서 찾을 수 있습니다.

이 모드에서는 소프트웨어 필터에 의해 화면이 어두워집니다. 이 모드를 활성화하려면 Display Accomodations로 이동하여 슬라이더를 활성화해야 합니다. 이제 Display Accomodations 비문을 클릭하고 화이트 포인트 감소 슬라이더를 활성화해야 합니다(스크린샷 참조). 85~100% 사이의 값으로 시작하여 눈에 편안한 수준으로 조정해 보세요. (제어 센터의 화면 밝기는 50%여야 합니다.)

세 번의 클릭으로 PWM 비활성화

그래서 우리는 낮은 밝기 수준에서 화면 깜박임을 끄는 소프트웨어 필터를 활성화할 수 있었습니다. 그러나 필터가 항상 켜진 상태에서 전화기를 사용하는 것은 불편합니다. 밝은 빛에서는 화면이 항상 어두워집니다.

iPhone X에서는 측면 버튼을 세 번 눌러 필터를 켜고 끌 수 있습니다. 이전 세대 장치에서는 전화기를 켜고 끄는 기능을 수행했습니다. 이렇게 하려면 설정에서 접근성 바로가기 옵션을 찾아 화이트 포인트 감소 기능을 활성화 또는 비활성화하도록 지정해야 합니다(스크린샷 참조).

그게 다야. 이 기능을 활성화한 후 우리는 측면 버튼을 세 번 눌러 화면 깜박임을 빠르게 켜고 끌 수 있는 iPhone X를 얻었습니다. 이제 어둠 속에서도 피로감 없이 기기를 사용할 수 있으며, 측면 버튼을 세 번 누르면 다크 필터를 빠르게 끌 수 있습니다.

추가 정보

다이어그램에 대한 설명

R2는 공칭 값이 10K인 가변 저항입니다. 저항의 중앙 단자는 저역 통과 필터를 통해 ADC의 제로 채널에 연결됩니다. 저항기의 전압은 디지털 코드로 변환되어 타이머 T0의 비교 레지스터에 기록됩니다. 따라서 저항을 사용하여 PWM 신호의 듀티 사이클을 조정합니다.

Led1은 강력한 백색 LED입니다. 그 양단의 전압 강하는 약 4V입니다. 최대 LED 전류는 저항 R5에 의해 설정되며 100mA와 같습니다.

(Upit – Uled)/R5 = (5 - 4)/10 = 100mA

IRLU024N – N채널 전계 효과 트랜지스터. 대신 IRL 시리즈의 전계 효과 트랜지스터를 사용할 수 있습니다(L - 이는 논리 레벨에 의해 제어됨을 의미함).

R3은 만약을 대비해 전류 제한 저항입니다. R4 – 풀다운 저항. 전계 효과 트랜지스터의 게이트는 "공중에 매달려" 있을 수 없습니다.

프로그램

//************************************************************
// 훈련 과정. C로 AVR 마이크로컨트롤러 프로그래밍
// 다음을 사용하여 로드를 제어합니다.
// 펄스 폭 변조(PWM, PWM)

#포함하다
#포함하다

정수기본( 무효의)
{
//포트 초기화
포트 B = 0;
DDRB = 0xff;

//타이머 T0 초기화
팀스크 = 0;
//dir. - 빠른 PWM, 출력 OC0 - 비반전. 심, clk/64
TCCR0 = (1<TCNT0 = 0;
OCR0 = 0;

//ADC 초기화
//이온 - 공급 전압, 왼쪽 정렬, 채널 제로

ADDMUX = (0<//에 ADC, 디렉토리. 마디 없는 변환., 해상도 인터럽트, 변환기 주파수 = FCPU/128
ADCSRA = (1<//연속 변환 모드
SFIOR = 0;

__enable_interrupt ();
~하는 동안 (1);
반품 0;
}

//********************************
//ADC 인터럽트
#pragma 벡터=ADC_vect
__방해하다무효의 adc_my( 무효의)
{

//ADC의 상위 레지스터를 읽고

//비교 레지스터에 쓰기

코드에 대한 설명

작동 논리

주변 장치 초기화 - 타이머 T0, ADC 모듈. 인터럽트를 활성화합니다. 끝없는 순환. ADC 인터럽트에서는 가변 저항에서 읽은 전압이 비교 레지스터 OCR0에 기록됩니다. AVR 마이크로 컨트롤러에서는 이 레지스터를 위해 버퍼가 구성되어 있으며 실제로 쓰기가 먼저 발생합니다. 버퍼에서 값은 TCNT0 카운터 레지스터가 오버플로될 때만 OCR0에 다시 쓰여집니다. while 루프 및 ADC 모듈과 병렬로 타이머 T0이 실행되어 핀 OC0(PB2)에서 PWM 신호를 생성합니다. 카운트 레지스터 TCNT0이 오버플로되면 OC0은 1로 설정되고, 카운트 레지스터의 값이 비교 레지스터 OCR0과 일치하면 출력은 0으로 설정됩니다.

타이머 초기화

타이머 인터럽트는 사용되지 않으므로 TIMSK 레지스터 = 0입니다.

구성 레지스터 TCCR0은 T0 타이머 설정을 담당합니다.

비트 WGM01, WHM00은 작동 모드를 결정합니다. 11 - 고속 PWM 모드.

비트 CS02, CS01, CS00 - 타이머 프리스케일러 계수를 설정합니다. 011 - 프리스케일러 64에 해당합니다. 타이머/카운터 클럭 주파수는 Fcpu/64입니다.

COM01, COM00 비트는 OC0 핀의 동작을 결정합니다. 10 - 반전되지 않은 PWM 신호에 해당합니다. 1 - TCNT0이 오버플로될 때, 0 - TCNT0이 OCR0과 일치할 때.

ADC 초기화

예 2. PWM을 사용하여 사인파 생성

다이어그램 설명

회로에서 저항 R2를 제거하는 것을 잊어버렸습니다. R3 및 C8 통합자.

프로그램

//************************************************************

// 다음을 사용하여 사인을 생성합니다.

// 펄스 폭 변조(PWM, PWM)

//************************************************************

#포함하다
#포함하다
#include "TableSin.h"

정수기본( 무효의 )
{
//포트 초기화
포트 B = 0;
DDRB = 0xff;

//타이머 T0 초기화
팀스크 = (1<//dir. - 빠른 PWM, 출력 OC0 - 비반전. 심, 프리스케일러 - 8개
TCCR0 = (1<//카운팅 레지스터와 비교 레지스터를 재설정합니다.
TCNT0 = 0;
OCR0 = 0;

__enable_interrupt ();
~하는 동안 (1);
반품 0;
}

//**********************************************************

//인터럽트 타이머/카운터 T0

#pragma 벡터 = TIMER0_COMP_vect

__방해하다무효의 Timer0CompVect( 무효의)



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: