2019 Universidad Nacional de Diseño Electrónico de Pregrado (Pregunta D) Probador de características de circuito simple (2) Circuito y código de parte básica

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.

Supongo que te gusta

Origin blog.csdn.net/qq_52838784/article/details/122712352
Recomendado
Clasificación