Usando AT89S52 para construir la función de retardo y la salida de onda PWM

Requisitos de la misión:

  51 retardo de precisión de un solo chip y diseño de interrupción, sin modo RTOS. Supongamos que el reloj del microordenador de un solo chip es de 12MHz, el modelo es AT89S52.

  1. Construya un temporizador independiente del temporizador (usando la función de investigación nop + nop (); modo sin interrupción);

  2. Use el pin del microcontrolador para generar una onda cuadrada con un ciclo de trabajo de 2KHz del 20%;

  3. Use el modo de interrupción para realizar que la salida de la onda cuadrada del ciclo de trabajo de 2KHz del pin MCU sea del 20%;

    Nota: Modifique el nivel de pin del microcontrolador en la interrupción TIMER0, 1 o 2, y modifique el tiempo de la siguiente ronda de desbordamiento (como establecer el valor de TLx y THx);

      Esta operación lleva menos tiempo y es la única tarea de TIMER (modificar el nivel de pin, modificar THx y TLx), no es necesario encapsularlo como una función;

  4. Visualice la forma de onda en el analizador de lógica virtual;

 

Análisis de tareas:

  Primero, la tarea que utiliza el modo nop requiere que finalmente se genere una onda cuadrada con un ciclo de trabajo del 20% y una frecuencia de 2KHz. Según la fórmula T = 1 / f , cada ciclo PWM es de 500 microsegundos. Debido a que el ciclo de trabajo es del 20%, el nivel alto de salida es de 100 microsegundos y el nivel bajo es de 400 microsegundos. Luego, necesitamos construir dos funciones de retraso, una con un retraso de 100 microsegundos y otra con un retraso de 400 microsegundos, y cambiar la polaridad del pin durante el retraso para generar la onda PWM requerida por el experimento.

  El experimento requiere el uso de nop (); para construir una función de retraso. nop (); significa instrucción vacía, es decir, toda la instrucción se ejecuta una vez, y el microcontrolador estará inactivo durante un ciclo de máquina y no hará nada. La MCU dada en el experimento es AT89S52, y la frecuencia de reloj es de 12MHz. AT89S52 es un microordenador de 51 chips, limitado por el conjunto de instrucciones de 51. Su ciclo de máquina es una doceava parte del ciclo de reloj, que es 1MHz. Luego, cada ejecución de la instrucción nop puede considerarse como un retraso de un solo chip de 1 microsegundo.

  Se puede construir una función de bucle. La instrucción nop se ejecuta en esta función de bucle, y se puede retrasar durante mucho tiempo sin escribir repetidamente muchas líneas de instrucciones nop. Dado que la función de bucle necesita juzgar la condición del bucle cada vez que ingresa, y esta parte es mucho mayor que 1 microsegundo, se puede recordar que el tiempo del bucle es k, el número de bucles es x, y la duración del tiempo de retraso es y, entonces La duración de este tiempo de retraso puede considerarse como un sistema de ecuaciones unidimensionales: y = kx

  Suponiendo que el tamaño de k no es adecuado, por ejemplo, para retrasar 100 microsegundos, k es 3, entonces se puede modificar aún más a: y = kx + b, b es cuántas instrucciones nop ejecutar después del final de la función de bucle.

  Luego se requiere usar una interrupción para emitir una onda cuadrada, y cada vez que se modifica el valor de recarga del temporizador para completar el cambio de la duración del retraso.

  Para el método de interrupción, primero necesitamos una variable para registrar el número de interrupciones ingresadas, y el número de pasadas es diferente para modificar el tiempo de interrupción, porque el tiempo de interrupción es dos, uno es de 100 microsegundos, uno es de 400 microsegundos, luego esta variable puede ser arbitraria Para definir, solo necesita agregar esta variable cada vez que finaliza la interrupción. Para modificar el valor de recarga, juzgue si la variable es impar o par.

  El paso de modificar el valor de recarga en sí mismo ocupará un cierto período de tiempo, es decir, la función de interrupción llevará tiempo, por lo que la siguiente ronda de tiempo de desbordamiento es más corta que 100us.

 

Realización de tareas:

  Primero cree un nuevo proyecto keil5.

  Abra keil, proyecto-> Nuevo proyecto uVision para crear un nuevo archivo de proyecto keil para este proyecto. Luego seleccione el microordenador de un solo chip como AT89S52 en el nuevo proyecto y configure la frecuencia del reloj de simulación como 12MHz como se muestra en la figura.

 

 

  Luego cree un nuevo "main.c" y agregue un archivo de encabezado "init.h" que contenga el código de inicialización, un archivo de encabezado "C8051F020_defs.h" que contenga 51 declaraciones de registro y un encabezado que contenga instrucciones de nop en "main.c" El archivo "intrins.h". Suponiendo que P10 se usa para generar PWM, entonces, después de definir el archivo de encabezado, defina P10: sbit P1 ^ 0 = P1_0, que es conveniente para escribir e identificar la conversión de nivel de pin.

  A continuación, construya la función principal:

1  void main ()
 2  {
 3      Init_Device ();
4  
5      para (;;)
 6      {
 7          P1_0 = 0 ;
8          delay400us ( 17 );
9          P1_0 = 1 ;
10          delay100us ( 3 );
11      }
 12 }

  

  En la función principal que se muestra arriba, solo las funciones de retraso en las líneas 8 y 10 no están definidas, y el resto se completa en los pasos anteriores.

  Entonces, al final, y lo más importante, el contenido central de este experimento: construir una función de retardo precisa.

  De acuerdo con las ideas en el análisis experimental, uso los parámetros de entrada de funciones para controlar el número de bucles, y agrego una instrucción fija de nop fuera del bucle para tratar de resolver la función de retraso especificada de vez en cuando.

  Lo siguiente toma delay400us (17); como ejemplo, el parámetro "17" pasado a esta función es el resultado de la prueba y error, por lo que en la llamada posterior, el valor no debe modificarse, es decir, "17" no puede modificarse.

  Establezca los puntos de interrupción en P1_0 = 0 y P1_0 = 1, lea los respectivos ciclos de la máquina que se han ejecutado a través de la simulación y luego reste a delay400us (17); la duración de la demora.

 

  Entre ellos, el estado de la ventana de monitoreo representa el ciclo de la máquina.

  Se puede ver a partir de las dos figuras anteriores que el programa se detuvo en P1_0 = 0 por primera vez, el ciclo de la máquina del microordenador de un solo chip en funcionamiento fue 22255, el programa se detuvo por primera vez en P1_0 = 1, el ciclo de la máquina del microprocesador de un solo chip fue 22655, las dos restas 400, que es delay400us (17), se retrasa en 400 ciclos de máquina. Según el análisis del proyecto anterior, un ciclo de máquina corresponde a un microsegundo, por lo que esta función de retraso se considera un éxito.

  Del mismo modo, continúe ejecutando la simulación.

  Se puede ver en la figura anterior que el ciclo de la máquina que la microcomputadora de un solo chip ha ejecutado en P1_0 = 0 para la segunda ejecución del programa es 22755. Es decir, la función delay100us (3) retrasa 100 ciclos de máquina, que es 100us.

  Luego observe la forma de onda del pin P1_0 a través del osciloscopio y verifique si el pulso PWM se genera según sea necesario, como se muestra en la figura a continuación.

 

 

 

 

  El P1_0 en el lado izquierdo de la figura anterior representa la forma de onda generada por el puerto P1_0. Al observar la relación de niveles altos y bajos, se puede ver que se genera una onda cuadrada con un ciclo de trabajo del 20%, pero debido al problema del sistema de simulación, el tiempo y El tiempo de diseño no es correcto. Es correcto calcular de acuerdo con el ciclo de la máquina, por lo que se puede juzgar que el sistema de simulación tiene un ERROR que causa el error de visualización de la hora.

  La clave para usar el método de interrupción es escribir la función de interrupción, que es similar al modo sin interrupción:

1  int a = 0 ;
2  
3  nulo Timer0_ISR () interrupción 1 
4  {
 5  
6      if (a == 0 )
 7      {
 8          TH0 = ( 65535 - 32 ) / 256 ;
9          TL0 = ( 65535 - 32 )% 256 ;
10          P1_0 = 0 ;
11          a ++ ;
12      }
 13  
14      más 
15      {
16          TH0 = ( 65535 - 6 ) / 256 ;
17          TL0 = ( 65535 - 6 )% 256 ;
18          P1_0 = 1 ;
19          a = 0 ;
20      }
 21 }

  Lo anterior es el código de la función de interrupción.

  Primero defina una variable a para contar. Cada vez que ingrese la función de interrupción, primero determine si a es 0. Si es 0, configure la próxima interrupción en 400 microsegundos y agregue a a sí mismo. En esta interrupción , El pin debe generar un nivel bajo; si a no es igual a 0, configure la próxima interrupción en 100 microsegundos y luego establezca a en 0, esta vez el pin de interrupción debe generar un nivel alto.

  El método de verificación es el mismo que el experimento anterior, establezca un punto de interrupción en P1_0 = 0 y P1_0 = 1, y observe el intervalo de tiempo cada vez que se ingresa el punto de interrupción.

 

 

  A través del cálculo, se puede concluir que el nivel bajo de la salida del pin mantiene 409 ciclos de máquina, es decir, 409 microsegundos, y el nivel alto mantiene 106 ciclos de máquina, 106 microsegundos.

  A través del analizador lógico, también puede ver que el pin genera la onda PWM normalmente.

  

  En este punto, el experimento anterior se completó con éxito.

 

Supongo que te gusta

Origin www.cnblogs.com/Wishengine/p/12670924.html
Recomendado
Clasificación