analogRead 값 변환을 오해하면(1023, 1024 문제)

3806 단어 Arduino
analogRead의 최대치는 1023인데 때로는 1024로 나눈다!?
네.
그게 AnalogWrite 때였어요.
그렇다면 아날로그 입력 전압을 통해 LED의 밝기를 바꾸는 초도를 작성해 주십시오.
dame.ino
int lv = 0;

void setup() {
  pinMode(11, OUTPUT);
}

void loop() {
  lv = analogRead(A0);
  analogWrite(11, lv * 255 / 1023);
}
그런 스케치 쓴 너.안 돼!
어디가 안 좋아요?* 255 / 1023곳은 안 좋아요.
"아, Analo Read는 10비트, 최대는 1023, Analowrite는 8비트, 최대는 255비트니까. 뭐가 잘못됐나요?"나는 대부분의 사람들이 이렇다고 생각한다.나도 처음엔 그랬어.
이렇게 생각하는 사람들은 이 1023이나 255가 연속치라고 생각한다.이미 계량화되었는데 연속치도 고려할 수 있습니까?아니오, 안 좋아요.
간략하게 고려하다
단도직입적으로 1023, 255 같은 큰 숫자여서 상상하기 어렵다.4비트에서 2비트로의 변환(최대치 15에서 최대치 3으로의 변환)을 고려해 보자.
아래의 그림을 보십시오(손으로 쓴 그림이 되면 최선을 다해 그림을 업데이트할 수 없으니 따뜻하게 지켜봐 주십시오).

그렇게 복잡한 그림은 아니야.0-5V 구간을 2bit, 4bit로 계량화할 때의 대응을 나타낸다.
이거 보고 뭐 발견한 사람 없나요?
...흥?그렇구나.
네!2비트 측과 4비트 측의 상위 2비트 일치!예를 들면 2비트 10의 곳.4비트의 1011, 1010, 1001, 1000, 상위 2비트는 10이다.
그럼 2비트와 4비트의 자리를 맞추자.2비트의 머리에 00을 더해 자리를 맞추다.예를 들면 10이면 0010이다.
이렇게 된 느낌.

또 눈치채신 분 계신가요?
네, 4비트에서 2비트까지의 두 자릿수 논리 우이위 연산입니다.
10진법으로 $\div2^2달러를 계산하면 * 256 / 1024만 계산할 수 있습니다.
저 녀석 1023이 나올까?
△bit에서 □bit로의 전환은 양적 등 세부적인 전환으로 1024와 같은 번호가 나왔다.
반대로 양적화와 전혀 무관할 때 1023이 나온다.
예를 들어, 입력 전압이 Serial 모니터에 표시될 때
sample_1023.ino
int lv = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  lv = analogRead(A0);
  Serial.println(lv * 5 / 1023);
}
최후
길게 썼지만 단도직입적으로 말하면 255/1023256/1024의 차이는 미세한 차이(1% 미만)여서 고려할 필요가 없다고 생각한다.이런 말 하면 안 돼.
저 자신도 고민을 많이 해서 이해한 거니까 공유하고 싶어요.
특히 논리적으로 전환된 아이디어가 나올 때 기본 정보가 하는 일은 실제 프로그램 설계에서도 유용하다는 말이 흥미롭다.
아두노 프로그래밍에 익숙해진 여러분, 저와 함께 이런 디테일에 신경 쓰면서 즐겨보세요.
초보자는 이런 자질구레한 일에 신경 쓰기보다는 다양한 것을 만들어 보는 것이 낫다.이런 말도 하면 안 돼.

좋은 웹페이지 즐겨찾기