Relatório 3 Eletrônica Felipe Paulo Tavares Thiago Aurélio Gustavo Gonçalves
Resumo Este relatório consiste em apresentar o que foi feito durante o mês de dezembro pelo sub-grupo de eletrônica da equipe Quebramato Baja. O relatório contém o que foi desenvolvido por cada membro do subgrupo e atesta que está em ordem ao cronograma apresentado.
Introdução Durante o mês foi posto em prática o cronograma. Foi desenvolvido os circuitos de condicionamento de sinal dos sensores. Circuito de alimentação. Circuito do micro controlador e a base do processamento de dados.
Desenvolvimento Circuitos de alimentação
Figura 1 Circuito alimentação
Lista do componentes Capacitores ---------1 C1 1 C2
330n 100n
Circuitos integrados ------------------1 U1 7805
Circuitos de condicionador de sinais Condicionador de sinais do conta giros
Figura 2 Circuito Conta-Giros
Sinal do Osciloscópio simulado
Figura 3 Simulação Osciloscópio
Cada quadrado de altura representa uma amplitude de 5v e cada quadrado de largura representa um período de 10ms. O sinal de amarelo tem uma amplitude de 10v e uma frequência de 50hz e representa o sinal que sai do cabo do mata motor. O sinal azul é a saída do circuito depois de passar pelo comparador e pelo filtro de passa baixa. O comparador tem a função de aumentar ampliar o sinal de entrada do cabo do mata motor. O filtro de passa baixa tem a função de filtrar ruídos cuja frequência ultrapasse 120hz, assim. O cabo do mata motor irá onde está no circuito acima escrito MOTOR, o diodo foi necessário para bloquear o pico de tensão negativa.
Lista de componentes Resistores --------1 R3 2 R11,R12 1 R13
10k 1k 22k
Capacitores ---------1 C4
330n
Circuitos integrados ------------------1 U1
LM324
Diodos -----1 D1
1N4148
Circuito condicionador de sinal do sensor de temperatura
Figura 4 Circuito LM35
O condicionador de sinal de temperatura é composto de um amplificador de sinal. Na temperatura máxima do CI LM35 a tensão de saída é 4.88v A sua alimentação é feita com 5 volts e a alimentação do amplificador operacional é de 12v
Lista de materiais Resistors --------1 R7 2.2k 2 R8,R9 1k Capacitors ---------1 C3
1nF
Integrated Circuits ------------------1 U1 LM324 1 U5 LM35
Circuito do módulo de Transmissão de dados, Acelerômetro e Sensor HALL Os sensores não podem ser simulados com o software atualmente utilizado PROTEUS ISIS. Não módulos com características únicas. A alimentação desses módulos é 5v e a forma de comunicação com o micro controlador é através de protocolos. SPI, I2C ou UART. Mais abaixo será tratado o funcionamento e a implantação desses módulos
Circuito do micro controlador
Figura 5 Circuito Micro Controlador
O circuito do micro controlador necessita de um cristal de 20MHZ e um conector para o ICSP que significa In-Circuit Serial Programming. O ICSP permite ao programador atualizar o firmware do micro sem precisar retirá-lo da placa.
Lista de materiais Capacitores ---------2 C1,C2
22p
Circuitos Integrados ------------------1 U1 PIC16F877A Outros ------------1 J1 1 X1
ICSP Crystal
Programação I2C O protocolo I2C descreve o funcionamento de um barramento de comunicação serial que utiliza apenas dois fios, inventado pela Philips no início da década de 90, este protocolo é muito utilizado para conectar periféricos de baixa velocidade a placas-mãe, micro controladores e afins. Tanto a unidade de controle quanto os periféricos devem possuir implementação e suporte I2C, seja via hardware no próprio SoC ou utilizando CI’s externos como o SC16IS750, ou até mesmo via software, através de um método chamado bit-bang, onde o funcionamento do protocolo é emulado bit a bit. O barramento I2C é composto de dois fios, SDA e SCL, e alimentação (VDD), tipicamente de 3.3V ou 5V. Os fios de comunicação possuem pull-ups, como pode ser visto na figura abaixo: O número de “nós” em um único barramento é limitado tanto pelo tamanho do endereço, que pode ser de 7 bits, 10 bits e até 16 bits; como por restrição de espaço, já que não se pode ultrapassar poucos metros de fios, pois a capacitância total máxima, algo em torno de 400pf, impede o funcionamento correto do barramento.
Figura 6 Diagrama I2C
SPI O SPI (Serial Peripheral Interface) foi originalmente desenvolvido pela Motorola nos últimos anos do micro controlador 80 para sua série 68000. Devido à simplicidade e popularidade do barramento, muitos outros fabricantes adotaram o padrão ao longo dos anos. Agora pode-se encontrar uma grande variedade de componentes usados no projeto de sistemas embarcados. O barramento SPI é usado principalmente nos micro controladores e seus dispositivos periféricos imediatos. É comumente encontrado em telefones celulares, PDAs e outros dispositivos móveis que comunicam dados entre a CPU, teclado, tela e chips de memória. O Barramento SPI consiste em três linhas de transmissão de informações de 8 bits. Cada uma destas três linhas contêm a informação entre os diferentes dispositivos conectados ao barramento. Ele é tipo Full-duplex que é um modo de operação onde dados podem ser transmitidos e recebidos simultaneamente. Os dispositivos conectados ao barramento são definidos como master e slaves. Master é aquele que inicia a transferência de informação para o barramento e gera sinais de clock e de controle. Slave é um dispositivo controlado pelo master. Cada Slave é controlado por um barramento através de uma seletor de linhas chamado Chip Select(CS) ou Select Slave(SS), portanto o Slave é ativado somente quando esta linha for selecionada.
Figura 7 Diagrama SPI
Firmware /*=============================================================== Datalogger - Equipe Quebramato MiniBaja - CEFET - MG Autor: Felipe Paulo Função do programa: O programa irá rodar em um PIC16F877A e sua função é captar dados de sensores e enviá-los para um painel e também para um modulo wireless. Os dados têm a função de informar ao piloto do carro e também para a equipe de manutenção as condições em que o carro se encontra. O
software abaixo contém a programação de um LCD 16x02. O motivo é a melhora visualização dos dados recebidos, enquanto o layout do painel vai sendo desenvolvido. =================================================================*/
//Pinagem LCD sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB2_bit; sbit LCD_D5 at RB3_bit; sbit LCD_D6 at RB4_bit; sbit LCD_D7 at RB5_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB2_bit; sbit LCD_D5_Direction at TRISB3_bit; sbit LCD_D6_Direction at TRISB4_bit; sbit LCD_D7_Direction at TRISB5_bit; // Conexão SPI sbit Chip_Select at RD0_bit; sbit Chip_Select_Direction at TRISC0_bit; // ---//Software I2C sbit Soft_I2C_Scl at RC1_bit; sbit Soft_I2C_Sda at RC0_bit; sbit Soft_I2C_Scl_Direction at TRISC1_bit; sbit Soft_I2C_Sda_Direction at TRISC0_bit; //Variáveis para as bases de tempo // Bit Field para os flags struct{ unsigned int us100:1; unsigned int ms1:1; unsigned int ms10:1; unsigned int ms100:1; unsigned int s1:1; }time; unsigned int countms1=0; unsigned int countms10=0; unsigned int countms100=0; unsigned int counts1=0; //========================= //Variaveis CONTA-GIROS unsigned int pulsos=0; //Variais SPI unsigned short readspi; //Variaveis ADC unsigned int ADC_tmp=0; //Arrays para o LCD unsigned char pulsoread[6]; unsigned char adcread[7];
unsigned char spiread[8]; unsigned char i2cread[8]; //Função que inicializa o timer void InitTimer1(){ T1CON = 0b00001001; // Prescaler 1:8 , Ocillator = 1, Internal CLOCK, Enables Timer TMR1IF_bit = 0; //Limpa o Flag da interrupção TMR1IE_bit = 1; // Habilita a interrupção TMR1H = 0xFF; //Seta os 4 bits mais significativos do timer TMR1L = 0x17; // Seta os 4 bits menos significativos do timer TMR1ON_bit = 1; //INTCON habilita as interrupção dos periféricos INTCON = 0b11000000; //Estão habilitadas GIE e PEIE ADCON0=0b00000101; } //Função que é chamada a cada 100us, que é o tempo configurado no timer void Interrupt(){ if (TMR1IF_bit){ TMR1IF_bit = 0; // Limpa o FLAG da interrupção TMR1H = 0xFF; //Reinicia o tempo do timer TMR1L = 0x17; //Reinicia o tempo do timer //Abaixo o código irá incrementar variáveis para gerar novas bases de tempo countms1++; if(countms1==10){ //1ms time.ms1=1; countms1=0; countms10++; } if(countms10==10){ //10ms countms10=0; countms100++; time.ms10=1; } if(countms100==10){ //100ms countms100=0; time.ms100=1; counts1++; } if(counts1==10){ //1s counts1=0; time.s1=1; }
time.us100=1;
//100us
} } //Obtem o valor em um endereço. Para fazer a //leitura é necessário escrever o endereço que //ela ocorre, depois ler unsigned short get_value() { Chip_Select = 1; //Habilita o dispositivo spi1_write(0x02); // Selecciona o endereço do registro que vai ser lido readspi = spi1_read(0x00); // lê os bytes Chip_Select =0; //Desabilita o dispositivo return readspi; } void main() { PORTB = 0b00000000; // 1 - Nivel alto, 0 - Baixo TRISB = 0b00000000; // 0 - Saida 1 - Entrada TRISA = 0xFF; // PORTA é entrada TRISD = 0x00; PORTD = 0x00; OPTION_REG=0b10111011; //Configuração Timer InitTimer1(); //Configuração ADC ADCON1 = 0x0E; ADC_Init(); //Configuração LCD Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); //Configuração SPI TRISC.F3 = 0; //SCK Master mode TRISC.F5 = 0; //Configura SDO como output TRISC.F4 = 1; //Configura SDI como input Chip_Select_Direction = 0; //CS as output Chip_Select = 0; // Deseleciona TC72 SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4
, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_HIGH_2_LOW); Chip_Select = 1;//Seleciona o dispositivo spi1_write(0x80); //Acessa o controle de registos spi1_write(0x04); //Define medição constante Delay_ms(150); // Espera um tempo para as leituras começarem Chip_Select = 0; //Desabilita o dispositivo //Laço principal do programa onde todo o conteúdo ficará while(1){ if(time.us100){ time.us100=0; } if(time.ms1){ time.ms1=0; } if(time.ms10){ time.ms10=0; } if(time.ms100){ time.ms100=0; Lcd_Out(1,5,i2cread); ADC_tmp = ADC_Get_Sample(0)*0.1523; //Faz a leitura do ADC intToStr(ADC_tmp, adcread); //Converte o int em char Lcd_Out(2,1,adcread); // Mostra no LCD bytetostr(get_value(), spiread); //Pega o valor do SPI e converte para char Lcd_Out(2,8,spiread); //Mostra no LCD if(time.s1){ time.s1=0; pulsos=TMR0*120; //Captura o valor de TMR0 //Que é a quantidade de pulsos //Obtidos na entrada e multiplica do 120 //Para obter os RPM IntToStr(pulsos, pulsoread); //Converte para char Lcd_Out(1,1,pulsoread); //Mostra no LCD TMR0=0; //Limpa o registro
} }
} }