quarta-feira, 4 de dezembro de 2013

Gerando 13000V com o pic 12F675

       Um dia meu carro deu um problema na bobina(mas sabemos que dificilmente essas bobinas queimam de verdade o que acontece é defeitos no circuito de acionamento) então pensei em demostrar como gerar altas tensões utilizando um microcontrolador PIC de 8 pinos (12F675) , vale lembra que eu aproveitei o circuito já existente(pois o único defeito dessa bobina eram os fios de ligação aos terminais que estavam todos ressecados e dobradiços devido ao calor do motor do carro),na figura abaixo é demostrado a bobina do corsa:
        Para fazer o acionamento desta bobina é preciso saber quais os terminais desta placa será utilizado, então veja a descrição na figura a seguir:


       Os sinais que vem do modulo de gerenciamento central do carro são aplicados nas entrada in1 e in2, out1 e out2 vão para os terminais da bobina e o +12V vai ao outro terminal da bobina e a placa de controle e por fim o GND que também vai a esta placa.Depois de saber onde colocar o sinal que vira do microcontrolador montei um circuito para acionar e refiz algumas interligação da placa aos terminais da bobina ficando assim:

     O esquemático do circuito que fiz é este:
       O circuito é muito simples coloquei um led para indicar cada vez que pressiono um dos botões e caso eu fique com ele pressionado o valor da largura de pulso aumenta ou diminue enquanto manter este pressionado,no pino GP2 sai o sinal que será aplicado ao circuito de controle da bobina(que nada mais é do que um drive que aciona 2 IGBTs que mandam o pulso ao transformador da bobina).vou mostrar o vídeo que está disponível no you tube e logo em seguida o código fonte do circuito:

      O código fonte:

/*
 *                       Gerando altas tensões com uma bobina
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 12F675
 * Autor: aguivone
 * Versão: 1
 * data: 04/12/2013
*/ #include <stdio.h> #include <stdlib.h> #include <xc.h> /////////////////////////////////////////////////////////configuraçôes////////////////////////////////////////////////// #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled) #pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = ON // Data Code Protection bit (Data memory code protection is enabled) //////////////////////////////////////////////////////Rotina principal/////////////////////////////////////////////////////////////// delay_ms(long t)//tempo aproximado {//aqui está usado o clock interno long temp=0; int conta=0; while(temp < t) { conta=0; while(conta<40) { conta++; } temp++; } } void main(void) { TRISIO = 0X03;//configura gp1 e gp2 como entrada CMCON = 7;//desabilita comparadores ANSEL = 0;//habilita as portas de I/O int tempo=1; for(;;) { if(GP0 == 0) { delay_ms(100);//debounce do botão(filtro) if(GP0 == 0) { while(GP0 == 0)//enquanto botão pressionado incrementa { tempo++; delay_ms(100);//debounce do botão(filtro) GP4 = !GP4;//alterna led a cada incremento if(tempo>50) { tempo = 1;//limita valor maximo para 50 } } GP4 = 0; } } if(GP1 == 0) { delay_ms(100);//debounce do botão(filtro) if(GP1 == 0) { while(GP1 == 0)//enquanto botão pressionado decrementa { tempo--; delay_ms(100);//debounce do botão(filtro) GP4 = !GP4;//alterna led a cada decremento if(tempo<1) { tempo = 10;//limita valor minimo para 1 } } GP4 =0; } } GP2 = 1; delay_ms(tempo); GP2 = 0; delay_ms(1000); }//loop infinito }