Код для получения PWM-вывода

pwm

Я попробовал код для получения ШИМ-выхода 100 кГц с рабочим циклом 41,66%, считав аналоговое значение из A0, которое сравнивается с эталонным значением 5 В для получения значения ШИМ.

Кто-нибудь может помочь мне с кодом? Любая помощь очень ценится.

Вот мой код.

int Pwmpin=9;//Pwm Output Pin
int Fchange= A0;//Изменение частоты с помощью потенциометра

void setup() {
  pinMode(Pwmpin, OUTPUT);//Pwm pin as Output
  Serial.begin(9600);
  TCCR1A=_BV(COM1A1)|_BV(COM1B1);//Non-inverted Mode
  TCCR1B=_BV(WGM13)|_BV(CS11);//Prescalar 8
}

void loop(){
  float freq=0;
  float count=10000,countt=0,Pinput=0;
  while(1){
    ICR1=count;//переменная частота
    countt=16*count;
    freq= int(16000000/countt);
    OCR1A=int(count/2);
    Serial.print("Pwm Freq =");
    Serial.println(freq);
    count=10000;
    Pinput=analogRead(A0);//Считанное входное значение
    Serial.print("adc value is:");
    Serial.println(Pinput);
    Pinput=(Pinput/0.0113);
    Serial.print("pwm value is:");
    Serial.println(Pinput);
    count=count+Pinput;
    if(count>=100000) {
      count=10000;
    }
    delay(1000);
  }
}

, 👍1

Обсуждение

И вот в чем вопрос?, @Edgar Bonet

Трудно помочь, когда мы не знаем, как значение АЦП должно соотноситься с выходом ШИМ. Однако имейте в виду, что преобразования АЦП обычно являются шумными и, вероятно, должны использовать методы для снижения шума. Кроме того, вы можете ознакомиться со спецификациями микропроцессора для конкретного процессора на вашем конкретном Arduino (существует множество различных типов). Указанные вами значения ШИМ могут быть недоступны из-за детализации оборудования ШИМ процессора., @st2000

Вы могли бы получить рабочий цикл 41,6% с Arduino 12 МГц (они вообще существуют?). Самое близкое, что вы можете получить с Arduino 16 МГц, составляет 41,875%., @Edgar Bonet

Похоже, вы пытаетесь смоделировать аналоговую схему генератора ШИМ с помощью микроконтроллера - это, вероятно, плохая идея, и, по крайней мере, потребуется АЦП с более высокой производительностью. Если все это возможно, лучше всего было бы просто использовать внутренний таймер для генерации ШИМ в цифровом виде., @Chris Stratton


1 ответ


-1
  1. Прочитайте таблицу.
  2. Выясните, какой режим пера работает для вас, и какой прескалер и топ вам нужны.
  3. Установите timer1 в этот режим.

После этого все, что вам нужно, это загрузить регистр рабочего цикла с требуемым значением.

Для вашего приложения оставьте верхнее значение в покое.

Ваш код далек от этого.

,