Confusión en Servo y PWM (AVR) [duplicado]

0

Para referencia im usando un AVR Atmega 328p, y las especificaciones de servo que usaré dicen esto:

  • Ciclo de pulso: 20 ms (supongo que esto significa el "período")
  • Ancho de pulso: 600-2400 µs

Desde mi entendimiento, utilizando PWM rápido y digamos un reloj de 1Mhz. Hago el ancho estableciendo 2 valores. Uno cuando alcanza TOP (lo que sea el ancho) (supongamos 1800 ms, creo que la gente usa ICR1 para esto) y luego la parte superior (creo que usualmente usan OCR1A aquí).

Entonces, el tiempo entre ICR1 y OCR1A (¿cuál es la parte superior) es cuando enciendo el "Pin" al Servo en correcto? Y luego se apaga cuando termina OCR1A

IE: enciéndalo cuando llegue a ICR1, apáguelo cuando llegue a OCR1A. Si quiero un ancho de 1.8 ms, ¿necesito hacer esos 1800 pasos correctos? Ya que 1800 "tics" serían 1.8ms (si estoy entendiendo mis unidades correctas)

El ciclo del pulso es donde me confundo. Ese sería el valor "TOP" ¿verdad? IE: si necesito un ciclo de pulso de 20ms. y cada tick a 1MHz es 1/1000 de milisegundos, por lo que para hacer un ciclo de pulso de 20 ms, necesitaré 20000 ticks. porque cada tick es 1/1000 de un ms

¿Estoy pensando en esto correctamente? Creo que las "garrapatas" con la frecuencia de la CPU y luego tratar de resolverlo con ciclos y anchos me están lanzando como un bucle.

    
pregunta msmith1114

1 respuesta

1
  

Ciclo de pulso: 20 ms (supongo que esto significa el "período")

Sí, eso es correcto. Necesitas enviar 1 pulso cada 20ms.

  

Ancho de pulso: 600-2400 µs

Esto es más o menos correcto también, aunque observaría que la mayoría de las piezas RC están diseñadas para funcionar entre 1000 y 2000 uS.

Lo que querrás hacer es crear un temporizador que desborda cada 20 ms. Esto puede ser un temporizador de software o hardware.

Luego , cada vez que el temporizador se desborda, activa la salida.

Asigne los tictac del temporizador a uS, y desactive la salida una vez que haya transcurrido el número correcto de uS. Por ejemplo, si su temporizador marca 2000 veces por 20 ms y desea un pulso de 1500uS, apague la salida después de 150 pasos.

La señal resultante tiene este aspecto (tenga en cuenta que los ángulos variarán según el servo):

LamayoríadelosmicrostendránunmododetemporizadorPWMquepuedehacertodoestoautomáticamente.Echeunvistazoalahojadedatosdelatmega328p,sección16.9.3"Modo rápido de PWM":

  

El contador cuenta desde BOTTOM hasta TOP y luego se reinicia desde BOTTOM. En el modo de salida de comparación sin inversión, la Comparación de salida (OC1x) se borra en la comparación de comparación entre TCNT1 y OCR1x, y se establece en BOTTOM. En la inversión, el modo de salida de comparación de salida se establece en la comparación de comparación y se borra en BOTTOM.

LA PARTE INFERIOR de acuerdo con la hoja de datos solo significa 0. .. No sé por qué no solo dicen eso. De todos modos, lo que debe hacer es configurar TOP y el escalador previo del temporizador para que el período sea de 20 ms. Luego, debe configurar OCR1x en una fracción apropiada para obtener la longitud de pulso de salida deseada. Querrá utilizar el modo de comparación no inversor.

Editar: se cambió "OC1x" a "OCR1x" en este párrafo. Eso fue un error tipográfico, lo siento.

Hay calculadoras en línea que pueden ayudarlo a determinar los valores de TOP y del escalador previo del temporizador.

    
respondido por el Drew

Lea otras preguntas en las etiquetas