Olá pessoal,
Para quem curte o assunto controle motor, segue dois link de arquivos bastante relevantes ao assunto:
http://epubl.ltu.se/1402-1617/2005/303/LTU-EX-05303-SE.pdf
http://www.oldfordcrewcabs.com/public_pdf/Book%20-%20Understanding%20Automotive%20Electronics%20(Newnes).pdf
Boa leitura ;-)
Engineering in House
Porque engenharia é muito mais do que passar a vida editando uma planilha de Excel.
quinta-feira, 27 de agosto de 2015
quarta-feira, 26 de agosto de 2015
Comando Serial I
Este exemplo tem como objetivo mostrar como podemos controlar a velocidade de piscada do led usando comando pela USB do micro em uma placa de desenvolvimento.
Supondo que queremos controlar a abertura dos injetores de um veículo que seque a sequencia 1-3-4-2 usando os leds 1 3 5 e 6.
O valor enviado é guardado dentro da EEPROM do micro, e depois lido pela lógica para controlar o comando de tempo delay_ms
Para enviar os códigos, usei o programa de envio de informações pela Serial ACE Pic
(o link esta no post que fiz neste blog em agosto 2015 - ferramental)
O envio de comando se faz na seguinte maneira:
(w - para escrever) + (0 - endereço da EEPROM) + ( d - valor)
Lembrando também que os caracteres são enviados em ASCII, ou seja:
w - equivale a 0x77 em hexadecimal ASCII
0 - equivale a 0x30 em hexadecimal ASCII
d - equivale a 0x64 em hexadecimal ASCII
A leitura do endereço da EEPROM se faz da seguinte maneira:
(r - desejo de ler a memória) + (0 - endereço da EEPROM que se quer ler)
O código principal:
#include "C:\Users\main.h"
#priority int_RDA //Da prioridade a interrupção da porta serial
char resp=0;
char rec[3];
char end,cal,sw;
int a;
int temp_inj=1000; //Valor inicial do tempo de injeção (um segundo)
#int_RDA //interrupção pela porta serial
void trata_serial()
{
gets(rec); //Pega os bytes vindos da serial
sw=rec[0]; //aramazena o primeiro byte relativo ao comando (w - escreve / r - lê a EEPROM)
printf("%c",'s'); //Devolve na serial que "s" (sim) para avisar que a interrupção foi ativada
if(sw=='r')
{
end = rec[1]; //Armazena o endereo da EEPROM que se quer ler
cal = read_eeprom(end); //Armazena o valor lido noendereço "end" excrever da EEPROM
printf("%c",cal); //Envia para serial o valor lido "cal" no endereço "end"
}
if(sw=='w') // Write EEprom
{
end = rec[1]; //Armazena o endereo da EEPROM que se quer escrever
cal = rec[2]; //Armazena o valor que se quer excrever na EEPROM
write_eeprom(end,cal); //escreve no endereço "end" da EEPROM o valor armazenado na variável "cal"
resp=read_eeprom(end); //Lê o endereço "end" da EEPROM e armazena na variável resp
printf("%c",resp);
}
}
//Incia bloco principal
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_Vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
temp_inj=read_eeprom(0x30); //Carrega valor desejado de tempo de injeção da do endereço (0x30)h da EEPROM
while(true)
{
temp_inj=read_eeprom(0x30); //Atualiza a variável
//sequencia de injeção 1 - 3 - 4 - 2
//Injetor 1
output_high(pin_d0); //abre injetor 1
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d0); //Fecha injetor 1
//Injetor3
output_high(pin_d4); //abre injetor 3
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d4); //Fecha injetor 3
//Injetor4
output_high(pin_d6); //abre injetor 4
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d6); //Fecha injetor 4
//Injetor2
output_high(pin_d2); //abre injetor 2
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d2); //Fecha injetor 2
//printf("%c",temp_inj);
}
}
ARQUIVO main.h
#include <18F4550.h>
//#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV1 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#FUSES ICPRT //ICPRT enabled
#use delay(clock=8000000)
#use rs232(baud=256000,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
Supondo que queremos controlar a abertura dos injetores de um veículo que seque a sequencia 1-3-4-2 usando os leds 1 3 5 e 6.
O valor enviado é guardado dentro da EEPROM do micro, e depois lido pela lógica para controlar o comando de tempo delay_ms
Para enviar os códigos, usei o programa de envio de informações pela Serial ACE Pic
(o link esta no post que fiz neste blog em agosto 2015 - ferramental)
O envio de comando se faz na seguinte maneira:
(w - para escrever) + (0 - endereço da EEPROM) + ( d - valor)
Lembrando também que os caracteres são enviados em ASCII, ou seja:
w - equivale a 0x77 em hexadecimal ASCII
0 - equivale a 0x30 em hexadecimal ASCII
d - equivale a 0x64 em hexadecimal ASCII
A leitura do endereço da EEPROM se faz da seguinte maneira:
(r - desejo de ler a memória) + (0 - endereço da EEPROM que se quer ler)
O código principal:
#include "C:\Users\main.h"
#priority int_RDA //Da prioridade a interrupção da porta serial
char resp=0;
char rec[3];
char end,cal,sw;
int a;
int temp_inj=1000; //Valor inicial do tempo de injeção (um segundo)
#int_RDA //interrupção pela porta serial
void trata_serial()
{
gets(rec); //Pega os bytes vindos da serial
sw=rec[0]; //aramazena o primeiro byte relativo ao comando (w - escreve / r - lê a EEPROM)
printf("%c",'s'); //Devolve na serial que "s" (sim) para avisar que a interrupção foi ativada
if(sw=='r')
{
end = rec[1]; //Armazena o endereo da EEPROM que se quer ler
cal = read_eeprom(end); //Armazena o valor lido noendereço "end" excrever da EEPROM
printf("%c",cal); //Envia para serial o valor lido "cal" no endereço "end"
}
if(sw=='w') // Write EEprom
{
end = rec[1]; //Armazena o endereo da EEPROM que se quer escrever
cal = rec[2]; //Armazena o valor que se quer excrever na EEPROM
write_eeprom(end,cal); //escreve no endereço "end" da EEPROM o valor armazenado na variável "cal"
resp=read_eeprom(end); //Lê o endereço "end" da EEPROM e armazena na variável resp
printf("%c",resp);
}
}
//Incia bloco principal
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_Vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
temp_inj=read_eeprom(0x30); //Carrega valor desejado de tempo de injeção da do endereço (0x30)h da EEPROM
while(true)
{
temp_inj=read_eeprom(0x30); //Atualiza a variável
//sequencia de injeção 1 - 3 - 4 - 2
//Injetor 1
output_high(pin_d0); //abre injetor 1
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d0); //Fecha injetor 1
//Injetor3
output_high(pin_d4); //abre injetor 3
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d4); //Fecha injetor 3
//Injetor4
output_high(pin_d6); //abre injetor 4
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d6); //Fecha injetor 4
//Injetor2
output_high(pin_d2); //abre injetor 2
delay_ms(temp_inj); //carrega o tempo de abertura desejado
output_low(pin_d2); //Fecha injetor 2
//printf("%c",temp_inj);
}
}
ARQUIVO main.h
#include <18F4550.h>
//#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV1 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#FUSES ICPRT //ICPRT enabled
#use delay(clock=8000000)
#use rs232(baud=256000,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
sábado, 22 de agosto de 2015
Injeção Eletrônica
Esse é o projeto de formatura de um grupo de alunos que tive o prazer de orientar. Trata-se de um motor de pouco mais de 6 HP injetado com o coletor de uma CG 150 e controlado com um Pic 18F4550 com todo o software feito em linguagem C.
O sistema era baseado no clássico Speed Density, onde se lê a pressão e a temperatura do ar no coletor e se calcula o tempo de injeção. Temperatura do motor e rpm também eram lidos e entravam na cadeia de cálculo do tempo de injeção.
Por fim, o motor depois foi instalado em um kart onde funcionou como esperado.
Valores dos Resistores
A tabela abaixo mostra as bases, cujo os valores nominais são seus múltiplos e submúltiplos. Comercialmente, esses valores servem somente para resistores de 2%, 5%, 10% ou 20% de tolerância
10
|
11
|
12
|
13
|
15
|
16
|
18
|
20
|
22
|
24
|
27
|
30
|
33
|
36
|
39
|
43
|
47
|
51
|
56
|
62
|
68
|
75
|
82
|
91
|
Antena "L"
Este esboço eu desenhei baseado em vários exemplos desse projeto que fui encontrando pela internet. Caso você tenha os cálculos ou referências bibliograficas, por favor entre em contato comigo.
Oscilador 555
Este circuito integrado foi desenvolvido no começo dos anos 70 e ganhou o nome de temporizador 555. Este temporizador é um CI barato estável e de muito fácil configuração. No início era usado apenas em operações monoestáveis e astáveis, mas posteriormente uma grande quantidade de circuitos foi desenvolvido com base neste circuito integrado.
O encapsulamento mais usual do CI 555 tem 8 pinos, A figura 1 mostra a vista em planta do CI mostrando a função de cada pino
O circuito multivibrador astável é um circuito que opera em duas situações, permanecendo um determinado intervalo de tempo em nível alto (1) e nível baixo (0). A figura 2 mostra como se comporta o sinal de saída do 555
Com isso, obtemos um gerador de onda quadrada. Este tipo de sinal é largamente usado para a construção de relógios (clock) de sincronismo A montagem do CI 555 para este fim pode ser vista abaixo:
Os resistores Ra, Rb e o capacitor C poderão ser dimensionados de acordo com o tempo que se quer que ele permaneça em nível alto (T1) e nível baixo (T2) através das relações:
Com esses valores podemos determinar a freqüência de operação do astável, já que T (período) será igual a soma T1 + T2, e como freqüência é o inverso do período temos que:
Outra definição usada em projeto é a do ciclo de operação (D) do astável que poderá ser calculada através das seguintes fórmulas:
Um outro detalhe prático para projeto é que se define um valor fixo para o capacitor C, e a partir daí dimensionamos Ra e Rb, de acordo com a freqüência e o tempo em nível alto ou nível baixo que se deseja.
O encapsulamento mais usual do CI 555 tem 8 pinos, A figura 1 mostra a vista em planta do CI mostrando a função de cada pino
Figura 1 - Pinagem do 555
O circuito multivibrador astável é um circuito que opera em duas situações, permanecendo um determinado intervalo de tempo em nível alto (1) e nível baixo (0). A figura 2 mostra como se comporta o sinal de saída do 555
Figura 2 - Forma de onda obtida no pino 3
Com isso, obtemos um gerador de onda quadrada. Este tipo de sinal é largamente usado para a construção de relógios (clock) de sincronismo A montagem do CI 555 para este fim pode ser vista abaixo:
Figura 3 - Configuração do 555
Os resistores Ra, Rb e o capacitor C poderão ser dimensionados de acordo com o tempo que se quer que ele permaneça em nível alto (T1) e nível baixo (T2) através das relações:
T1= 0,69 x (Ra + Rb) x C
T2 = 0,69 x (Rb) x C
Com esses valores podemos determinar a freqüência de operação do astável, já que T (período) será igual a soma T1 + T2, e como freqüência é o inverso do período temos que:
F = 1/T
Outra definição usada em projeto é a do ciclo de operação (D) do astável que poderá ser calculada através das seguintes fórmulas:
D = T1/T
D = (Ra + Rb) / (Ra + (2 x Rb))
Um outro detalhe prático para projeto é que se define um valor fixo para o capacitor C, e a partir daí dimensionamos Ra e Rb, de acordo com a freqüência e o tempo em nível alto ou nível baixo que se deseja.
Assinar:
Postagens (Atom)