65

MÓDULO II - files.profbrunopedroso.webnode.comfiles.profbrunopedroso.webnode.com/200000122-b95adbab51/Apostila... · conversor a/d do pic 18f4431. Este conversor possui 10 bits de

  • Upload
    vuhuong

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

MÓDULO IICapítulo X: Módulo de PWM.

Capítulo IX: Canal Analógico.

Capítulo XV: Projetos.

Referências Bibliográficas.

2

3

CONCEITO:PWM é a abreviação de Pulse Width Modulation ou Modulação por Largura de Pulso. Para que se

entenda como funciona esta tecnologia no controle de potência, partimos de um circuito imaginário

formado por um interruptor de ação muito rápida e uma carga que deve ser controlada.

Quando o interruptor está aberto não há corrente na carga e a potência aplicada é nula.

No instante em que o interruptor é fechado, a carga recebe a tensão total da fonte e a potência aplicada é

máxima.

Como fazer para obter uma potência intermediária, digamos 50%, aplicada à carga?

4

TÉCNICA DE APLICAÇÃO:Uma idéia é fazermos com que a chave seja aberta e fechada rapidamente de modo a ficar 50% do

tempo aberta e 50% fechada. Isso significa que, em média, teremos metade do tempo com corrente e metade

do tempo sem corrente

5

TÉCNICA DE APLICAÇÃO:

A potência média e, portanto, a própria tensão média aplicada à carga é neste caso 50% da tensão

de entrada. Veja que o interruptor fechado define uma largura de pulso pelo tempo em que ele fica nesta

condição, e um intervalo entre pulsos pelo tempo em que ele fica aberto. Os dois tempos juntos definem o

período e, portanto, uma freqüência de controle.

A relação entre o tempo em que temos o pulso e a duração de um ciclo completo de operação do

interruptor nos define ainda o ciclo ativo

6

RESUMO DA TÉCNICA DE CONTROLE POR PWM:

A técnica de PWM consiste em variar a largura do pulso de uma onda quadrada, variando a relação

entre o tempo em que o pulso permanece em nível lógico alto em relação ao período do sinal que é constante.

Essa relação (TH/P) é denominada índice de modulação ou duty cicle.

Variando-se o duty cicle de um sinal de PWM, variamos também a tensão média do sinal (tensão

resultante)

7

CÁLCULO DA FREQUÊNCIA DE PWM:

Para determinarmos a frequência da onde de PWM, precisamos calcular alguns parâmetros:

Modo Contínuo UP

Modo Contínuo UP/DOWN

8

REGISTRADOR PTPER:

É através do registrador de período que configuramos a freqüência de todos os sinais de PWM’s

(PWM0 –PWM7). É formado por dois registradores: PTPERL e PTPERH

9

REGISTRADOR PTPERJuntos os registradores PTPERL e PTPERH formam o registrador que configura o período (PTPER)

dos sinais de PWM’s

Juntos formam um registrador de 12 bits, onde:

PTPERL –Armazena os 8 bits menos significativos da palavra de 12 bits

PTPERH –Armazena os 4 bits mais significativos da palavra de 12 bits

Neste caso temos:

PTPERL = valor calculado;

PTPERH = valor calculado >>8;

10

REGISTRADOR PDCx:

Os microcontroladores 18F4431 possuem 4 registradores de duty cicle.

PDC0 –Configura o duty cicle dos PWM’s 0 e 1

PDC1 –Configura o duty cicle dos PWM’s 2 e 3

PDC2 –Configura o duty cicle dos PWM’s 4 e 5

PDC3 – Configura o duty cicle dos PWM’s 6 e 7

O registrador de duty cicle (PDCx) é formado por dois registradores PDCxH e PDCxL

11

REGISTRADOR PDCx:

Juntos os registradores PDCxL e PDCxH formam o registrador que configura o Duty Cicle (PDCx)

dos sinais de PWM’s correspondentes

PDCxL–Armazena os 6 bits menos significativos da palavra de 12 bits

PDCxH–Armazena os 6 bits mais significativos da palavra de 12 bits

Neste caso temos:

PDCxL = ((int)(PTPER*DC))<<2;

PDCxH = ((int)(PTPER*DC))>>6;

12

REGISTRADOR PTCON0:

Bit 3-2 PTKPS1:PTKPS0 Configuram a pré-escala:

0 0 –pré-escala = 4 (PTMR CLK=Fosc/4)

0 1 –pré-escala = 16 (PTMR CLK=Fosc/16)

1 0 –pré-escala = 64 (PTMR CLK=Fosc/64)

1 1 –pré-escala = 256 (PTMR CLK=Fosc/256)Bit 1-0 PTMOD1:PTMOD0:

Configuram o modo de operação dos PWM’s

0 0 –Configura os PWM’s no modo contínuo UP

0 1 –Configura os PWM’s no modo gatilho único

1 0 –Configura os PWM’s no modo contínuo UP/DOWN

1 1 –Configura os PWM’s no modo contínuo UP/DOWN

13

MODO CONTÍNUO UP:14

No modo contínuo UP o valor do registrador PTMR (contador) é incrementado de 1 até atingir o

valor do registrador PTPER. Quando isso ocorrer (PTMR=PTPER) é gerado um sinal de reset que reseta

o registrador PTMR iniciando-se um novo ciclo.

MODO CONTÍNUO UP/DOWN:15

No modo contínuo UP/DOWN o valor do registrador PTMR (contador) é incrementado de 1 até

atingir o valor do registrador PTPER. Quando isso ocorrer (PTMR=PTPER) o valor do registrador PTMR

passa a ser decrementado de 1 até atingir o valor 0, iniciando-se um novo ciclo.

REGISTRADOR PTCON1:

Bit 7 PTEN Habilita ou desabilita o clock do contador PTMR

0 –Desabilita o clock do contador PTMR

1 –Habilita o clock do contador PTMR

Bit 6 PTDIR Indica se o contador esta sendo incrementado ou decrementado

0 –O contador esta sendo incrementado

1 –O contador esta sendo decrementado

16

REGISTRADOR PWMCON0:

Bit 6-4 PWMEN2 : PWMEN0 Habilitam ou desabilitam a função de PWM dos pinos.

É através destes bits que configuramos se os pinos marcados ao lado terão função de PWM ou de I/O

0 0 0 –Desabilita a função de PWM de todos os pinos de PWM

0 0 1 –Habilita a função de PWM do pino PWM1

0 1 0 –Habilita a função de PWM dos pinos PWM0 e PWM1

0 1 1 –Habilita a função de PWM dos pinos de PWM0,PWM1, PWM2 e PWM3

1 0 0 –Habilita a função de PWM0. PWM1, PWM2, PWM3, PWM4, PWM5.

1 0 1 –Habilita a função de PWM de todos os pinos de PWM

1 1 0 –Habilita a função de PWM dos pinos PWM1 e PWM3

1 1 1 –Habilita a função de PWM dos pinos PWM1,PWM3 , PWM5, PWM7.

17

REGISTRADOR PWMCON0:

Bit 0 –PMOD0

Configura o modo como o par PWM1 e PWM0 irá trabalhar

1 –modo independente

0 –modo complementar

Bit 1 –PMOD1

Configura o modo como o par PWM3 e PWM2 irá trabalhar

1 –modo independente

0 –modo complementar

Bit 2 –PMOD2

Configura o modo como o par PWM5 e PWM4 irá trabalhar

1 –modo independente

0 –modo complementar

Bit 3 –PMOD3

Configura o modo como o par PWM6 e PWM7 irá trabalhar

1 –modo independente

0 –modo complementar

18

REGISTRADOR PWMCON0:

Modo independente:

É gerado um sinal de PWM nos pares de PWM com duty cicle conforme configurado no registrador

PDCx correspondente.

EXEMPLO:

19

REGISTRADOR PWMCON0:

Modo complementar

Os PWM’s 0,2 ,4 e 6 complementam o duty cicle de seus pares, PWM’s 1, 3 , 5 e 7

respectivamente.

EXEMPLO:

20

REGISTRADOR PWMCON1:

Bit 1 –UDIS

Habilita ou desabilita a atualização dos registradores de duty cicle (PDCx) e de período (PTPER)

1 –Desabilita a atualização dos registradores

0 –Habilita a atualização dos registradores

21

REGISTRADOR OVDCOND:

Bit 7-0 POVDx, onde x=0,1,2,3,4 ,5, 6,7

1 – Habilita PWM no pino equivalente;

0 – Desabilita PWM no pino equivalente. O Pino é controlado pelo registrador OVDCONS.

22

REGISTRADOR OVDCONS:

Bit 7-0 POUTx, onde x=0,1,2,3,4 ,5, 6,7

1 – Mantém pino em nível lógico alto;

0 – Mantém pino em nível lógico baixo.

23

EXEMPLO:

Quando um botão tipo push button for pressionado, gerar um sinal de PWM com DC de 80% e

fpwm=2kHz em PWM0:

#include<p18f4431.h>

void config_io(){

TRISA=0X01;ANSEL0=0X00;

}

void config_pwm(){

PTCON0=0X00;PTCON1=0X80;PWMCON0=0X5F;PWMCON1=0X00;PTPERL=1000;PTPERH=1000>>8;PDC0L=((int)(1000*0.80))<<2;PDC0H=((int)(1000*0.80))>>6;OVDCOND=0X00;OVDCONS=0X00;

}void main(){

OSCCON=0X72;config_io();config_pwm();while(1){

if(PORTAbits.RA0==1){

OVDCOND=0X01;}else{

OVDCOND=0X00;}

}

}

24

25

INTRODUÇÃO:A grande maioria de sensores industriais trabalham com sinais analógicos (4mA – 20mA; 0V –

10V; etc) e os microcontralodores trabalham utilizando elementos digitais. Para que esta integração possa se

realizar, efetuou-se a integração de um conversor analógico aos microcontroladores; tornando-os flexíveis

para o processamento de informações analógicas.

CONVERSOR A/D DO PIC 18F4431.

Este conversor possui 10 bits de resolução, contendo 9 entradas analógicas; tornando-se mais do

que suficiente para integração com sensores analógicos.

26

ESTRUTURA DO CONVERSOR A/D:27

ARQUITETURA DO CONVERSOR:28

CÁLCULO DA RESOLUÇÃO:Para trabalhar com o conversor, inicialmente tem-se que determinar o valor da resolução do

canal. Este resolução compreende a menor variação no sinal de entrada do PIC.

Onde n é o número de bits do conversor

RELAÇÃO DO SINAL ANALÓGICO COM O SINAL DIGITAL:Após a conversão do sinal analógico em digital, deve-se convertê-lo novamente para analógico

para facilitar o desenvolvimento da lógica de controle.

29

REGISTRADOR ADCON0:

Bit 5 –ACONV

1 –Habilita o modo loop contínuo.

0 –Habilita o modo gatilho único.

No modo loop contínuo, ao termino de um ciclo de conversão é iniciado outro automaticamente

No modo canal único o processo de conversão para assim que é terminado um ciclo Bit

Bit 4 –ACSCH

1 –Habilita o modo multicanal.

0 –Habilita o modo canal único.

No modo multicanal, mais de um canal é amostrado e convertido a cada ciclo de conversão

No modo canal único apenas um canal é amostrado e convertido a cada ciclo.

30

Bit 3-2 -ACMOD1:ACMOD0

Se ACSCH=1 (Modo multicanal habilitado)

00 –Dois canais são amostrados e convertidos sequencialmente

1ª amostragem/conversão: Canal do grupo A

2ª amostragem/conversão: Canal do grupo B

01 - Quatro canais são amostrados e convertidos sequencialmente

1ª amostragem/conversão: Canal do grupo A

2ª amostragem/conversão: Canal do grupo B

3ª amostragem/conversão: Canal do grupo C

4ª amostragem/conversão: Canal do grupo D

31

10 –Dois canais são amostrados simultaneamente e convertidos sequencialmente

1ª amostragem: Canal do grupo A e B

sequência de conversão: 1 a -Canal do grupo A

2a–Canal do grupo B

11 - Dois canais são amostrados simultaneamente e convertidos sequencialmente

1ª amostragem: Canal do grupo A e B

2ª amostragem: Canal do grupo C e D

sequência de conversão: 1ª- Canal do grupo A

2a–Canal do grupo B

3a–Canal do grupo C

4a -Canal do grupo D

32

Bit 3-2 -ACMOD1:ACMOD0

Se ACSCH=0 (Modo canal único habilitado)

00 –Canal do grupo A é amostrado e convertido

01 –Canal do grupo B é amostrado e convertido

10 –Canal do grupo C é amostrado e convertido

11 –Canal do grupo D é amostrado e convertido

Bit 1 -GO/DONE

1 –Inicia o ciclo de conversão e indica que o ciclo de conversão esta em andamento.

0 –Indica o termino do ciclo de conversão.

Quando setado, o ciclo de conversão é iniciado e este bit permanece em 1 enquanto o ciclo estiver em

andamento.

Quando o ciclo de conversão termina, o microcontrolador reseta este bit.

33

Bit 0 –ADON

1 –habilita o conversor A/D

0 –Desabilita o conversor A/D

34

REGISTRADOR ADCON1:

Bit 7-6 -VCFG1:VCFG0

Através desses dois bits selecionamos as tensões de referência, alta e baixa, do conversor A/D

00 –VREFH=AVDD, VREFL =AVSS

01 –VREFH=VREF+, VREFL =AVSS

10 –VREFH=AVDD, VREFL=VREF-

11 –VREFH =VREF+, VREFL=VREF-

Bit 4 –FIFOEN

1 -Habilita o FIFO

0 -Desabilita o FIFO

Se o FIFO estiver desabilitado o resultado das conversões são transferidos diretamente para o

registrador ADRES. Se o FIFO estiver habilitado, o resultado das conversões são armazenados nas posições

do FIFO e podem ser acessados efetuando a leitura do registrador ADRES

35

REGISTRADOR ADCON2:

Bit 7 -ADFM

1 –O resultado é alinhado a direita

0 –O resultado é alinhado a esquerda

36

ALINHAMENTO NO REGISTRADOR ADRES:

Dependendo do alinhamento escolhido, deve-se adotar as lógicas descritas acima para executar

a atribuição do valor convertido dentro da variável (que nesta aplicação recebe o nome de result).

37

REGISTRADOR ANSEL0:

Bit 7-0 -ANSx<0:7>

Através desses bits configura-se a função dos pinos do PORTA como entradas analógicas.

1 –O pino ANx será de entrada analógica

0 –O pino ANx será de entrada digital

38

REGISTRADOR ANSEL1:

Bit 8 –ANS8

1 –O pino AN8 será de entrada analógica

0 –O pino AN8 será de entrada digital

Este registrador é um complemento do registrador ANSEL0.

39

REGISTRADOR ADCHS:

Bit 2:3 –GCSEL0, GCSEL1

00 –Habilita entrada analógica AN2

01 –Habilita entrada analógica AN6

1X – Não utilizado

40

Bit 0:1 –GASEL0, GASEL1

00 –Habilita entrada analógica AN0

01 –Habilita entrada analógica AN4

10 - Habilita entrada analógica AN8

11 – Não utilizado

Bit 4:5 –GBSEL0, GBSEL1

00 –Habilita entrada analógica AN1

01 –Habilita entrada analógica AN5

1X – Não utilizado

Bit 6:7 –GDSEL0, GDSEL1

00 –Habilita entrada analógica AN3

01 –Habilita entrada analógica AN7

1X – Não utilizado

IMPORTANTE: Para trabalhar com entradas do mesmo grupo é necessário criar uma rotina temporizada para intercalar a amostragem de cada entrada e enviá-las às variáveis através do ADRES.

EXEMPLO DE CIRCUITO DE INTEGRAÇÃO:

Para trabalhar com sensores com variação inferior a 5V pode-se utilizar o seguinte circuito de

condicionamento:

Ganho de Tensão

Av = - Rf/Ri

No primeiro circuito inversor,

ajusta-se o sinal do sensor para

trabalhar de 0V à -5V e no

segundo circuito, transforma-se

o sinal para 0V à 5V. Atentar a

alimentação dos opamps que é

de -12V e +12V.

41

EXEMPLO DE CIRCUITO DE INTEGRAÇÃO:

Pode-se adotar a configuração não-inversora.

Ganho de Tensão

Av = 1 + (Rf/Ri)

De acordo com os resistores

utilizados transforma-se o sinal

para 0V à 5V. Atentar a

alimentação dos opamps que é

de +12V.

42

EXEMPLO DE CIRCUITO DE INTEGRAÇÃO:

Para trabalhar com sensores com variação de 4mA à 20mA pode-se utilizar o seguinte circuito

de integração:

Para transformar a variação de

Corrente em Tensão deve-se utilizar

este circuito que varia de 1V à 5V.

Por não se tratar de um sinal com

variação de 0V à 5V, deve-se

descontar esta diferença na lógica ou

na equação de controle.

43

EXEMPLO:

Quando um sensor de nível registrar um valor superior à 80 Litros, a bomba deverá parar:

Dados: Tanque 0L à 100L, sensor de 0V à 5V.

#include<p18f4431.h>

unsigned int vdig_an0;float vanal_an0;float nivel;

void config_ad(){

ANSEL0=0X01;ANSEL1=0X00;ADCON0=0X23;ADCON1=0X10;ADCON2=0X80;ADCHS=0X00;TRISD=0X00;

}void main(){

OSCCON=0X72;config_ad();while(1){

vdig_an0=ADRESH;

vdig_an0=vdig_an0<<8;vdig_an0+=ADRESL;vanal_an0=4.88e-3*vdig_an0; nivel= vanal_an0/0.05;

if(nivel < 80.0){

PORTD=0X01;}else if (nivel >= 80.0){

PORTD=0X00;}

}

}

44

45

46Projeto 1: Controle de Motor DC com L298

47Projeto 1: Controle de Motor DC com L298

#include<p18f4431.h>

void config_io(){

TRISA=0X03;ANSEL0=0X00;

}

void config_pwm(){

PTCON0=0X00;PTCON1=0X80;PWMCON0=0X5F;PWMCON1=0X00;PTPERL=2000;PTPERH=2000>>8;PDC0L=((int)(2000*0.75))<<2;PDC0H=((int)(2000*0.75))>>6;PDC1L=((int)(2000*0.25))<<2;PDC1H=((int)(2000*0.25))>>6;OVDCOND=0X00;OVDCONS=0X00;

}void main(){

OSCCON=0X72;config_io();config_pwm();while(1){if((PORTAbits.RA0==1)&&(PORTAbits.RA1==0))

{

OVDCOND=0X09;}

else if((PORTAbits.RA0==0)&&(PORTAbits.RA1==1)){

OVDCOND=0X06;}else{

OVDCOND=0X00;

}}

}

48Projeto 2: Semáforo Microcontrolado.

49Projeto 2: Semáforo Microcontrolado.

#include<p18f4431.h>#include<timers.h>#include<lcd_2x16.h>#include<stdlib.h>

unsigned int timer;unsigned int real_timer;unsigned char string[16];

void config_io(){

TRISC=0X00;PORTC=0X00;TRISD=0X00;PORTD=0X00;

}void lcd_tempo(){

lcd_posicao(1,5);imprime_string_lcd("SEMAFORO");itoa(real_timer,string);lcd_posicao(2,8);imprime_buffer_lcd(string,16); lcd_LD_cursor(0);

}void logica_semaforo(){

switch(real_timer){case 1:PORTC=0X04;break;case 20:PORTC=0X02;

break;case 22:PORTC=0x01;break;case 52:WriteTimer0(0);real_timer=0;break;}

}

void cont_tempo(){

timer=ReadTimer0();if(timer==15625){

real_timer++;WriteTimer0(0);lcd_tempo();

}}void main(){

OSCCON=0X72;config_io();lcd_inicia(0X28,0X0E,0X06);OpenTimer0(TIMER_INT_OFF &T0_16BIT &T0_SOURCE_INT &T0_PS_1_128);while(1){

cont_tempo();logica_semaforo();

}}

50

Projeto 3: Trabalhando com duas entradas analógicas do mesmo grupo .

51Projeto 3: Trabalhando com duas entradas analógicas do mesmo grupo .

#include<p18f4431.h>#include<timers.h>

unsigned int vdig, vdig1, timer;float vanal, vanal1;

void config_ad(){

ADCON0=0X27;ADCHS=0X00;ANSEL0=0XFF;ADCON1=0X10;ADCON2=0X80;TRISC=0X00;TRISD=0X00;

}

void main(){

OSCCON=0X72;config_ad();OpenTimer0(TIMER_INT_OFF

&T0_16BIT&T0_SOURCE_INT&T0_PS_1_128);

while(1){timer=ReadTimer0();if(timer<=1562){

ADCHS=0X00;vdig=ADRESH;vdig=vdig<<8;vdig+=ADRESL;

vanal=4.88e-3 * vdig;if(vanal>2.5){

PORTC=0X01;}else{

PORTC=0x00;}

}else if((timer>1562)&&(timer<=3124)){

ADCHS=0X10;vdig1=ADRESH;vdig1=vdig1<<8;vdig1+=ADRESL;vanal1=4.88e-3 * vdig1;if(vanal1>2.5){

PORTD=0X01;}else{

PORTD=0x00;}

}else if((timer>3124)&&(timer<=4686)){

WriteTimer0(0);timer=0;

}}}

52Projeto 4: Medidor de Temperatura.

53

#include<p18f4431.h>#include<lcd_2x16.h>#include<stdlib.h>#include<string.h>#include<delays.h>

float temp_int;float temp_dec;float temp;float vanal_an0;unsigned int vdig_an0;unsigned char string[16];unsigned char string_1[16];

void main(){

OSCCON=0X72;ANSEL0=0X01;ADCON0=0X23;ADCON1=0X00;ADCON2=0X80;ADCHS=0X00;TRISD=0X00;lcd_inicia(0x28,0x0E,0x06);while(1){vdig_an0=ADRESH;vdig_an0=vdig_an0<<8;vdig_an0+=ADRESL;vanal_an0=4.88e-3*vdig_an0;temp=vanal_an0/0.041666666;

temp_int=(int)temp; temp_dec=(temp-temp_int)*100; itoa(temp_int,string); strcatpgm2ram(string,","); itoa(temp_dec,string_1); strcat(string,string_1); strcatpgm2ram(string,”C");

lcd_posicao(1,1);imprime_string_lcd("TEMPERATURA");Delay10KTCYx(40);lcd_posicao(2,1);imprime_buffer_lcd(string,16);Delay10KTCYx(40); lcd_LD_cursor(0);Delay10KTCYx(40);}

}

Temperatura de 0ºC à 120ºCSensor de 0V à 1V

Projeto 4: Medidor de Temperatura.

54Projeto 5: Controle de Servo-motor.

55Projeto 5: Controle de Servo-motor (Transmissão).

#include<p18f4431.h>#include<usart.h>#include<stdlib.h>#include<lcd_2x16.h>

unsigned char x;unsigned char string[16];

void main(){

OSCCON=0X72;TRISA=0X03;ANSEL0=0X00;TRISD=0X00;lcd_inicia(0x28,0x0E,0x06);OpenUSART(USART_TX_INT_OFF

& USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH,25);

while(1){

lcd_posicao(1,2);imprime_string_lcd("CONTROL SERVO");lcd_posicao(2,1);imprime_string_lcd("POS: ");lcd_posicao(2,11);imprime_string_lcd("L: ");lcd_LD_cursor(0);

if((PORTAbits.RA0==1)&&(PORTAbits.RA1==0)){

x='a‘;

btoa(x,string);putsUSART(string);lcd_posicao(2,5);imprime_string_lcd("+90");lcd_posicao(2,13);imprime_string_lcd("L1");lcd_LD_cursor(0);

}else if((PORTAbits.RA0==0)&&(PORTAbits.RA1==1)){

x='b';btoa(x,string);putsUSART(string);lcd_posicao(2,5);imprime_string_lcd("-90");lcd_posicao(2,13);imprime_string_lcd("L2");lcd_LD_cursor(0);

}else{

x='c';btoa(x,string);putsUSART(string);lcd_posicao(2,5);imprime_string_lcd("0 ");lcd_posicao(2,13);imprime_string_lcd("L3");lcd_LD_cursor(0);

}}

}

56Projeto 5: Controle de Servo-motor (Recepção).

#include<p18f4431.h>#include<usart.h>#include<stdlib.h>

char x;unsigned char string[16];

void config_pwm(){

PTCON0=0X0C;PTCON1=0X80;PWMCON0=0X41;PWMCON1=0X00;PTPERL=625;PTPERH=625>>8;OVDCOND=0X00;OVDCONS=0X00;

} void main(){

OSCCON=0X72;config_pwm();OpenUSART(USART_TX_INT_OFF

& USART_RX_INT_OFF& USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH,25);

while(1){ getsUSART(string,16);x=atob(string);

if(x=='a'){PDC0L=((int)(625*0.10))<<2;PDC0H=((int)(625*0.10))>>6;OVDCOND=0X01;}if(x=='b'){PDC0L=((int)(625*0.05))<<2;PDC0H=((int)(625*0.05))>>6;OVDCOND=0X01;}if(x=='c'){PDC0L=((int)(625*0.075))<<2;PDC0H=((int)(625*0.075))>>6;OVDCOND=0X01;}

}}

57Projeto 6: Acionamento de Motor de Passo.

58Projeto 6: Acionamento de Motor de Passo.#include<p18f4431.h>#include<timers.h>#define S1 PORTAbits.RA0#define S2 PORTAbits.RA1

unsigned int timer, real_timer;

void config_io(){TRISA=0X03;ANSEL0=0X00;TRISD=0X00;}void stepmotor_clockwise(){timer=ReadTimer0();if(timer==3125) //intevalo de 200mseg{

real_timer++;WriteTimer0(0);

}switch(real_timer){

case 1:PORTD=0X01;break;case 2:PORTD=0X02;break;case 3:PORTD=0X04;break;case 4:PORTD=0X08;WriteTimer0(0);

real_timer=0;break;

}}

void stepmotor_anti_clockwise(){timer=ReadTimer0();if(timer==3125) //intevalo de 200mseg{

real_timer++;WriteTimer0(0);

}switch(real_timer){

case 1:PORTD=0X01;break;case 2:PORTD=0X08;break;case 3:PORTD=0X04;break;case 4:PORTD=0X02;WriteTimer0(0);real_timer=0;break;

}}void stepmotor_reset(){WriteTimer0(0);

PORTD=PORTD; //mantém na posição real_timer=real_timer; //mantém na posição}

void main(){OSCCON=0X72;config_io();OpenTimer0(TIMER_INT_OFF

&T0_16BIT &T0_SOURCE_INT &T0_PS_1_128);

while(1){if((S1==1)&&(S2==0)){

stepmotor_clockwise();}else if((S1==0)&&(S2==1)){

stepmotor_anti_clockwise();}else{

stepmotor_reset();}}}

59

Projeto 7: Controle de Motor DC por Rampa de Aceleração.

60Projeto 7: Controle de Motor DC por Rampa de Aceleração.#include<p18f4431.h>#define ON PORTAbits.RA0#define RESET PORTAbits.RA1

float mac_cicle=655e-6; //ciclo de máquina (2^16 /10MIPS)float time=6.0; //tempo de execução da rampa (ajustável)float regime=80.0; //fim da rampa (ajustável)float acel=0;float dc=0;

void config_io(){

TRISA=0X03;ANSEL0=0X00;

}void config_ramp(){

PTCON0=0X00;PTCON1=0X80;PWMCON0=0X47;PWMCON1=0X00;PTPERL=1000;PTPERH=1000>>8;PDC0L=0;PDC0H=0;OVDCOND=0X00;OVDCONS=0X00;regime=regime/100; acel=regime/time; //cálculo da aceleração

}void start_ramp_inc(){

dc=dc+(acel*mac_cicle); //cálculo para determinação do Duty cicleif(dc>=regime) //limitação do valor máximo da rampa

{acel=0;

}PDC0L=((int)(1000*dc))<<2;PDC0H=((int)(1000*dc))>>6;OVDCOND=0X01;

}void reset_ramp(){

PDC0L=0;PDC0H=0;OVDCOND=0X00;dc=0;acel=regime/time;

}void main(){

OSCCON=0X72;config_io();config_ramp(); //sub-rotina de configuração da rampawhile(1){

if((ON==1)&&(RESET==0)){

start_ramp_inc(); //sub-rotina de execução}else{

reset_ramp(); //sub-rotina de reset}

}}

61

Projeto 8: Rampa de aceleração manual.

62Projeto 8: Rampa de aceleração manual.#include<p18f4431.h>

unsigned int vdig;float vanal;float acel;

void config_ad(){

ADCON0=0X23;ADCON1=0X10;ADCON2=0X80;ADCHS=0X00;ANSEL0=0X01;ANSEL1=0X00;

}

void config_pwm(){

PTCON0=0X00;PTCON1=0X80;PWMCON0=0X51;PWMCON1=0X00;PTPERL=1000;PTPERH=1000>>8;PDC0L=0;PDC0H=0;OVDCOND=0X00;OVDCONS=0X00;

}

void main(){

OSCCON=0X72;config_ad();config_pwm();while(1){

vdig=ADRESH;vdig=vdig<<8;vdig+=ADRESL;vanal=4.88e-3*vdig;acel=vanal/5;

PDC0L=((int)(1000*acel))<<2;PDC0H=((int)(1000*acel))>>6;OVDCOND=0X01;

}}

63

Projeto 9: Geração de um sinal de PWM através do módulo de Timer.

// Frequencia do sinal de PWM = 2kHz (500useg) com 80% de Duty Cicle

#include<p18f4431.h>#include<timers.h>

unsigned int timer;

void config_io(){

TRISA=0X01;TRISC=0X00;ANSEL0=0X00;

}

void main(){

OSCCON=0X72;config_io();OpenTimer0(TIMER_INT_OFF

&T0_16BIT&T0_SOURCE_INT&T0_PS_1_1);

while(1){if(PORTAbits.RA0==1){timer=ReadTimer0();if(timer<=800) // 400useg{PORTC=0x01;}else if((timer>800)&&(timer<1000)) // (400useg + 100useg){PORTC=0X00;}

else if(timer>=1000) // em 500useg reinicia o sinal{

WriteTimer0(0);}

}else

{WriteTimer0(0);timer=0;PORTC=0X00;

}}

}

64Projeto 9: Geração de um sinal de PWM através do módulo de Timer.

ROSA. Fabiano Camargo. Apostila de Microcontroladores II. Universidade de Mogi das Cruzes. 2008.

SANCHES. João. Apostila de Microcontroladores I. Universidade de Mogi das Cruzes. 2007.

MIYADAIRA, Alberto Noboru. Microcontroladores PIC18: aprenda e programe em linguagem C. Ed Érica. 3 ed. São Paulo. 2012.

Microchip C18 Libraries. MICROCHIP.

DATASHEET. MICROCHIP PIC18F4431.

65