Una vez más, muchachos volvieron con un problema a mi circuito AGC, sin embargo, este es el último.
-
El problema es que el LM833N está recortando a menos de 1.92Vpp a 4.586 V Vcc. Entiendo que este op-amp no es riel a riel, sin embargo, debería estar dentro de su oscilación de voltaje.
-
No puedo explicar por qué obtengo un Vpp de 1.80V.
El algoritmo:
A. Ardunio lee la señal de audio a A0: lee 760 mV, esto está en pico después del rectificador de precisión.
B. Ardunio realiza la ecuación \ $ R2 = ((\ frac {Vo} {Vin}) - 1) * R1 \ $ Usando un objetivo de Vo deseado de 1.92V, esta es una variable dentro del IDE de Ardunio.
C. \ $ R2 = 1526.32 \ Omega \ $
D. Ardunio procede a encontrar la cantidad de pasos necesarios para llegar a \ $ 1526.32 \ Omega \ $ \ $ Value = 1526.32 / 36.75 \ = 41 \ $, donde se encontró 36.75 usando 9400 (medido en una fuente digital utilizando 0xFF) / 256 (hoja de datos)
E. Al ver el valor en el amplificador, \ $ 41 * 36.75 = 1506.75 \ Omega \ $ Esto se espera ya que perderemos precisión debido a una resolución de 8 bits.
\ $ Vo = ((\ frac {R2} {R1}) + 1) * V_ {IN} \ $
\ $ Vo = ((\ frac {1506.75} {1000}) + 1) * 760mV \ $
\ $ Vo = 1.90513V_ {p} \ $
No entiendo por qué este valor se muestra como un pico-pico de voltaje
Lo que me limita a mí es el Voltage Swing del LM833N o no estaba calculando Vp, sino Vpp.
Aquí hay fotos del circuito y del esquema
simular este circuito : esquema creado usando CircuitLab
Código Ardunio (muy áspero):
#include <SPI.h>
int chipSelect = 10;
double voltageDivderOutput = A7;
int calibrationTurnOn = 3;
double desireAudioSignal = 1.98;
double audioSignalInput = A0;
double R1 = 1000.0;
double resolution = 256.0;
double offset = 0.0;
double realValue = 9400;
double RS = 0.0;
double Voltage;
double Vcc;
double R2 = 0.0;
double ADCValue;
double R2New = 0.0;
double Vout = 1.92;
void setup()
{
pinMode(chipSelect, OUTPUT);
pinMode(voltageDivderOutput, INPUT);
pinMode(audioSignalInput, INPUT);
pinMode(calibrationTurnOn, OUTPUT);
Serial.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
calibration();
}
void calibration() {
Vcc = readVcc()/1000.0; //Gives the voltage of Vcc
RS = 9400.0/resolution; //In datasheet of the Digi pot
digitalWrite(chipSelect, LOW);
SPI.transfer(0x00);
SPI.transfer(0x00); //Makes the gain close as one as possible
digitalWrite(chipSelect, HIGH);
}
long readVcc() {
long result;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1100800L / result; // Back-calculate AVcc in mV
return result;
}
void loop()
{
double R2 = 0.0;
double Vin = (analogRead(A0)/1024.0)*Vcc; //Read the value of Vin of the audio signal
R2 = ((Vout/Vin)-1.0)*R1; //Transfer Function of the Non-inverting amplifier, re-arrange to find R2
double value = 0.0;
value = R2/RS; //Find the int number to insert into register
if (value >= 255)
{
value = 255;
digitalWrite(chipSelect, LOW);
SPI.transfer(0x00);
SPI.transfer((int)value);
digitalWrite(chipSelect, HIGH);
}
else if (value <= 0)
{
value = 0;
digitalWrite(chipSelect, LOW);
SPI.transfer(0x00);
SPI.transfer((int)value);
digitalWrite(chipSelect, HIGH);
}
else
{
digitalWrite(chipSelect, LOW);
SPI.transfer(0x00);
SPI.transfer((int)value);
digitalWrite(chipSelect, HIGH);
}
value = 0.0;
}