как изменить выходной ШИМ на основе аналогового входа
Я хочу подавать разные сигналы ШИМ (D11) в зависимости от входного напряжения (A7). Как изменить ШИМ для разных аналоговых значений?
#include <LiquidCrystal.h>
#include <ezButton.h>
ezButton button(7);
int count;
int count1;
const float Pin0=A0;
const float Pin1=A1;
const float Pin2=A2;
const float Pin7=A7;
float valueA;
float valueB;
float valueC;
int valueD;
const float rs = 1, en = 2, d4 = 3, d5 = 4, d6 = 5, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
TCCR2B = 0b00000001; // х1
TCCR2A = 0b00000011; // быстрый ШИМ
pinMode(11, OUTPUT);
pinMode(9, OUTPUT);
button.setDebounceTime(5); // устанавливаем время устранения дребезга на 50 миллисекунд
button.setCountMode(COUNT_FALLING);
lcd.begin(16, 1);
pinMode(Pin0, INPUT);
pinMode(Pin1, INPUT);
pinMode(Pin2, INPUT);
pinMode(Pin7, INPUT);
}
void loop() {
float a;
float b;
float c;
valueD = analogRead(Pin7);
digitalWrite(9, HIGH);
digitalWrite(9, LOW);
valueA = analogRead(Pin0);
digitalWrite(9, HIGH);
a = valueA * 5 / 1023;
b = valueB * 5 / 1023 * 1.91 - a;
c = valueC * 5 / 1023 * 0.182;
valueB = analogRead(Pin1);
valueC = analogRead(Pin2);
button.loop();
int count = button.getCount();
count1 = constrain(count, 0, 4);
if (count1 == 0) {
lcd.print("Bal-Chg");
}
if (count1 == 1) {
lcd.print("V1: ");
lcd.print(a);
lcd.print("V");
}
if (count1 == 2) {
lcd.print("V2: ");
lcd.print(b);
lcd.print("V");
}
if (count1 == 3) {
lcd.print("I:");
lcd.print(c);
lcd.print("A");
}
if (count1 == 4) {
button.resetCount();
}
delay(500);
lcd.clear();
}
@hfsrg, 👍1
Обсуждение1 ответ
▲ 1
Функция map()
может помочь . Подайте на него минимальное и максимальное возможные значения аналогово-цифрового выхода, а также минимальное и максимальное значения на входе ШИМ. (Это при условии, что вы ожидаете полный диапазон входных данных и хотите получить полный диапазон выходных данных.) Он сделает расчеты за вас. Вам придется кодировать чтение АЦП и запись ШИМ.
,
@JRobert
Смотрите также:
- Использовать выводы PWM в качестве обычных цифровых входов/выходов?
- Запись нескольких входов в последовательный порт с использованием цикла while
- Затемнение этого светодиода ~ 30 В с помощью ШИМ, что мне нужно?
- Почему контакты Arduino не выдают 0 вольт?
- Что происходит, когда digitalWrite(pinname, LOW) вызывается после pinMode(pinname, INPUT_PULLUP)?
- PWM каждый другой контакт не читается
- Можно ли иметь длинные проводные соединения от NodeMCU к серводвигателю или кнопке?
- Обработка выходного тока Arduino
https://www.gammon.com.au/forum/?id=11504&reply=6#reply6 является примером использования потенциометра (на аналоговом входе) для управления рабочим циклом аппаратного таймера. Этот пример особенно полезен, если вы не хотите работать со стандартными частотами, которыми вас ограничивает функция AnalogWrite()., @6v6gt
Вы используете Arduino UNO или какой-либо другой процессор?, @Gil