Программирование операционного усилителя на 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?