attiny85 и arduino — аналоговое чтение + pwmOut

Я использую Arduino IDE для программирования attiny85. Я хочу снять входящее аналоговое показание, а затем на основе этого показания вывести определенное значение ШИМ. Вот моя схема:

моя схема

и вот мой код:

// для запуска на attiny85

const byte pwmPin = 0;
const byte analogInPin = A2;

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

void loop() {
  int analogIn = analogRead(analogInPin);
  analogWrite(pwmPin, analogIn);
}

должно быть очень просто — у меня нет проблем с загрузкой кода в attiny85, и нет проблем с простыми тестами, такими как вывод определенного значения ШИМ (не на основе аналогового чтения). но когда я пытаюсь объединить два значения — прочитать, а затем записать это значение, у меня ничего не получается. Например, в этой схеме я получаю показание 1023 (5 В) на микросхеме Arduino вместо показания ~ 790 (3,85 В), чего я и должен ожидать. Я использовал мультиметр для проверки напряжения в этой схеме, поэтому думаю, что либо я делаю что-то не так с моими ожиданиями относительно того, как подключить или запрограммировать attiny85.

, 👍5

Обсуждение

Схема вашей схемы, вероятно, будет более полезной, чем схема реализации на макетной плате. Есть ли у вас такая схема? Если да, добавьте это к своему вопросу., @jfpoilpret

Я не вижу часов (кварцевого или керамического резонатора) для вашего ATtiny, это нормально?, @jfpoilpret

@jfpoilpret да, у вас есть несколько вариантов использования внутренних часов., @sachleen

Вы пытались добавить небольшую задержку в свой цикл? Что может случиться, так это то, что ваш цикл работает слишком быстро, и каждый новый вызов AnalogWrite() будет «сбрасывать» ШИМ вывода, делая его всегда включенным (нет времени на использование ШИМ). Я бы попробовал для начала Delay(1000)., @jfpoilpret

Ваш мультиметр показал напряжение 3,85 В после фильтра нижних частот? (так что прямо на входном контакте Micro), @sachleen

мне нужно было изменить диапазон ввода на 8 бит. analogIn = map(analogIn, 0, 1023, 0, 255);, @GradeSchool

он работает нормально. Кстати, я использую внутренний 8 МГц — attiny85. также используется крошечное ядро Arduino. Спасибо за все ваши предложения., @GradeSchool

просто чтобы уточнить: входной сигнал АЦП на attiny85 составляет 10 бит. выход ШИМ 8 бит. таким образом, карта()., @GradeSchool

@GradeSchool Было бы полезно, если бы вы могли написать свое решение в виде реального ответа, чтобы будущим посетителям было легче его найти. Спасибо!, @Peter Bloomfield

Я пытался это сделать, но этот сайт не позволит мне еще около 8 часов. я сделаю это, как только смогу., @GradeSchool

Не могли бы вы добавить в текст заглавные буквы, чтобы улучшить читабельность? Также очень поможет правильная принципиальная схема, а не схема подключения., @jippie


2 ответа


8

Аналоговое чтение имеет размер 10 бит (2^10 = диапазон 0–1023), аналоговая запись — 8 бит (2^8 = диапазон 0–255). Отбросьте два младших бита результата, выполнив:

analogIn = analogIn >> 2;

который можно сократить до:

analogIn >>= 2;

Или вы можете использовать довольно сложную функцию карты:

analogIn = map( analogIn(0, 1023, 0, 255) )
,

Извините, не увидел ответа в комментариях., @Cybergibbons

+1 Не проблема. В любом случае хорошо, если все это изложено в правильном ответе., @Ricardo


4

Мне нужно было изменить диапазон 10-битного входа на 8-битный для ШИМ-выхода.

// для запуска на attiny85

const byte pwmPin = 0;
const byte analogInPin = A2;

void setup() {
}

void loop() {
  pinMode(pwmPin, OUTPUT);
  int analogIn = analogRead(analogInPin);
 analogIn = map(analogIn, 0, 1023, 0, 255);
 analogWrite(pwmPin, analogIn);
}
,

функция map занимает *много* тактов по сравнению с битовым сдвигом, описанным в ответе Кибергиббонса., @TheDoctor