아날로그 PIN에 비트 쓰기

Dec 02 2020

비트 피연산자를 배우기 시작했으며 여기에 내 질문이 있습니다. 이것을하기 위해:

pinMode (13, OUTPUT);    
digitalWrite (13, HIGH);

이렇게 할 수 있습니다.

DDRB |= B00100000;   //set PIN13 as OUTPUT
PORTB |= B00100000;  //set PIN13 HIGH

하지만 어떻게 할 수 있습니까?

analogWrite(9, 200);

DEC 번호를 BIN으로 변환하는 방법을 알고 있지만이 번호를 PWM PIN으로 보내는 방법은 무엇입니까? 웹에서 좋은 예를 찾을 수 없습니다 .. 감사합니다!

답변

3 chrisl Dec 02 2020 at 15:05

사용중인 Arduino를 지정하지 않았습니다. 원칙은이 하드웨어가있는 모든 AVR 마이크로 컨트롤러에서 작동하지만 여기서는 Atmega328p 기반 Arduino (Uno, Nano, Mini)를 가정하고 있습니다.

With analogWrite()는 핀에서 비트 단위로 데이터를 보내지 않습니다. 특정 주파수 및 특정 듀티 사이클로 해당 핀을 설정하기 위해 하드웨어 타이머를 구성합니다. 따라서 analogWrite()마이크로 컨트롤러 내부에서 완전히 다른 하드웨어를 활성화합니다.

Arduino 기능없이이 작업을 수행하려면 analogWrite()먼저 어떤 방법으로 이동할지 결정해야합니다.

  • 하드웨어 타이머를 통해 인터럽트를 생성 한 다음 ISR 내부의 소프트웨어로 원하는 핀을 설정할 수 있습니다 (핀을 자유롭게 선택할 수 있지만 신호에 약간의 지터가 발생 함).
  • 또는 하드웨어 타이머 자체가 핀을 토글하도록 할 수 있습니다.이 핀은 실행을위한 소프트웨어를 포함하지 않습니다 (즉, 해당 타이머와 관련된 2 개의 핀 중 하나만 사용할 수 있지만 훨씬 더 안정적인 신호를 얻을 수 있음을 의미합니다) )

이를 수행하는 방법에 대한 많은 자습서가 웹에 있습니다. "arduino timer register pwm"에 대한 검색은 예를 들어 Timer1 레지스터로 PWM을 얻는 방법과 주파수를 자유롭게 선택할 수있는 방법을 설명하는 이 결과와 같은 몇 가지 유망한 결과를 제공했습니다. (즉, 3 부작, 각 타이머에 대한 한 부분이다. 타이머 0 파트 1은 여기에 당신이 그대로 타이머 0을 유지 할 수 있습니다하지만, 그래서 같은 기능이 delay()millis()정상적으로 여전히 일). 이 사이트에는 이러한 질문이 많이 있습니다 (예 : this one) .

하드웨어와 관련된 또 다른 매우 중요한 소스는 해당 마이크로 컨트롤러의 데이터 시트입니다. Atmega328p 인 Uno, Nano 또는 Mini의 경우 데이터 시트는 여기 마이크로 칩 사이트 에서 찾을 수 있습니다 (또는 마이크로 컨트롤러 이름을 검색 할 때).