Primero mire la primera pregunta de la parte básica. Primero, después de la prueba, el aumento de mi circuito amplificador de emisor común es de aproximadamente 280 (los componentes discretos son diferentes para todos), y cuanto menor sea el aumento del triodo, mejor será para hacer (1).explicar.
ferretería básica
resistencia de entrada
La amplitud de la salida de onda sinusoidal del DDS es de 1,1 V. Después de dividir el voltaje, conecte una resistencia en serie y calcúlela de acuerdo con la fórmula. El diagrama del circuito es el siguiente:
El superior es una décima parte del voltaje dividido, y el inferior es uno por ciento. Primero, hablemos sobre la función de lo anterior. Puede ver que lo anterior es el DDS conectado al seguidor, después de pasar por la CC. bloque, y luego, después del seguimiento, la resistencia se conecta en serie, porque el título requiere hacer Lo más importante es que la resistencia de entrada es 1K-50K, y el rango es relativamente grande, por lo que cuando la resistencia de entrada es relativamente grande, se conecta una resistencia grande en serie, y cuando la resistencia de entrada es relativamente pequeña, se conecta una resistencia pequeña en serie.
Debido a que en el proceso real, AD es impreciso al juzgar el valor máximo de la forma de onda (no sé por qué, mi superior también está en la misma situación), y el efecto no es particularmente ideal después de agregar el algoritmo, por lo que el AD637 Se utiliza el módulo de detección de picos. Aquí hay una introducción a AD637. También se puede considerar que registra el rendimiento de este chip, para no olvidarlo.
El AD637 es un completo convertidor monolítico de rms a CC de alta precisión que calcula el valor rms verdadero de cualquier forma de onda compleja. Ofrece un rendimiento sin precedentes en convertidores de rms a CC de circuitos integrados con precisión, ancho de banda y rango dinámico comparables a los diseños discretos y modulares. El AD637 ofrece un esquema de compensación del factor de cresta que permite medir señales con factores de cresta de hasta 10 con menos del 1 % de error adicional. El amplio ancho de banda permite la medición de señales de entrada a 200 mV rms hasta 600 kHz y por encima de 1 V rms hasta 8 MHz.
Hay materiales chinos en línea, así que no los repetiré aquí.
diagrama esquemático
Cuando la fuente de alimentación de ± 5 V, rango de voltaje RMS de entrada: 0 ~ 3 V, cuando la fuente de alimentación de ± 15 V, rango de voltaje RMS de entrada: 0 ~ 6 V
Entonces, conecte directamente el valor detectado a AD, el error es muy pequeño y muy estable.
La resistencia de salida es muy similar a la resistencia de entrada y no se describirá en detalle.
ganar
El factor de aumento es la Ui del circuito amplificador de entrada y la Uo de la carga. No se puede calcular directamente mediante la salida de DDS o la división de voltaje. OK.
Curva característica amplitud-frecuencia
Como se menciona en la curva característica de amplitud-frecuencia (1), es necesario asegurarse de que la amplitud del DDS no cambie mucho cuando se cambia la frecuencia, de lo contrario, es necesario volver a recopilar la entrada, lo que consumirá tiempo. El problema tiene un límite de tiempo y se descontarán puntos por horas extras.
Como se mencionó en (1), puede usar un osciloscopio o un barrido de frecuencia para medir la frecuencia correspondiente a 0.707 veces, lo cual es conveniente para escribir la frecuencia de salida de DDS
Después de la medición, la amplitud del 9850 disponible es de 1,1 V a 100 HZ-20 M, por lo que no es necesario recopilar la entrada porque el terminal de entrada es fijo. Después de la medición, las frecuencias límite superior e inferior son de 260 HZ a más de una docena de MHz. Usar DDS para cambiar la frecuencia una vez es una ampliación y finalmente mostrarla en la pantalla stm32lcd.
hay que tener en cuenta es:
Se pueden recopilar más puntos al final donde cambia el aumento, y se pueden recopilar menos puntos en el punto medio donde el aumento es muy fijo, de modo que la curva sea suave y no tan recta como una función lineal.
El ruido del divisor de voltaje de dos resistencias todavía es un poco alto, y será mejor usar un amplificador operacional.
La parte básica del hardware está aquí. Los puntos básicos son fáciles de obtener, casi no hay dificultad y es muy fluido.
el código
#incluye "adc.h"
#incluye "delay.h"
#incluye "stdio.h"
#incluye "math.h"
#incluye "lcd.h"
#incluye "led.h"
#incluye "ad9850.h"
u8 Res_seleccionar=0;
u32 gran_Res=20000;
u32 poco_Res=3000;
u32 ui1=55; //DDS_OUT se mide directamente con un multímetro y se escribe en el código (unidad: mv)
//Se conoce el valor de la salida DDS 1.1v después de la división de voltaje, no es necesario usar detección de anuncios o picos para medir
/ /pero para datos de errores pequeños Mida con precisión el código escrito con un multímetro de sobremesa
//Inicializar ADC
//Aquí solo tomamos canales regulares como ejemplo
//Abriremos los canales 0~3 por defecto
void Adc1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 , ENABLE ); //Habilitar el reloj del canal ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //Establecer factor de división de frecuencia ADC 6 72M/6=12, el tiempo máximo de ADC no puede exceder 14M
//PA1 se utiliza como pin de entrada de canal analógico
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //Pin de entrada analógica
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_In itStructure.GPIO_Mode = GPIO_Mode_AIN; // Pin de entrada analógica
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //Restablecer ADC1, restablecer todos los registros del periférico ADC1 a los valores predeterminados
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //Modo de trabajo ADC: ADC1 y ADC2 funcionan en modo independiente
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //La conversión de analógico a digital funciona en modo monocanal
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //Analog-to -La conversión digital funciona en un solo modo de conversión
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //La conversión se inicia mediante software en lugar de un activador externo
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //Los datos del ADC están alineados a la derecha
ADC_InitStructure.ADC_NbrOfChannel = 3; //Número de ADC canales para conversión regular en secuencia
ADC_Init(ADC1 , &ADC_InitStructure); //Inicialice el registro periférico ADCx de acuerdo con los parámetros especificados en ADC_InitStruct
//Establecer el canal de grupo regular del ADC especificado, una secuencia, tiempo de muestreo
//ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5); //ADC1, canal ADC, el tiempo de muestreo es de 239,5 ciclos
//ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5 ); //ADC1, canal ADC, el tiempo de muestreo es de 239,5 ciclos
//ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_239Cycles5 ); //ADC1, canal ADC, el tiempo de muestreo es de 239,5 ciclos
ADC_Cmd(ADC1, ENABLE); //Habilite el ADC1 especificado
ADC_ResetCalibration(ADC1); //Habilite el restablecimiento de la calibración
while(ADC_GetResetCalibrationStatus(ADC1)); //Espere a que finalice el restablecimiento de la calibración
ADC_StartCalibration(ADC1); //Abra la calibración AD
mientras (ADC_GetCalibrationStatus(ADC1)); //Espere a que finalice la calibración
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Habilite la función de inicio de conversión de software del ADC1 especificado
}
//Obtener valor ADC
//ch: valor de canal 0~3
u16 Get_Adc1(u8 ch)
{ // //Establecer el canal de grupo regular del ADC especificado, una secuencia, tiempo de muestreo ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1, canal ADC, el tiempo de muestreo es de 239,5 ciclos ADC_SoftwareStartConvCmd(ADC1, ENABLE); //Habilite la función de inicio de conversión de software del ADC1 especificado while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//Espere el final de la conversión
return ADC_GetConversionValue(ADC1); //Devuelve el resultado de la conversión del último grupo de reglas ADC1
}
u16 Get_Adc_Average1(u8 ch,u8 veces)
{ u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc1(ch); retraso_ms(5); } devuelve temp_val/veces; }
/*
//Esta función se puede usar para calcular el valor máximo de la forma de onda, pero el anuncio no es preciso, por lo que la solución que uso es la detección de picos
//Usar el anuncio para recopilar directamente la amplitud de la forma de onda del puerto de detección de picos es más preciso
#define N 50
u16 filter(u8 ch,u8 times )
{ char count,i,j; u32 Value_buf[N]; u32 temp; u32 sum=0; for(count=0;count<N;count++) Value_buf[count ]= 0; for(count=0;count< N;count++) Value_buf[count]= Get_Adc1(ch); for(j=0;j<(N-1);j++) for(i=0;i< (Nj);i++) if(Value_buf[i] >Value_buf[i+1]) { temp = Value_buf[i]; Value_buf[i]= Value_buf[i+1]; Value_buf[i+1]=temp;
}
for(recuento =1;recuento<N-1;recuento++)
sum += Value_buf[recuento];
retorno (u16)(suma/(N-2));
}
void adc_ch_data(u8 Channel)
{ u32 adcx[128]; u16 i; for(i=0;i<128;i++) { adcx[i] = Get_Adc_Average1(Channel,10); // detecta el voltaje del canal 1 printf ( "%d\r\n",adcx[i]); } } */
void get_resin(void)
{ float res_in=0; flotar adc_ch10=0;
float adc_ch10_v=0;
jidianqi7=0;
delay_ms(200);
adc_ch10 = Get_Adc_Average1(ADC_Channel_10,10); //recopila el valor adc del canal 1
//Y1=0.6715X-1.2403
//adc_ch10_v=((((adc_ch10+1.2403)/0.6715)*2)/80);
adc_ch10_v=((((adc_ch10+1.2403)/0.6715)*2)/110);
//Convertirlo a voltaje
//El propósito de volver a multiplicarlo por 2 es usar el valor pico a pico
//El propósito de dividir por 100 es porque este valor es relativamente pequeño. La medida real es solo 4mv
// Así que lo agregué después de la salida de 4 mv. El aumento de primer nivel es 80 veces el mismo aumento de relación de fase
// por lo que es necesario dividir 100 en el código. Si no se agrega aumento, no hay necesidad de dividir este 100
// El resultado de la medición sin ampliación es correcto, pero debido a que la amplitud es relativamente pequeña, se recopila el salto de valor inestable Impresionante pero con el resultado correcto
delay_ms(200);
if(Res_select==1)
{
res_in=(adc_ch10_v*large_Res)/(ui1-adc_ch10_v);
//Fórmula de cálculo de la resistencia de entrada: (Ui2*R)/(Ui1-Ui2)
}
else
{ res_in=(adc_ch10_v*little_Res)/(ui1-adc_ch10_v); }
printf("%f\r\n",res_in);
//res_in=res_in/1000;
LCD_ShowxNum(100,0, res_in,5,24,0);//Mostrar valor ADC
LCD_ShowxNum(100,120, adc_ch10_v,5 , 24,0);//Mostrar valor ADC
//printf("%f\r\n",res_in);
}
void get_resout(void)
{
float res_out=0;
float adc_ch11=0; float
adc_ch11_1=0
;
float adc_ch11_v1=0; float adc_ch11_v2
=0; = Get_Adc_Average1 (ADC_Channel_12,10); //Adquisición del valor adc del canal 11 //adc_ch11_v1= ((((adc_ch11+1.2403)/0.6715)*2)+1.1; //Convertirlo a voltaje //adc_ch11_v1=adc_ch11* 3.3/4096 / _ _ _ _ _ /recoger el valor adc del canal 11
//adc_ch11_v2=adc_ch11_1*3.3/4096;
//adc_ch11_v2=((((adc_ch11_1+1.2403)/0.6715)*2);
//medida de resistencia de salida Ro=(Uo1-Uo2)*R/Uo2 R: resistencia de carga
LCD_ShowxNum (100,180, adc_ch11_v2,5,24,0);//Mostrar valor ADC
//res_out=((adc_ch11_v1-adc_ch11_v2)*2000)/adc_ch11_v2;
res_out=((adc_ch11-adc_ch11_1)*2000)/adc_ch 11_1;
/ / res_out=((adc_ch11-adc_ch11_1)*2000)/adc_ch11_1;
delay_ms(2);
//res_out=res_out/1000;
//printf("%f\r\n",res_out);
LCD_ShowxNum(100,30, res_out ,5,24,0);//Mostrar el valor de ADC
}
void get_Au(void)//Gain
{ u16 Au=0; float Uo=0;//El valor pico de la forma de onda del relé no pasa a través del circuito amplificador //El valor pico de la forma de onda de salida debe restarse de la cantidad de CC antes de la detección del pico float Ui_v =0; float Uo_v=0; float Ui=0;//El pico de la forma de onda Ui= Get_Adc_Average1(ADC_Channel_10,10); Ui_v=((((Ui+1.2403)/0.6715)*2)/100 ); delay_ms(200); Uo= Get_Adc_Average1(ADC_Channel_12,10); Uo_v=(((Uo+0.12)*4)-6.35)*2; //Uo_v=(((Uo+1.2403)/0.6715)*2 ); delay_ms(10); Au=Uo_v/Ui_v; //printf("%d\r\n",Au); LCD_ShowxNum(100,60, Au,5,24,0);//Mostrar valor ADC }
La resistencia de entrada, la resistencia de salida y la ampliación están empaquetadas en funciones, que se pueden ajustar directamente en la función principal.
Visualización de coordenadas de la curva característica de amplitud-frecuencia:
void zuobiao(void)
{ POINT_COLOR = RED; LCD_Display_Dir(0); LCD_ShowString(30,0,210,24,24,"Ri = "); LCD_ShowString(30,30,210,24,24,"R0 = "); // LCD_ShowString(30,60,210,24,24,"fL = "); // LCD_ShowString(30,90,210,24,24,"fH = "); LCD_ShowString(30,60,210,24,24,"Au = "); LCD_DrawLine(0,305,240,305); LCD_DrawLine(15,140,15,320); //x·y· LCD_DrawLine(240,305,230,315); LCD_DrawLine(240,305,230,295); //Imagen LCD_DrawLine(15,140,5,150); LCD_DrawLine(15,140,25,150); //箭头
LCD_DrawLine(40,305,40,300);
LCD_DrawLine(65,305,65,300);
LCD_DrawLine(90,305,90,300);
LCD_DrawLine(115,305,115,300);
LCD_DrawLine(140,305,140,300);
LCD_DrawLine(165.305.165.300);
LCD_DrawLine(195,305,195,300);
LCD_DrawLine(15,275,20,275);
LCD_DrawLine(15,245,20,245);
LCD_DrawLine(15,215,20,215);
LCD_DrawLine(15,185,20,185);
LCD_ShowString(220,307,200,12,12,"Hz");
LCD_ShowString(20,307,200,12,12,"100");
LCD_ShowString(40,307,200,12,12,"200");
LCD_ShowString(60,307,200,12,12,"1K");
LCD_ShowString(80,307,200,12,12,"1.5K");
LCD_ShowString(100,307,200,12,12,"10K");
LCD_ShowString(120,307,200,12,12,"50K");
LCD_ShowString(140,307,200,12,12,"100K");
LCD_ShowString(160,307,200,12,12,"150K");
LCD_ShowString(180,307,200,12,12,"170K");
LCD_ShowString(2,270,200,12,12,"80");
LCD_ShowString(2,240,200,12,12, "10O");
LCD_ShowString(2,210,200,12,12,"12O");
LCD_ShowString(2,180,200,12,12,"14O");
LCD_ShowString(7,307,200,12,12,"O");
LCD_Display_Dir(1);
LCD_ShowString(145,0,200,12,12,"Ganancia");
LCD_Display_Dir(0);
}
Visualización de la curva característica de amplitud-frecuencia:
//Porque el AD9850 que tengo a mano no cambiará la amplitud al cambiar la frecuencia
//El 9854 cambiará la amplitud al cambiar la frecuencia
//Al medir la curva característica de amplitud-frecuencia, necesita medir la ganancia si el DDS la salida es constante, entonces no necesita cambiarla cada vez que la amplitud de entrada se recopila
cuando la frecuencia se cambia dos veces. // De manera similar, si la amplitud cambiará cuando se cambia la frecuencia, el código de entrada debe recopilarse una vez cada vez que se cambia la frecuencia. La carga de trabajo es relativamente grande.//La
curva característica de amplitud-frecuencia muestra
una señal flotante[11]={ 100, 200, 500, 1000, 10000, 50000, 100000, 150000, 170000};//DDS frecuencia de salida
void boxin(void)
{ u32 Ui1=55; //DDS_OUT se mide directamente con un multímetro y se escribe en el código (unidad: mv) //DDS Se conoce el valor de la salida 1.1v después de la división de voltaje. no es necesario medir mediante detección de anuncios o picos // Pero para errores pequeños y datos precisos, use un multímetro de escritorio para medir y escriba el código u8 Au[9]={0,0,0,0,0 ,0,0 ,0,0}; u8 i; float adc_ch11_1=0; float adc_ch11_v2=0; for(i=0;i<11;i++) { ad9850_wr_serial(0x00,(doble)señal[i]);/ /señal de salida DDS
adc_ch11_1 = Get_Adc_Average1(ADC_Channel_12,10); //adquirir el valor adc del canal 11
adc_ch11_v2=(((adc_ch11_1+1.2403)/0.6715)*2)+1.1; //convertirlo a voltaje
Au[i]=adc_ch11_v2/Ui1 ;
}
// for(i=0;i<8;i++)
// { // au[i]=Au[i]; // } // au[5]=au[4]-30; // au[ 6]=au[4]-60; // au[7]=au[4]-100; LCD_DrawPoint(20,305-Au[0]/20*30); LCD_DrawPoint(40,305-Au[1]/20 *30 ); LCD_DrawPoint(60,305-Au[2]/20*30); LCD_DrawPoint(80,305-Au[3]/20*30); LCD_DrawPoint(100,305-Au[4]/20*30); LCD_DrawPoint(120,305-Au[ 5]/20*30);
LCD_DrawPoint(140,305-Au[6]/20*30);
LCD_DrawPoint(160,305-Au[7]/20*30);
LCD_DrawPoint(180,305-Au[8]/20*30);
LCD_DrawLine(20,305-Au[0]/20*30,40,305-Au[1]/20*30);
LCD_DrawLine(40,305-Au[1]/20*30,60,305-Au[2]/20*30);
LCD_DrawLine(60,305-Au[2]/20*30,80,305-Au[3]/20*30);
LCD_DrawLine(80,305-Au[3]/20*30,100,305-Au[4]/20*30);
LCD_DrawLine(100,305-Au[4]/20*30,120,305-Au[5]/20*30);
LCD_DrawLine(120,305-Au[5]/20*30,140,305-Au[6]/20*30);
LCD_DrawLine(140,305-Au[6]/20*30,160,305-Au[7]/20*30);
LCD_DrawLine(160,305-Au[7]/20*30,180,305-Au[8]/20*30);
// LCD_DrawLine(65,305-Au[1]*t,70,305-Au[1]*t+k2*5-4);
// LCD_DrawLine(70,305-Au[1]*t+k2*5-4,75,305-Au[1]*t+k2*10-5);
// LCD_DrawLine(75,305-Au[1]*t-5+k2*10,80,305-Au[1]*t+k2*15-4);
// LCD_DrawLine(80,305-Au[1]*t-4+k2*15,85,305-Au[1]*t+k2*20-3); // LCD_DrawLine(85,305-Au[1]*t-3
+ k2*20,90,305-Au[2]*t);
// LCD_DrawLine(40,305-Au[0]*t,65,305-Au[1]*t);
// LCD_DrawLine(65,305-Au[1]*t, 90,305-Au[2]*t);
// LCD_DrawLine(90,305-Au[2]*t,115,305-Au[3]*t);
// LCD_DrawLine(115,305-Au[3]*t,140,305-Au[ 4]*t);
// LCD_DrawLine(140,305-Au[4]*t,148,305-Au[5]*t);
// LCD_DrawLine(148,305-Au[5]*t,156,305-Au[6]*t );
// LCD_DrawLine(156,305-Au[6]*t,165,305-Au[7]*t);
// LCD_DrawLine(165,305-Au[7]*t,195,305-Au[8]*t);
}
arriba Son todas las piezas básicas, y han sido probadas, y no hay ningún problema.