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
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
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
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
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
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;
}}
}
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();
}}
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;
}}}
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.
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;}
}}
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();}}}
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}
}}
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;
}}
// 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