Consejos Psoc 5Lp: Indice
Consejos Psoc 5Lp: Indice
INICIOS
Actualización:
7 de marzo de 2021
Índice
1. Actualizar Firmware 2
3. Copiar proyectos 3
4. Programar PSoC 5
5. Funciones básicas 7
5.1. Escribir en un bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.2. Leer un bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.3. Leer y escribir en un puerto de 2 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
6. Control de LCD 16 × 2 12
6.1. Ejemplo de funciones LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
6.2. Conexiones LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
6.3. Ejemplo LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
7. Despliegue de flotantes 16
8. Proyectos 17
8.1. Sensor MAX6675 y termocupla tipo K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
9. Encoder incremental 25
9.1. Dirección de giro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9.2. Identificar encoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9.3. Medición de velocidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
[Link]́n serial 45
10.1. Software emulador puerto serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
10.2. Envı́o de datos desde Hyper terminal a Psoc 5LP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
1
1. Actualizar Firmware
El kit de fabrica, tiene un firmware que NO permite grabar de forma directa el proyecto, para ello se siguen los
siguientes pasos.
1. Instalar PSoC programmer, PSoC creator y CY8CKIT059SetupOnlyPackage RevSA
2
Figura 2: Actualizar Firmware paso 5.
3. Copiar proyectos
Esta gran opción en psoc, es de gran ayuda al ir modificando un proyecto y sin perder las actualizaciones previas. Al
tener más de un proyecto en el espacio de trabajo, es importante seleccionar el proyecto activo (el que será programado
en e controlador).
1. Dar clic derecho sobre el proyecto a copiar sobre el proyecto, ver figura 8.
2. Dar clic derecho en la parte en blanco y elegir paste, ver figura 9.
3. Aparecerá la copia del proyecto, este mantiene la asignación de pines y código en archivo main o librerı́as
agregadas, ver figura 10.
3
Figura 4: Crear proyecto paso 2.
El nombre del proyecto creado puede ser cambiado, dando clic sobre el nombre del proyecto y presionar F2 o clic
derecho sobre el nombre del proyecto y seleccionar Rename, ver figura 11
4
Figura 6: Crear proyecto paso 4.
4. Programar PSoC
Hay varias formas de realizar programas en PSoC Creator, programación en C, programación únicamente gráfica
y combinación de ambas. Hay bloques que requieren inicializar en archivo main. Algunos consejos previos a hacer el
programa son:
5
Figura 8: Copiar proyecto paso 1.
6
Figura 11: Copiar proyecto cambiar nombre.
En los bloques digitales, se tiene la opción HW Conection, permite la conexión del pin con otros bloques en el
espacio de trabajo, de ser desactivada el pin se controla mediante software en archivo main.c.
Una opción que presenta Psoc Creator, es realizar el diagrama eléctrico en el espacio de trabajo para mayor
entendimiento y presentación, mediante la opción External terminal.
Una tarea común en la programación es cambiar los bits en los registros. Por suerte, PSoC permite los siguientes
operadores bit a bit:
a—b Operación OR bit a bit, Se usa para encender algún bit o bits, usando asignación — =. Por ejemplo:
LUCES — = 0x80;, la cual activa el bit 7 (msb)
a & b Operación AND bit a bit, Se usa para verificar si ciertos bits están en estado lógico alto. Por ejemplo: if
((LUCES & 0x81) == 0)// revisa si el bit 7 y el bit 0. Note que Los paréntesis en la operación AND son
necesarios ya que este operador tiene menor prioridad que el operador de igualdad ==.
a∧ b Operación XOR (OR EXCLUSIVA) bit a bit, es implementado para cambiar el estado de un bit. Por
ejemplo: salida ∧ = 0x80; invierte el estado del bit 7.
∼a Complemento a uno bit a bit, es usado para complemento a uno. Por ejemplo: LUCES &= ∼ 0x80;, cambia
el bit 7.
El bloque de LCD, sirve bastante bien para el despliegue de datos en display de 16x2, el único inconveniente es
que requiere de un puerto de siete bits contiguos, para evitar mostrar datos “raros”, usar el puerto P2 o P12, en
el puerto P0 provoca errores, esto debido a capacitores que tiene la placa de fabrica.
Los datos a mostrar en el LCD, deben ser enteros, de ser flotantes (tipo float), se deben realizar algunos cambios
en la configuración y en el archivo main.c, más adelante se describen estos pasos en la sección 7.
5. Funciones básicas
Las funciones básicas, para leer y escribir en un pin digital, manejo de puertos de más de 2 bits hasta 8 bits. Es
hacer referencia a los pines digitales, para ello se agrega 0 en las funciones, por ejemplo:
CyPins ReadPin(); Lee el valor de un bit, donde su parámetro es el nombre del pin. Por ejemplo, leer un pin
llamado sensor: CyPins ReadPin(sensor 0);, regresa 0x10 si el valor es un nivel lógico alto, y 0x00 si el valor es
un nivel lógico bajo.
CyPins SetPin(); Establece un nivel lógico alto a un bit, por ejemplo: escribir nivel lógico alto
el pin llamado luz: CyPins SetPin(luz 0);
CyPins ClearPin(); Establece un nivel lógico bajo a un bit, por ejemplo: escribir nivel lógico bajo
el pin llamado luz: CyPins ClearPin(luz 0);
7
Pin Read(); Lee el valor de un bloque digital completo, puede ser de un bit o un puerto completo de ocho bits,
regresa un entero sin signo de ocho bits justificado
a la derecha, por ejemplo: leer el bloque de entrada digital llamado sensores CNC: sensores CNC Read();.
Pin Write(); Escribe el valor de un bloque digital completo, puede ser de un bit o un puerto completo de ocho
bits, por ejemplo: escribir en el bloque de salida digital llamado motor CNC el valor en hexadecimal 0x08 :
motor CNC Write();. el valor puede ser en binario o decimal, el compilador lo escribe en binario justificado a la
derecha.
CyDelay(); Genera retardo en milisegundos, su parámetro de entrada es un entero sin signo de 32 bits.
8
Figura 13: Escribir bit paso 1.
2. Agregar un bloque Digital Output Pin [v2.20], con la configuración: Nombre motor, Numbers of Pins en 1,
deshabilitar opción HW connection, deshabilitar External terminal, Drive mode strong drive, ver figura 17.
3. Asignar sensor CNC al pin P2[2] y motor al pin P2[1], ver figura 18.
4. Dar clic en la herramienta Generate Application.
5. En el archivo main, escribir el código que se muestra en la figura 19.
9
6. Conectar la tarjeta PSoC 5LP y dar clic en la herramienta Program.
1. Agregar un bloque Digital Input Pin [v2.20], con la configuración: Nombre sensores CNC, Numbers of Pins en
2, deshabilitar opción HW connection, habilitar External terminal, Drive mode resistive pull up, el diagrama de
conexión se muestra en la figura 20 y la configuración en la figura 21.
10
Figura 17: Leer bit paso 2.
2. Agregar un bloque Digital Output Pin [v2.20], con la configuración: Nombre motores, Numbers of Pins en 2,
deshabilitar opción HW connection, habilitar External terminal, Drive mode strong drive, ver figura 22.
3. Asignar sensores CNC al pin P2[4:3] y motores al pin P0[1:0], ver figura 23.
4. Dar clic en la herramienta Generate Application.
5. En el archivo main, escribir el código que se muestra en la figura 24.
11
Figura 19: Leer bit paso 5.
6. Control de LCD 16 × 2
Las funciones del bloque están configuradas con el nombre del bloque LCD Char, estas se muestran en la tabla 1,
se presenta un ejemplo de las funciones en la sección 6.1 y un ejemplo en la sección 6.3.
12
Figura 21: Leer y escribir en puerto paso 1.
13
Figura 23: Leer y escribir en puerto paso 3.
En el pin A de luz del LCD, es opcional incluir una resistencia de 1KΩ, para conectar en directo el led de luz de
fondo a VCC o de lo contrario dejar sin conectar.
En el pin K va conectado a GN D y si no se conecto la resistencia puede quedar sin conexión.
14
Función Descripción
Inicia el módulo y carga el juego de
LCD Char Start() caracteres personalizado en LCD,
si se definió.
Imprime una cadena de caracteres
LCD Char PrintString() terminada en un carácter nulo en
la pantalla.
Establece la posición del cursor
LCD Char Position() para que coincida con la fila
y la columna proporcionadas.
Imprime el valor decimal de un valor
LCD Char PrintNumber() de 16 bits como caracteres ASCII
justificados a la izquierda.
Imprime un valor uint32 como un valor
LCD Char PrintU32Number()
decimal justificado a la izquierda.
Borra los datos de la pantalla,
LCD Char ClearDisplay() y ubica el cursor en el renglón
y columna cero.
1. Abrir el catalogo de componentes y agregar el bloque Character LCD, en la configuración de esté cambiar el
nombre a LCD.
15
Figura 25: Conexión de LCD de la sección 6.2.
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
7. Despliegue de flotantes
Para poder mostrar datos tipo float, sigue estos pasos del ejemplo.
1. Crear un proyecto con un bloque LCD
2. Configurar el nombre del bloque con LCD, La opción LCD custom character set en none y seleccionar Include
ASCII to number conversion routines y dar clic en ok.
3. Dar clic en la herramienta de generate application o menú build y opción generate application
4. Abrir archivo main colocar el siguiente código:
#include "project.h"
#include "stdio.h"
float32 temp;
char str[16];
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
16
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
LCD_Start();
temp=32.299;
for(;;)
{
LCD_Position(0,0);
LCD_PrintString("El valor es:");
sprintf(str,"%.3f",temp);
LCD_Position(1,1);
LCD_PrintString(str);
}
}
/* [] END OF FILE */
9. En el explorador de archivos abrir System o abrir Pins y en la parte inferior seleccionar la pestaña de System
10. En el campo Heap Size cambiarlo a 0x200, ver figura 27.
11. Dar clic en herramienta Program o menú Debug y seleccionar Program
8. Proyectos
Hay varios sensores que se usan hoy en dı́a, se presentan algunos para ser integrados en tus proyectos.
17
Figura 27: Corrección de heap size paso 10.
La comunicación se inicia cuando CS se encuentra en nivel digital bajo y la lectura de datos es sı́ncrona con la señal
sclk. Para generar una nueva conversión, poner CS en nivel digital alto. El tiempo de conversión por el MAX6675 es
de 200ms.
El MAX6675 envı́a una trama de 16 datos, el primer dato envı́ado corresponde al bit MSB de la trama y el último
dato es un dı́gito al LSB de la trama, este último es tri-estado (se puede despreciar su valor). Los datos de envı́an
como se muestra en la figura 28
De a cuerdo al diagrama temporal, se tiene un estado de inicio de envı́o de datos, CS en alto, CS en bajo y SO
(Serial output) en bajo, posteriormente un tiempo tcss pasado este tiempo generar un flanco de subida de SCLK,
esperar y poner SCLK en bajo y posteriormente leer el estado de SO, repetir hasta obtener el dato cero de la trama
y para finalizar el envı́o y forzar una nueva conversión poner CS en alto.
El bit 2 indica si la termocupla esta conectada con un valor 0 y abierta en 1, del dato 3 (LSB) al 14 (MSB)
es el resultado de la temperatura de la termocupla,el bit 15 indica el signo de la temperatura (0 para temperaturas
positivas) y el dato 1 es un identificador del circuito siempre es cero, ver figura 29. El voltaje de operación del integrado
es de 5V, el integrado se muestra en la figura 30.
La polaridad de la termocupla esta definida por sus cables, rojo a + del CI MAX6675 y cable azul a −, como se
muestra en la figura 31. Sigue los siguientes pasos
Agregar un bloque Digital Input Pin [v2.20] con la configuración: Name MISO, Number of pins 1, deshabilitar
18
Figura 29: Datos.
HW connection y External terminal, Drive mode en High impedance digital, initial drive state en low.
Agregar un bloque Digital Output Pin [v2.20] con la configuración: Name CLK, Number of pins 1, deshabilitar
HW connection y External terminal, Drive mode en Strong drive, initial drive state en low.
Agregar un bloque Digital Output Pin [v2.20] con la configuración: Name CS, Number of pins 1, deshabilitar
HW connection y External terminal, Drive mode en Strong drive, initial drive state en High.
Agregar un bloque Character LCD [v2.20] con la configuración: Name LCD, en apartado LCD Custom Character
Set en None y habilitar include ASCII to Number Conversion Routines.
Asignar los pines: LCD P2[6:0], CLK P15[1], CS P15[0] y MISO P3[0].
Dar click en el la herramienta Generate Application
Abrir el archivo main.c y escribir el código
Realizar las conexiones de forma adecuada, no se requieren resistencias de Pull up en las conexiones.
En el apartado de System cambiar Heap Size a 0x200, en el menú Proyect-Build settings abrir ventana y en el árbol
seleccionar ARM GCC y seleccionar Linker, en el lado derecho cambiar el valor de Use newlib-nano Float Formatting
en True, finalmente en el archivo main incluir la librerı́a stdio.h mediante: #include <stdio.h>, Es necesario recor-
dar el operador XOR “∧ ” bit a bit en C, corrimiento a la derecha >> he izquierda << de bits y asignación de vectores.
El corrimiento se denota como dato<< 2 corre dos posiciones a la izquierda la variable dato.
El operador XOR se denota dato∧ valor realiza la operación XOR bit a bit entre la variable dato y valor.
Declaración de funciones y definir constantes. #define termocupla_open (0u) Define la palabra termocupla_open
como un valor constante cero sin signo (u). Puede ser usada a lo largo del código.
Asignación de valores en hexadecimal de 8 bits dato=0xDFu y de 16 bits dato=0xA7DFu. En este ejemplo se des-
pliega la temperatura en grados Celsius, el signo de la temperatura y si la termocupla esta conectada o abierta.
19
Figura 31: Polaridad.
Signo (dato 15 = 0 de la trama de datos recibida), despliega un signo + previo a la temperatura y - (dato 15 = 1 de
la trama de datos recibida).
Termocupla abierta (dato 2 de la trama de datos recibida), despliega TOP OK si dato 2 = 0, termocupla co-
nectada y despliega TOP Error si dato 2 = 1 termocupla abierta, el diagrama de conexión se muestra en la figura
32. El código es:
#include "project.h"
#include <stdio.h>
/* Degree sign */
#define DEGREE (0xDFu)//sı́mbolo de grados
/*termocupla*/
#define termocupla_open (0u)
#define negativo (0u)
/*Variables globales*/
20
float gradosC;
char text[16];
int8 ter_open, signo, ID;
//inicia conversión
void ini_conv(void){
CyPins_ClearPin(CLK_0);
CyPins_ClearPin(MISO_0);
CyPins_SetPin(CS_0);//detiene TRANSMISIÓN DE DATOS
CyDelay(200);//espera conversión
}
uint16 temporal[16];
aux=0x0000;//borra variable para ajustar datos
CyPins_ClearPin(CS_0);
CyDelay(1);
/*Lectura de datos*/
for(i=0;i<16;i++){
temporal[i]=CyPins_ReadPin(MISO_0);//LEE DATO
CyPins_SetPin(CLK_0);
CyDelayUs(1);
CyPins_ClearPin(CLK_0);
CyDelayUs(1);
}
CyDelay(1);
CyPins_SetPin(CS_0);//TERMINA ENVÍO DE DATOS
/*ajuste de datos*/
//LSB
if(temporal[12]!=0){
temporal[12]=temporal[12]>>4;
}
aux=temporal[12]^aux;//actualiza LSB, 0X0001
//B1
if(temporal[11]!=0){
temporal[11]=temporal[11]>>3;
}
aux=temporal[11]^aux;//0X0003
//B2
if(temporal[10]!=0){
temporal[10]=temporal[10]>>2;
}
aux=temporal[10]^aux; //0X0007
//B3
21
if(temporal[9]!=0){
temporal[9]=temporal[9]>>1;
}
aux=temporal[9]^aux;//0X000F
//B4
if(temporal[8]!=0){
temporal[8]=temporal[8]>>0;
}
aux=temporal[8]^aux;//0X001F
//B5
if(temporal[7]!=0){
temporal[7]=temporal[7]<<1;
}
aux=temporal[7]^aux;// 0X003F
//B6
if(temporal[6]!=0){
temporal[6]=temporal[6]<<2;
}
aux=temporal[6]^aux;// 0X007F
//B7
if(temporal[5]!=0){
temporal[5]=temporal[5]<<3;
}
aux=temporal[5]^aux;// 0X00FF
//B8
if(temporal[4]!=0){
temporal[4]=temporal[4]<<4;
}
aux=temporal[4]^aux;// 0X01FF
//B9
if(temporal[3]!=0){
temporal[3]=temporal[3]<<5;
}
aux=temporal[3]^aux;// 0X03FF
//B10
if(temporal[2]!=0){
temporal[2]=temporal[2]<<6;
}
aux=temporal[2]^aux;// 0X07FF
//B11
if(temporal[1]!=0){
temporal[1]=temporal[1]<<7;
}
aux=temporal[1]^aux;// 0X0FFF
22
/*asigna bits de signo termocupla abierta y ID max6675*/
/*declarar estas variables globales fuera de la función*/
ter_open=temporal[13];//lee termocuple OPEN 1 Y CONECT 0
signo=temporal[0];//0 si temperatura es positiva
//1 si es negativa
ID=temporal[14];//ID DE MAX6675 SIEMPRE EN CERO
return(gradosCaux);
}
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
gradosC=0;//temperatura
for(;;)
{
}
}
/* [] END OF FILE */
23
Las configuraciones de cada bloque se muestran en las figuras 33 a la 37
24
Figura 35: Configuración.
9. Encoder incremental
9.1. Dirección de giro
Este ejemplo es para hacer una prueba del encoder y verificar que funcione correctamente, en los ejemplos siguientes
se identifica la resolución del encoder. Ejemplo basado en el código de ejemplo CE220799 de Cypresr y PSoCr
CreatorTM Component Datasheet del bloque Quadrature Decoder[v3.0]. Descripción de los pines:
25
Figura 37: Configuración.
CLK QA
DT QB
SW No conectar
Insertar un bloque Digital Input Pin [v2.20], con la configuración: Name QA, Type habilitar HW Connection,
Drive mode en High impedance digital, Initial drive state en Low, deshabilitar Externalterminal. Conectarlo a
la entrada quad A del bloque QuadDec.
Insertar un bloque Digital Input Pin [v2.20], con la configuración: Name QB, Type habilitar HW Connection,
Drive mode en High impedance digital, Initial drive state en Low, deshabilitar Externalterminal. Conectarlo a
la entrada quad B del bloque QuadDec.
Agregue a la entrada Clock del bloque QuadDec un bloque Clock con la configuración: Name Clock 1, Clock
type en New, Sourse Auto, Frecuency en 1MHz, habilitar Tolerance y −5 % + 5 %
Agregue un bloque Digital Output Pin [V2.20] con la configuración: Name horario, Type deshabilitar HW
connection, Drive mode Strong drive, Initial drive state Low, es necesario agregar una resistencia en serie con
un led (cátodo en GND) a la salida de este pin.
Agregue un bloque Digital Output Pin [V2.20] con la configuración: Name antihorario, Type deshabilitar HW
connection, Drive mode Strong drive, Initial drive state Low, es necesario agregar una resistencia en serie con
un led (cátodo en GND) a la salida de este pin.
26
La asignación de pines es de la siguiente forma: antihorario P15[1], horario P15[0], QA P3[0],QB P3[1], compilar
y programar.
El código es:
//direccion de giro
#include "project.h"
#include <stdio.h>
/*Declarar constantes*/
#define MID_COUNT (0x80u) /* for 16 bit counter*/
#define DELAY (10u) /* 10 msec */
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
int8 cuenta= MID_COUNT;//inicia contador de cuenta actual
int8 countPrev = MID_COUNT;//inicia contador de cuenta anterior
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
QuadDec_Start();//inicializa encoder
for(;;)
{
/* Place your application code here. */
cuenta=QuadDec_GetCounter();//obtiene valor actual de encoder
if(cuenta > countPrev) /* Condition for clockwise rotation */
{
CyPins_SetPin(horario_0); /* Red horario ON */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
CyDelay(DELAY);
}
else if(cuenta < countPrev) /* Condition for anti-clockwise rotation */
{
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_SetPin(antihorario_0);/*Green antihorario ON */
CyDelay(DELAY);
}
else /* No rotation */
{
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
}
/* Update countPrev value */
countPrev = cuenta;
}
}
/* [] END OF FILE */
Las capturas de las ventanas de configuración del ejemplo 9.1, se muestran de las figuras 38 − 49.
27
Figura 38: Plantilla del ejemplo 9.1.
Ejemplo basado en el código de ejemplo CE220799 de Cypresr y PSoCr CreatorTM Component Datasheet del bloque
Quadrature Decoder[v3.0]. Instrucciones
Insertar un bloque Quadrature Decoder[v3.0], con la configuración: Name QuadDec, en pestaña Counter Size
seleccionar 8 bit, pestaña Counter Resolutión seleccionar 1x, pestaña Use Index Input deshabilitar Use index
input, pestaña Enable Glitch Filtering habilitar Enable glitch filtering y pestaña Build-in deshabilitar todas las
28
Figura 40: Plantilla del ejemplo 9.1.
Insertar un bloque Digital Input Pin [v2.20], con la configuración: Name QB, Type habilitar HW Connection,
29
Figura 42: Plantilla del ejemplo 9.1.
Drive mode en High impedance digital, Initial drive state en Low, deshabilitar Externalterminal. Conectarlo a
la entrada quad B del bloque QuadDec.
Agregue a la entrada Clock del bloque QuadDec un bloque Clock con la configuración: Name Clock 1, Clock
type en New, Sourse Auto, Frecuency en 1MHz, habilitar Tolerance y −5 % + 5 %
Agregue un bloque Digital Output Pin [V2.20] con la configuración: Name horario, Type deshabilitar HW
30
Figura 44: Plantilla del ejemplo 9.1.
connection y habilitar external terminal, Drive mode Strong drive, Initial drive state Low, es necesario agregar
una resistencia en serie con un led (cátodo en GND) a la salida de este pin.
Agregue un bloque Digital Output Pin [V2.20] con la configuración: Name antihorario, Type deshabilitar HW
connection y habilitar external terminal, Drive mode Strong drive, Initial drive state Low, es necesario agregar
una resistencia en serie con un led (cátodo en GND) a la salida de este pin.
En los bloques horario y antihorario agregar resistencia, diodo led y Vss del catalogo off-Chip del catalogo de
31
Figura 46: Plantilla del ejemplo 9.1.
componentes
Agregar un bloque Character LCD [v2.20], con la configuración: Name LCD, Custom Character Set en None y
habilitar Include ASCII to Number Conversion Routines
En archivo main escribir el código que se presenta
La asignación de pines es de la siguiente forma: antihorario P15[1], horario P15[0], QA P3[0],QB P3[1], LCD en
32
Figura 48: Plantilla del ejemplo 9.1.
33
Figura 50: Encoder del ejemplo.
/*Declarar constantes*/
#define MID_COUNT (0x80u) /* for 16 bit counter*/
#define DELAY (10u) /* 10 msec */
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
int8 cuenta= MID_COUNT;//inicia contador de cuenta actual
int8 countPrev = MID_COUNT;//inicia contador de cuenta anterior
char str[16];
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
QuadDec_Start();//inicializa encoder
LCD_Start();//inicializa LCD
for(;;)
{
/* Place your application code here. */
cuenta=QuadDec_GetCounter();//obtiene valor actual de encoder
if(cuenta > countPrev) /* Condition for clockwise rotation */
{
CyPins_SetPin(horario_0); /* Red horario ON */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
CyDelay(DELAY);
}
else if(cuenta < countPrev) /* Condition for anti-clockwise rotation */
{
34
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_SetPin(antihorario_0);/*Green antihorario ON */
CyDelay(DELAY);
}
else /* No rotation */
{
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
}
/* Update countPrev value */
countPrev = cuenta;
LCD_Position(0,0);
LCD_PrintString("Cuenta");
CyDelay(20);
LCD_Position(1,0);
LCD_PrintString(" ");//borra valor anterior
//CyDelay(1000);
LCD_Position(1,0);
sprintf(str,"%d",countPrev);//imprime valor de cuenta actual
LCD_PrintString(str);
}
}
/* [] END OF FILE */
35
Figura 52: Plantilla del ejemplo 9.2.
36
Figura 54: Plantilla del ejemplo 9.2.
37
Figura 56: Plantilla del ejemplo 9.2.
minuto serán:
pulsos en 5s × 12 = pulsos en 60s = pulsos en 1min
38
Figura 58: Plantilla del ejemplo 9.2.
Para este encoder la velocidad con un tiempo de muestreo de 5s, se obtiene mediante
rev pulsos en base de tiempo × factor
Velocidad =
min pulsos por revolución de encoder
pulsos en 5s × 12
=
20
Dado que la resolución seleccionada, del bloque Quadrature Decoder[v3.0] es de 8 bits y el encoder genera 20 pul-
39
Figura 60: Plantilla del ejemplo 9.2.
sos/rev. Este ejemplo es funcional únicamente para velocidades de hasta 6 rev/min, de lo contrario se crea un desborde
del contador del bloque Quadrature Decoder[v3.0]. Dicho desborde, reinicia la cuenta a cero del contador del bloque,
de modo que se tendrı́a un calculo de velocidad erróneo si la velocidad supera las 6 rev/min.
Para usar el bloque a mayor número de rev/min, se debe aumentar la resolución del bloque y/o hacer uso de la
salida interrupt. Para ello consulte la hoja de datos del bloque Quadrature Decoder[v3.0] Siga los siguientes pasos
para elaborar la plantilla de este ejemplo:
40
Figura 62: Plantilla del ejemplo 9.2.
Insertar un bloque Quadrature Decoder[v3.0], con la configuración: Name QuadDec, en pestaña Counter Size
seleccionar 8 bit, pestaña Counter Resolutión seleccionar 1x, pestaña Use Index Input deshabilitar Use index
input, pestaña Enable Glitch Filtering habilitar Enable glitch filtering y pestaña Build-in deshabilitar todas las
opciones y dejar en blanco User Comments.
Insertar un bloque Digital Input Pin [v2.20], con la configuración: Name QA, Type habilitar HW Connection,
Drive mode en High impedance digital, Initial drive state en Low, deshabilitar Externalterminal. Conectarlo a
41
Figura 64: Plantilla del ejemplo 9.2.
Agregar un bloque Character LCD [v2.20], con la configuración: Name LCD, Custom Character Set en None y
habilitar Include ASCII to Number Conversion Routines
Agregar un bloque Timer [v2.80], con la configuración: Name Timer, Resolution 16 bits, Implementation en
Fixed Function, Period en 5000, Trigger Mode none, Capture Mode None, Enable Mode en Software Only, Run
mode en Continuous, deshabilitar On TC.
En la señal de reloj del bloque Timer cambiar Frequency en 1KHz y habilitar tolerancia en −1 % + 1 %
Conectar un bloque Interrupt[v1.70] en la salida tc del bloque timer con la configuración: Name ISR Timer y
Interrupt type en RISING EDGE
En archivo main escribir el código que se presenta.
La asignación de pines es de la siguiente forma: antihorario P15[1], horario P15[0], QA P3[0],QB P3[1], LCD en
P2[6:0], compilar y programar.
42
El código es:
#include "project.h"
#include <stdio.h>
#include <string.h>
//#include "math.h"
/*Declarar constantes*/
#define MID_COUNT (0x80u) /* for 16 bit counter*/
#define DELAY (10u) /* 10 msec */
/*Interrupción Timer*/
CY_ISR(INT_Timer){
pulsos=countPrev-cuentaaux;
cuentaaux=countPrev;
rev=(pulsos*12.00)/20;//con una base de muestreo de 5seg
//el factor para rev por min es 60/5=12
if(rev<0) rev=rev*-1.00;//si cambia de giro vuelve a positiva la velocidad
ISR_Timer_ClearPending();//borra solicitudes de interrupcion del timer
}
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
QuadDec_Start();//inicializa encoder
LCD_Start();//inicializa LCD
Timer_Start();
ISR_Timer_StartEx(INT_Timer);
cuentaaux=QuadDec_GetCounter();//obtiene valor actual de encoder inicial
for(;;)
{
/* Place your application code here. */
cuenta=QuadDec_GetCounter();//obtiene valor actual de encoder
if(cuenta > countPrev) /* Condition for clockwise rotation */
{
CyPins_SetPin(horario_0); /* Red horario ON */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
CyDelay(DELAY);
43
}
else if(cuenta < countPrev) /* Condition for anti-clockwise rotation */
{
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_SetPin(antihorario_0);/*Green antihorario ON */
CyDelay(DELAY);
}
else /* No rotation */
{
CyPins_ClearPin(horario_0); /* Red horario OFF */
CyPins_ClearPin(antihorario_0); /*Green antihorario OFF */
}
/* Update countPrev value */
countPrev = cuenta;
LCD_Position(0,0);
LCD_PrintString("Cuenta");
CyDelay(DELAY);
LCD_Position(1,0);
LCD_PrintString(" ");//borra valor anterior
LCD_Position(1,0);
sprintf(str,"%d",countPrev);//imprime valor de cuenta previa
LCD_PrintString(str);
mostrarrev();//llama a función para mostrar la velocidad
CyDelay(DELAY);
}
}
/* [] END OF FILE */
La configuración de cada bloque del ejemplo 9.3 se muestran de la figura 65 a la 79.
44
Figura 66: Plantilla del ejemplo 9.3.
45
Figura 68: Plantilla del ejemplo 9.3.
PuTTY
tinybldWin
46
Figura 70: Plantilla del ejemplo 9.3.
47
Figura 72: Plantilla del ejemplo 9.3.
configuración de tera term ver figura 80-82, en 81 seleccionar la opción Terminal; la configuración en PuTTY ver figura
84-86; la configuración en tinybldWin ver figura 87-89.
48
Figura 74: Plantilla del ejemplo 9.3.
Agregue un bloque Digital Output Pin [V2.20] con la configuración: Name M, Type deshabilitar HW connection,
Drive mode Strong drive, Initial drive state Low, no es necesario agregar una resistencia en serie con un led
(cátodo en GND) a la salida de este pin.
Agregar un bloque UART [v2.50] con la configuración que se muestra en la figura 90-92
En archivo main escribir el código que se presenta.
49
Figura 76: Plantilla del ejemplo 9.3.
La asignación de pines es de la siguiente forma: Rx1 P12[6], Tx1 P12[7], M P2[1] compilar y programar.
Conectar la tarjeta a la PC.
Abrir el programa de hyperterminal de su elección, iniciar comunicación, Tera Term, PuTTY o tinybldWin y
iniciar la comunicación, en la ventana de comunicación dar clic y presionar la tecla e y el led de usuario encenderá
y para apagar el led de usuario presione la tecla de la letra “o”, ambas son letras y en minúscula.
50
Figura 78: Plantilla del ejemplo 9.3.
El código es:
#include "project.h"
#include "stdio.h"
51
/* Project Defines */
#define FALSE 0
#define TRUE 1
#define TRANSMIT_BUFFER_SIZE 16
int dig;
char car;
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Transmit Buffer */
char TransmitBuffer[TRANSMIT_BUFFER_SIZE];
/* Initialize Variables */
/*ContinuouslySendData = FALSE;
SendSingleByte = FALSE;
SendEmulatedData = FALSE;
EmulatedData = 0;*/
dig=0;
for(;;)
{
ch = UART_GetChar();
switch(ch)
{
case 0:
// No new data was recieved
break;
//case ’e’:
case ’e’:
CyPins_SetPin(M_0);
sprintf(TransmitBuffer, "Motor encendido \r\n");
UART_PutString(TransmitBuffer);
break;
case ’o’:
CyPins_ClearPin(M_0);
52
sprintf(TransmitBuffer, "Motor apagado OFF \r\n");
UART_PutString(TransmitBuffer);
break;
default:
// Place error handling code here
break;
}
}
}
/* [] END OF FILE */
53
Figura 81: Configuración tera term.
54
Figura 82: Configuración tera term.
55
Figura 84: Configuración tera putty.
56
Figura 85: Configuración tera putty.
57
Figura 87: Configuración tera tiny.
58
Figura 89: Configuración tera tiny.
59
Figura 91: Configuración PSoC creator salida digital.
60