quinta-feira, 27 de agosto de 2015

Controle motor

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 ;-)

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)

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. 




Tabela ASCII



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

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.