Está en la página 1de 5

Vdd

V+
D

V+
D

Vm

PWM

V+

Vm
D

0
T

Selector de
Posicin

Interfaz
de
visualizacin

Mdulo CCP
(PWM)

Servomotor
Microcontrolador

+5V

Enter

Vdd

R2

+5V

4.7k

LCD1
50%

LM032L

R4

D0
D1
D2
D3
D4
D5
D6
D7

VSS
VDD
VEE

VSS

RS
RW
E

10k

X1

C1
15pF

FREQ=4MHz

C2
15pF

B0
B1
B2
B3
B4
B5

33
34
35
36
37
38
39
40

7
8
9
10
11
12
13
14
B0

B2

B1

B3

15
16
17
18
23
24
25
26

B5

2
3
4
5
6
7
14
13

RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RA0/AN0/ULPWU/C12IN0RC2/P1A/CCP1
RA1/AN1/C12IN1RC3/SCK/SCL
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
RA3/AN3/VREF+/C1IN+
RC5/SDO
RA4/T0CKI/C1OUT
RC6/TX/CK
RA5/AN4/SS/C2OUT
RC7/RX/DT
RA6/OSC2/CLKOUT
RA7/OSC1/CLKIN
RD0
RD1
RB0/AN12/INT
RD2
RB1/AN10/C12IN3RD3
RB2/AN8
RD4
RB3/AN9/PGM/C12IN2RD5/P1B
RB4/AN11
RD6/P1C
RB5/AN13/T1G
RD7/P1D
RB6/ICSPCLK
RB7/ICSPDAT
RE0/AN5
RE1/AN6
RE2/AN7

1
2
3

RE3/MCLR/VPP

+5V

+88.8

B4

4
5
6

+12V

U2

19
20
21
22
27
28
29
30

B[0..5]

+12V

+12V

8
9
10

PIC16F887

UP

+88.8

+88.8

T= 2ms

T = 4ms

DOWN

R1

R5

4.7k

4.7k

+5V

+12V

+88.8

T = 3ms

D
D= 1ms => -90

D= 1.5ms => 0

128 => 50%T = 2 ms


96 => 1.5 ms

D= 2ms => +90

64 => 25%T = 1 ms

-90

pos

+90

Se elige T = 4 ms (f = 250 Hz).


En Mikro C, PWM1_Set_Duty(Duty) especifica que Duty vara entre 0 y 255. 0 => 0%T,
128 => 50%T y 255 => 100%T
Si

256 -------------- 4 ms

= 1.5

64 1.55

X --------------- 1.5 ms

96

64
180
64
180

0
96

96

Inicio

Configuracin:
PortB: Ctrl LCD, RC2: Salida para PWM
RC4, RC3, RC0: Entradas dig.

Pos
0
Mostrar Pos, Fijar T y D
Generar PWM

No
Down
(RC3)

No

Pos-1

Mostrar Pos

void InitMain() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
C2ON_bit = 0;

// Configure AN pins as digital


// Disable comparators

TRISC = 0x19; //0001 1001


PWM1_Init(250); // T=4 ms
PWM1_Set_Duty(96); //96 es 1.5 ms de Duty
PWM1_Start();
}
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// Entradas y salidas digitales
char txt[5];
unsigned short Duty;
short pos = 0;
sbit UP at RC4_bit;

Enter
(RC0)

Si

Si

Pos

No

Up
(RC4)

Pos

Pos+1

Si
D

RC2

64*pos/180+96

PWM(D)

sbit DOWN at RC3_bit;


sbit Enter at RC0_bit;

// Fin de entradas y salidas digitales


void main()
{
InitMain();
// ******************************************** //
Lcd_Init();
// Initialize LCD
Lcd_Cmd(_LCD_CLEAR);
// Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
// Cursor off
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Pos () = 0");
LCD_Out(2,1,"D = ");
pos=0;
Duty=96;
do {
if(!DOWN){
pos--;
shorttostr(pos,txt);
Lcd_Out(1,11,txt);
do {
delay_ms(50);
} while(!DOWN); //antirrebote
}
if (!UP){
pos++;
shorttostr(pos,txt);
Lcd_Out(1,11,txt);
do {
delay_ms(50);
} while(!UP); //antirrebote
}
if (!Enter){
Duty= (float)(64*(float)pos/180+96); //relacion lineal entre D y pos
ShortToStr(Duty,txt);
LCD_Out(2,11,txt);
PWM1_Set_Duty(Duty);
do {
delay_ms(50);
} while(!Enter); //antirrebote
}
}while(1);
}

También podría gustarte