Arduino simulator - генерация синусоидальной волны от PWD (считывание осциллографом имеет прямоугольную форму)

попытка создать эту простую схему, где прямоугольный вход напряжения передается на выход синусоидальной волны.

процесс довольно простой, но я не мог видеть фактическую синусоиду при подключении осциллографа.

В настоящее время я работаю над симулятором онлайн, поэтому я подумал, что было бы лучше поделиться схемой с кодом c++, и, возможно, у вас будут какие-то идеи о том, почему я продолжаю видеть прямоугольное выходное напряжение, а не синус, когда данные действительно являются синусоидальной волной:

вот изображение схемы за определенное время:

circuit simulator

а код, генерирующий синусоидальную волну, таков:

#include <math.h>

const int numSamples = 500;
const float pi = 3.1415;
int f = 2; // частота сигнала
float sf = 500.0; // частота дискретизации > 2*f (Найквист)
int sineSignal[numSamples];

void setup(){
    pinMode(13, OUTPUT);
    // создание синусоидального сигнала:
    for (int i = 0; i < numSamples; i++){
        float t = i / sf;
        // сдвиг +1 для получения значений от 0 до 2
        sineSignal[i] = (int) (127 * (sin(2 * pi * f * t) + 1.0));
    }
}

void loop(){
    int pinToConnect = 9;
    for (int i = 0; i < numSamples; i++){
        analogWrite(pinToConnect, sineSignal[i]);
        delay(2);
    }
}

ps. это все основано на этом видео: Как генерировать синусоидальную волну с помощью Arduino?

, 👍0


1 ответ


3

Он работает так же интенсивно.

arduino UNO не имеет на борту ЦАП (цифроаналогового преобразователя), поэтому все, что он может производить, - это цифровые сигналы, либо 0, либо 5в. Функция analogWrite использует широтно-импульсную модуляцию для получения выходного сигнала, который в среднемимеет требуемое напряжение , быстро чередуя логические низкие и высокие значения с различной длительностью.

Это делается на аппаратном уровне с помощью таймеров Atmega, и это очень полезно для управления светодиодами, сервоприводами, шаговыми двигателями и т. Д.

Я бы предложил либо перейти на чип с встроенным ЦАП, используя внешний ЦАП-чип , такой как этот, либо самостоятельно построить простой ЦАП.

Еще более простым решением было бы создание RC-фильтра нижних частот на выходном выводе, который обеспечил бы простой, но, вероятно, неточный способ сгладить сигнал и сделать его похожим на аналоговый

,

Свет, который вы видите от светодиода, усредняется вашим глазом, который на самом деле не может видеть частоты в сотнях Гц, используемые ШИМ Arduino. Осциллограф, с другой стороны, срабатывает на восходящих/задних краях и имеет гораздо более высокое разрешение, поэтому он будет отображать больше деталей на высокой частоте. Гипотетически, если бы вы снимали светодиод в замедленном режиме, вы могли бы видеть, как он включается и выключается несколько раз, @Dario Petrillo