En este ejemplo veremos una forma de controlar servomotores, para ello vamos a utilizar el modulo PCA9685 cortesía de DigitSpace, como se ve en el titulo el código se estará trabajando en XC8 junto con PIC18F25K22, bueno usaremos la PIC18BT MCE Development Board para ser mar exactos.
Circuito:
Para el circuito simplemente es conectar los pines correspondientes al puerto I2C del MCU al modulo PCA9685, por otro lado he conectado dos servomotres Futaba en el canal 0 y 1, importante mencionar que he alimentado el modulo con una fuente extarna de 5V/1.5A, el circuito queda de la siguiente forma:
Código:
La rutina es sencilla, primero tenemos que saber los valores minPWM_Duty y maxPWM_Duty ya que estos seran los encargados de limitar el moviento del servo, para saber estos valores podrias experimentar a prueba y error (segun los valores de pulso que indica la hoja de datos), pero tambien podrias hacer un calculo considerando que la frecuencia es de 50Hz, por lo tanto el periodo del PWM sera de 20ms y considerando que el integrado PCA9685 tiene sus salidas a una resolucion de 12 bits, por lo tanto puede tener valores de 0 a 4095.
El código mostrado hace un barrido de 0 a 180 grados, tanto en sentido horario como en sentido antihorario esto lo hara en el ciclo while asi que se estara repitiendo indeterminadamente, lo demas son configuracion para que nuestro MCU trabaje adecuadamente.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <xc.h> | |
#include "FUSES_Config.h" | |
#include "i2c.h" | |
#include "PCA9685.h" | |
#define _XTAL_FREQ 64000000 | |
uint16_t duty; | |
//Servo VIGOR VS-2 | |
//uint16_t maxPWM_Duty = 505; // ancho de pulso en cuentas para la pocicion 180° | |
//uint16_t minPWM_Duty = 130; // ancho de pulso en cuentas para pocicion 0° | |
//Servo FUTABA S3003 | |
uint16_t maxPWM_Duty = 500; | |
uint16_t minPWM_Duty = 120; | |
void MCU_Init(void); | |
void main(void){ | |
MCU_Init(); | |
I2C_Init(); | |
PCA9685_Init(); | |
while(1){ | |
for (duty = minPWM_Duty; duty < maxPWM_Duty; duty=duty+5) { | |
PCA9685_SetPWM(0,0,duty); | |
PCA9685_SetPWM(1,0,duty); | |
__delay_ms(50); | |
} | |
__delay_ms(200); | |
for (duty = maxPWM_Duty; duty > minPWM_Duty; duty=duty-5) { | |
PCA9685_SetPWM(0,0,duty); | |
PCA9685_SetPWM(1,0,duty); | |
__delay_ms(50); | |
} | |
__delay_ms(200); | |
} | |
} | |
void MCU_Init(void){ | |
// Pines de entrada digitles | |
ANSELA = 0; | |
ANSELB = 0; | |
ANSELC = 0; | |
//Configura oscilador interno a 16MHz | |
OSCCONbits.IRCF=0b111; //El ciclo de instruccion es de 0.25 us | |
//PLL FOSCx4 64MHz, el ciclo de instruccion es de .0625 us | |
OSCTUNEbits.PLLEN=1; | |
//Configura entras/salidas | |
TRISA=0b00000000; | |
TRISB=0b00000000; | |
TRISC=0b00000000; | |
//Limpiamos los puertos | |
LATA=0x00; | |
LATB=0x00; | |
LATC=0x00; | |
PORTA=0x00; | |
PORTB=0x00; | |
PORTC=0x00; | |
} | |
Las funciones con las que cuenta la libreria PCA9685 tienen comentarios, para saber que hace cada una de ellas.
Vídeo:
Aquí un pequeño vídeo del circuito en funcionamiento:
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Links:
- Bill Legge on Mikroe Forum, "PCA9685 Servo and LED driver", https://forum.mikroe.com/viewtopic.php?f=88&t=69437
- NXP, "PCA9685 16-channel, 12-bit PWM Fm+ I2C-bus LED controller", https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf
- MrChunckuee, "Arduino Nano: Control de servomotores con el modulo PCA9685", https://mrchunckuee.blogspot.com/2025/04/arduino-nano-control-de-servomotores.html