Hola, yo hice hace un par de años un pequeño vehículo con dos motores y un sensor de posición angular con un optoacoplador y un disco con ranuras, que supongo que es lo que usas. Yo te recomiendo hacer un programilla que mande datos a un pc para poder ver la respuesta y deducir los parámetros.
Necesitas de hardware hacerte una interfase pequeña para conectar la salida de la usart del 16f877 al pc, se puede hacer con un esquema sencillo hecho con un max232 hay esquemas en internet a patadas, le pones el cable y lo enchufas al puerto serie del pc.
Luego el tema software necesitas una rutina periódica de periodo pequeño que lea los optoacopladores y deduzca si se ha producido movimiento angular, almacenando el desplazamiento en la memoria del pic, yo usaría 2 bytes o algo así pero debes elegir con cuidado dependiendo de si tienes el optoacoplador directamente a la salida del motor o si hay una reducción o lo que sea, vigila no se te sature la variable que almacena el desplazamiento. Prográmate luego una tarea periódica de un periodo mas lento que mande los datos de desplazamiento por la usart. El código para las dos cosas yo creo q no son mas de 50 lineas.
En el pc obtener los datos es tan facil como dumpear la llegada de datos del puerto, en *nix yo haría un cat /dev/ttyS0 >> log.txt o algo parecido.
Pillas el fichero des del excel o algun programa parecido, mirando el gráfico de la respuesta a una tensión constante partiendo del reposo puedes ver a ojo que la respuesta es parecida a un sistema de primer orden con un integrador puro, para tener datos de velocidad puedes calcularla aplicando una ecuacion en diferencias de un derivador de tiempo discreto y una vez lo tienes ya puedes determinar los parámetros de la respuesta mirando el gráfico -es decir la amplitud y la constante de tiempo (tiempo en llegar al 63% del valor final)-.
A partir de ahí ya es cosa tuya diseñar un PID de tiempo discreto con los datos que tienes del motor, supongo que ya sabrás las consideraciones que hay que tener, que no son pocas.
Afortunadamente la implementación final del controlador en el pic será simple y lo unico raro que puedes necesitar es implementar alguna rutinilla para usar aritmética de 32 bits o lo que haga falta en vez de los 8 que usa normalmente el pic para las operaciones y quizás implementar un pequeño código que haga multiplicaciones (a no ser que uses coeficientes exponente de dos y entonces hagas bitshifts). Allá tú.
Espero haberte servido de ayuda.
Suerte.