Программирование операционного усилителя на C

У меня есть быстрая попытка смоделировать простую схему искажения операционного усилителя в C, совсем как: Схема. Сейчас я просто пытаюсь смоделировать стандартный неинвертирующий усилитель.

Я написал то, что, по моему мнению, должно работать как код, хотя я, вероятно, где-то совершенно не прав!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float Diode(float IP){
    if(IP<0.7) return 0;
    if(IP>0.7) return IP-0.7;
}

float OpAmp(float VI, float VN){
    const float AOL = 100000;
    const float VNS = -15, VPS = 15;
    float OP = 0;

    OP = AOL*(VN - VI);
    if(OP>VPS) OP = VPS;
    if(OP<VNS) OP = VNS;

    return OP;
}

int main()
{
    float C, OP = 0, IVI = 0;
    const float R1 = 100, R2 = 100;

    FILE *f, *f2;

    f = fopen("wf.txt", "w");
    f2 = fopen("ws.txt", "w");

    for(C = 0; C<8*M_PI; C+=0.1){
         //Inverting input variable   
        IVI = OP*R2/(R1+R2);
        printf("%f\n", IVI);

        OP = OpAmp(IVI, sinf(C));

        fprintf(f, "%.2f\n", OP);
        fprintf(f2, "%.2f\n", sinf(C));
    }

    fclose(f);
    fclose(f2);

    return 0;
}

Функция диода еще не используется, она просто есть, если мне удастся заставить это работать! Я пишу в файлы, чтобы я мог отобразить выходные данные в Matlab, хотя на данный момент, как выходной, я просто схожу с ума колебания! "Источник питания" ограничен до +/-15 В, любая помощь приветствуется!

Мне интересно, почему вывод не является масштабированной версией ввода относительно отношения R1 и R2?

2 ответа

Решение

То, как вы смоделировали операционный усилитель, дает ему бесконечную скорость нарастания с очень медленной обратной связью. Выход может изменяться от -VS до +VS мгновенно, в нулевое время, но для входа требуется ненулевое время, чтобы увидеть эффект этого изменения. Настоящий усилитель просто не работает таким образом, и я не уверен, что его можно правильно смоделировать так, как вы пытаетесь это сделать. Вы можете попытаться снизить скорость нарастания выходного сигнала, ограничив изменение выходного сигнала до 1% от напряжения питания, а затем использовать очень медленно изменяющийся вход с небольшой амплитудой. Как только вы получите что-то разумное, вы можете изменить параметр ограничения вращения.

Лучшая идея: использовать вместо SPICE.

Функция OpAmp кажется подозрительной. Умножение с AOL приводит к тому, что OP становится очень, очень высоким или очень, очень низким (например, около +700000 или -700000), а затем вы ограничиваете его до +-15. Вы уверены, что у вас есть правильный блок для AOL?

Другие вопросы по тегам