как изменить выходной ШИМ на основе аналогового входа

pwm voltage input

Я хочу подавать разные сигналы ШИМ (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();                
}                     

, 👍1

Обсуждение

https://www.gammon.com.au/forum/?id=11504&reply=6#reply6 является примером использования потенциометра (на аналоговом входе) для управления рабочим циклом аппаратного таймера. Этот пример особенно полезен, если вы не хотите работать со стандартными частотами, которыми вас ограничивает функция AnalogWrite()., @6v6gt

Вы используете Arduino UNO или какой-либо другой процессор?, @Gil


1 ответ


1

Функция map() может помочь . Подайте на него минимальное и максимальное возможные значения аналогово-цифрового выхода, а также минимальное и максимальное значения на входе ШИМ. (Это при условии, что вы ожидаете полный диапазон входных данных и хотите получить полный диапазон выходных данных.) Он сделает расчеты за вас. Вам придется кодировать чтение АЦП и запись ШИМ.

,