-
Notifications
You must be signed in to change notification settings - Fork 0
/
Practica 5 control de un motor por PWM y Puerto serial
122 lines (91 loc) · 2.86 KB
/
Practica 5 control de un motor por PWM y Puerto serial
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
void Transmitir(unsigned char);
void delay(void);
char entrada = 0; //arranca apagado
int velocidad = 0; // velocidad del motor
int velocidadL = 0; // velocidad a la que se quiere llegar
int cambia=1;
int cambia2=1;
int speedload =0;
void main(void) {
PTBDD=0b11000000; //activa como salida PTBD 6 y 7 para controlar dirección
PTBD_PTBD7 = 1; //activa por defecto dirección frontal
PTBD_PTBD6 = 0;
SOPT1 = 0b01010010; //Perro gardian
SCIC2 = 0b00001100; //habilidta trasmición y recepción
SCIBD = 28; // divisor ratio para los baudios
TPMCNT = 0; //Limpia el contador
TPMMOD = 42999; // conteo máximo del contador
TPMC0V = entrada; // maximo del alto para controlar ciclo útil
TPMSC = 0b00001000; // no se divide la freciencia de bus, es decir se ecogió 000 en los pines 0-2 y el 01 en el pin 3 y 4 escoge la frecuencia de bus como fuente
TPMC0SC = 0b00101000; // seleciona el pin pwm de generación pulsos positivos
while (1) {
while (SCID == 0) { // espera a que haya una entrada
}
entrada = SCID;
if (entrada == 115) { // si entrada es igual a stop velocidad igual a 0
velocidadL = 0;
} else {
if (entrada == 48) { // si entrada es igual a 0 tonces 100%
velocidadL = 100;
speedload = velocidadL;
} else {
if (entrada == 102) {//si entrada f entonces guira front
cambia=1;
} else {
if (entrada == 114) {//si entrada r entonces reverse
cambia=0;
} else {
if (0 < entrada - 48 < 10) {//entrada de la velocidad deseada
velocidadL = (entrada - 48) * 10;//cambia codigo ascii por "porcentaje"
speedload = velocidadL;
}
}
}
}
}
TPMC0V = 430 * velocidad;//calculo porecentaje ciclo util
Transmitir(velocidad / 100 + 48);//transmite la centena de la velocidad
Transmitir(velocidad / 10 % 10 + 48);//transmite decena
Transmitir(velocidad % 10 + 48);//transmite unidad
//bonus
if(cambia != cambia2){
velocidadL = 0;
}
if((velocidad == 0)&&(cambia != cambia2)){
velocidadL = speedload;
cambia2 = cambia;
}
if(cambia2==1){
PTBD_PTBD7 = 1;
PTBD_PTBD6 = 0;
}else{
PTBD_PTBD7 = 0;
PTBD_PTBD6 = 1;
}
if(PTBD_PTBD7 == 1 && PTBD_PTBD6 == 0){
Transmitir(102);//transimte la dir ecion frontal
}else{
Transmitir(114);//transmite la direccion reversa
}
Transmitir(10);//cambio de linea
if (velocidad < velocidadL) {
velocidad++;//aumento a la velodidad deseada
delay();
} else if (velocidad > velocidadL) {
velocidad--;//decremento a la velocidad deseada
delay();
}
}
}
void Transmitir(unsigned char buffer) {
while ((SCIS1 & 0b10000000) == 0) {
}
SCID = buffer;
}
void delay(void) {
int j;
for (j = 0; j < 5000; j++) {
}
}