CONTROLANDO CARGAS EM CORRENTE CONTÍNUA (CC) COM POTENCIÔMETRO (MODO PWM-0 A 100% VIA COMPARADOR INTERNO)- COM PIC 12F675 (REF165)

Gostaria de outra opção de controle PWM para cargas CC como lâmpadas, fitas de led, motores de ventiladores automotivos,etc?

Você poderia controlar melhor o seu ventilador de 12 volts da cabine de seu caminhão? Ou ajustar a iluminação de fundos de um mostruário que usa fitas de led? Com um pequeno pic e alguns resistores podemos fazer um controlador simples tendo como controle apenas um potenciômetro comum.
Veja o esquema elétrico abaixo:

Podemos usar um circuito analógico (ci 555 por exemplo) ou então usar um microcontrolador para gerar o PWM. Quando usamos um potenciômetro como controle, é preferível usar um microcontrolador que já tenha internamente um conversor analógico/Digital e se possível, que tenha também um módulo PWM. Já foi inclusive publicado um anterior artigo sobre este tema, de nome ‘CONTROLE DE LUMINOSIDADE (DIMMER) PARA LEDS RGB INDIVIDUAIS OU FITAS DE LEDS – COM PIC 16F676 (REF 160)’ que usa o método do PWM.

Mas se não dispor de tal microcontrolador? Talvez tenha que usar um pequeno pic de 8 pinos ou mesmo um microcontrolador mais antigo de outra família?
Poderá implementar via software este PWM. Com ajuda de apenas um comparador interno é possível obter um PWM para fins de controle de carga.
Basta compararmos a tensão da entrada inversora ligada a um capacitor em carga por meio de um resistor ao +vcc (rampa) contra a tensão do terminal central de um potenciômetro de controle ligado na entrada não-inversora do comparador.
O processo é o seguinte:
1) Descarregue o capacitor gerador da rampa. Para isto, faça o port se tornar uma saída ligada ao gnd (0).
2) Volte o port a ser entrada inversora e compare com a entrada normal ligada ao potenciômetro. Isto ocorre de forma automática, pois a saída do comparador já é a saída do PWM.
3) Faça um ‘delay’ cujo tempo permita a carga do capacitor até o valor do +vcc (obtido de forma experimental, por tentativa e erro, o valor de 2 milissegundos para o capacitor 10nF + resistor de 100k).
4) Volte ao passo n.1 por meio de um ‘loop’ de repetição.

Se o ‘cursor’ do potenciômetro estiver com 5 volts, o ciclo será 100% ligado. Se for 2,5 volts, então teremos 50% ligado. E assim, para cada valor teremos um percentual de tempo ligado na saída.

É possível usar o timer 0 para realizar a descarga do capacitor, automatizando ainda mais o processo. Assim, fazendo o timer 0 gerar uma interrupção a cada 2 ms, teremos o mesmo resultado. Na rotina de interrupção apenas descarregamos o capacitor.

Como já foi citado, este circuito poderá ser usado para controlar a velocidade de pequenos motores CC, resistências de aquecimento, lâmpadas e até mesmo a intensidade de iluminação de fitas de leds.
Obs. Esta montagem é apenas didática, sendo apenas testada em placa de protoboard, sujeita a bug’s ainda não observados nos testes.

Segue pasta com os arquivos para a montagem, sendo que tem as 2 versões disponíveis, uma com interrupção e outra sem interrupção:

pwm_comp

Caso deseje uma versão PWM com apenas 2 chaves dactilares para controlar a saída, poderá usar os arquivos abaixo. Na pasta postada em 09/08/2016, tem a versão normal que perde a informação ao desligar a alimentação e a versão com salvamento na EEprom interna do último ajuste:

PWM_SW_FILES

Manuais:

PIC12f675

Curiosidades:
Como a vida se originou?
O túnel rodoviário mais comprido do mundo
Do script para as telas
O uso do azeite nos tempos antigos
A arca de Noé e a arquitetura naval
O Alhambra — jóia islâmica de Granada
O que fazer para dormir melhor
Retratos de famosos e de criminosos
Atenas: passado glorioso e futuro incerto
Museus — lugares interessantes para visitar

Outros assuntos:
Como controlar um temperamento explosivo
Mudanças que os filhos trazem ao casamento
O que posso fazer para não ficar tão triste?
Como chegar a um acordo
Como ser um bom ouvinte
Será que a Bíblia está de acordo com a ciência?

Até o próximo artigo!

28 comments on “CONTROLANDO CARGAS EM CORRENTE CONTÍNUA (CC) COM POTENCIÔMETRO (MODO PWM-0 A 100% VIA COMPARADOR INTERNO)- COM PIC 12F675 (REF165)

  1. Bom dia Cláudio, preciso fazer um pwm com potenciômetro, porém, gostaria de fazer no 16f628a, vou colocar um lcd.
    Preciso que o código seja em c, assembler não domino muito bem, uso o ccs.
    Obrigado.

    Ronildo.

    1. Olá Ronyfreytas!
      Creio que existam vários sites que tratam de pwm com pic 16f628a que poderão ajuda-lo no seu projeto. Esse pwm será para controlar servos motores? Ou obter um nível de DC? O que mostrará o Lcd especificamente? Como seria usado este seu projeto?
      Cláudio

      1. Oi Cláudio, esse pwm controlará um motor, a parte de potência já fiz, precisa variar de 0 a 5v, pra simular no proto já fiz com “555”, porém gostaria de fazer com o 16f628a para acrescentar um display pra mostrar a varia ção de tensão de 0 a 12v, e o consumo em ampéres.

        1. Olá Ronyfreytas!
          Muito legal o seu projeto. O uso do 16f628a não é aconselhável pois ele não tem módulo de conversão analógico para digital, necessário para ler tensões. Como disse anteriormente, não tenho ainda nenhum projetinho com amperímetro. Mas vai encontrar muitos digitando no Google ‘Voltmeter Ammeter’ ou similar.
          Cláudio

          1. Oi Cláudio, tudo bem, fiz o código no pic18f2550, simulei no proto.
            Estou usando o sensor de corrente acs712 30A, que me fornece uma tensão de 2,5v até 5v, ou seja de 0 até 30A. Mesmo com a tensão de entrada analógica fixa, a saída fica oscilando muito, muito instável.
            Segue o código como exemplo, se puder me auxiliar te agradeço.

            Obrigado.

            #include
            #device adc=10

            #FUSES NOWDT //No Watch Dog Timer
            #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
            #FUSES INTRC_IO //Internal RC Osc, no CLKOUT
            #FUSES PROTECT //Code not protected from reading
            #FUSES NOBROWNOUT //No brownout reset
            #FUSES BORV20 //Brownout reset at 2.0V
            #FUSES PUT //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 NOIESO //Internal External Switch Over mode disabled
            #FUSES NOFCMEN //Fail-safe clock monitor disabled
            #FUSES NOPBADEN //PORTB pins are configured as digital I/O 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 NOMCLR //Master Clear pin used for I/O
            #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 CPUDIV4 //System Clock by 4
            //#FUSES USBDIV //USB clock source comes from PLL divide by 2
            //#FUSES VREGEN //USB voltage regulator enabled

            #use delay(clock=8000000)
            #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

            #include

            float v, a;
            int16 pwm;

            void main()
            {

            setup_adc_ports(AN0_TO_AN3|VSS_VDD);
            setup_adc(ADC_CLOCK_INTERNAL);
            setup_spi(SPI_SS_DISABLED);
            setup_wdt(WDT_OFF);
            setup_timer_0(RTCC_INTERNAL);
            setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
            setup_timer_2(T2_DIV_BY_4,249,1);
            setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
            setup_ccp1(CCP_PWM);
            set_pwm1_duty(10);
            setup_comparator(NC_NC_NC_NC);
            setup_vref(FALSE);
            //Setup_Oscillator parameter not selected from Intr Oscillator Config tab

            // TODO: USER CODE!!

            lcd_init();

            while(true){

            //=========================================================================
            // Tensão
            //==========================================================================

            set_adc_channel(0);
            delay_us(10);
            v=read_adc();
            v=v*0.01528523949169110459433040078201;
            printf(“%fv \n “, v);

            //==========================================================================
            // Corrente
            //==========================================================================
            set_adc_channel(1);
            delay_us(10);
            a=read_adc();
            a=a*0.004867585532746823069403714565;
            a=a-2.5;
            a=a/0.0799999999999999999999999999999999999;
            printf(“%fa\n “, a);
            //==========================================================================
            // PWM
            //==========================================================================
            set_adc_channel(2);
            delay_us(10);
            pwm=read_adc();
            if(pwm=999){pwm=998;}

            printf(“%Lupwm\n\r “, pwm);

            lcd_gotoxy (1,1); //Ir para a coluna 5 na linha 1 do LCD.
            // lcd_putc (“V=2.5″); //Escreve no LCD.
            printf(lcd_putc,”A= %f”,a);
            lcd_gotoxy (1,2); // Ir para a coluna 5 da linha 2 do LCD.
            //lcd_putc (“A=24″); //Escreve.
            printf(lcd_putc,”V= %f”,v);
            // delay_ms (100); //Pausa de 100 milisegundos
            // lcd_putc (“\f”); //Apaga o LCD.
            // delay_ms (100);

            set_pwm1_duty(pwm);
            }
            }

          2. Olá Ronyfreitas!
            Tente contatar o autor do programa sobre este problema. Mas pela prática, quando fazemos uma única leitura e apresentamos no Lcd, tende realmente a variar muito em leituras sucessivas. O ideal é fazer muitas leituras (umas 100), somando em um registrador longo. Depois, dividimos pelo número de leituras para obter uma média mais estável. Mas pode ter outras técnicas que eu desconheço como hobista nesta área.
            Cláudio

      1. Bom amigo a ideia seria gravar um valor determinado e quando atingir esse valor gerasse o beep , pois se fosse possivel ajustar para nivel maximo e e nivel minimo .

        1. Olá Liliano! Ainda não entendi bem este ‘ajustar o nível máximo e mínimo’? Seria algum tipo de limitador máximo e minimo? Algum exemplo prático de uso?
          Cláudio

          1. isso amigo seria como se fosse um ajuste de limite , pois imagina um motor que deve trabalhar em velocidade em uma gama de diferente ou seja tipo d 0 a 100 % , dai eu precisasse ajustar pra que ele trabalhe na faixa de 20 a 50 % acima ou abaixo dessa velocidade surge um beep então vc poderia ajustar precisamente esse motor para que ficasse preciso na sua velocidade isso sem usar um display para visualizar seu pwm .

          2. Olá Liliano! Não sei se estou conseguindo acompanhar o seu raciocínio! Como se saberia que o ajuste ficou em 15 ou 30% sem uso de um display?
            Ou pensando em uma outra forma, poderíamos ajustar a velocidade desejada no motor e em seguida apertaríamos uma tecla que ‘memorizaria’ o nível ‘pwm’, e toda vez que o potenciômetro passar por esta regulagem emitiria um bip. Ou não seria nada disso?
            Cláudio

  2. Olá Claudio. Olá a todos.

    Montei o projeto, versão chaves dactilares, na placa de ensaios,com uma lâmpada 12v/21W.
    Alterei a resistência para 47 ohms -com 470 ohms é bloqueada a corrente para a base do Trs.Tip41c.
    O resultado obtido foi, aprox/ 70% da capacidade da lâmpada, no máx. . No mínimo, completamente apagada, a lâmpada.
    A regulação da intensidade,de luz, funciona mt. bem.

    Obrigado.
    Costa Eusébio.

    1. Olá Eusébio!
      Obrigado por compartilhar o resultado da sua montagem. Quando coloquei o esquema exemplo, acabei não dando muita atenção a correta polarização do transistor de saída . Creio que para uma lâmpada de 10 watts – 12 volts acenderia no seu pleno brilho. Para o caso de uma lâmpada de 21 w, seria talvez necessário acrescentar um outro transistor em montagem Darlington, para aumentar o ganho, mantendo o resistor de 470 ohms. Valores abaixo de 125 ohms, poderão gerar correntes superiores ao que é permitido para o port do pic, podendo causar a sua queima.
      Claudio

  3. lario isto é show mesmo,muito bom ,apenas uma curiosidade há possibilidades de duplicar o pwm sw. melhor dizendo 4 botoes sw na entrada e duas saidas pwm rsrsrsr isto é com pic 12f675?valeu lario.

        1. Olá Ata!
          Por favor, poderia informar qual arquivo está usando? Chave ou potenciômetro?

          Cláudio

          Hi Ata!
          Please, could you tell me what file are you using? With switch or potentiometer?

          Cláudio

          1. Howdy.
            Thanks for the reply.
            Using key file. The simulation starts at 50%.
            If possible, start from 0% and each press to increase by 20%
            I do not care to drop.
            I try to combine it with a soft washing machine, I found one that was ordered and engine speed, in different stages of the wash program. Maybe you think the next one.
            Goodbye.

            Sorry if I posted wrong

Comments are closed.

Back To Top