• Welcome to LusoRobótica - Robótica em Português.
 

fonte alimentação 0-16v 0-2.5A

Started by dio123, 04 de August de 2013, 15:48

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

dio123

Tenho tudo  pronto, estou aqui a acertar os ultimos promenores, mas surgiu aqui uma duvida.

No eagle,  os pads que ligam ao ground plane ficam com 3 ou 4 pistas pequeninas em forma de cruz e ligam ao ground plane.
A minha duvida é se dá para aumentar um pouco essas pistas.
ex: http://cl.ly/image/311N002k0j0c

Obrigado

jm_araujo

Chamam-se "thermals".
Alteram-se mudando a espessura de linha do polígono que está a fazer o plano (tive de procurar ;) )

Njay


dio123

É isso mesmo,
Quando desenha-se o poligno para fazer o ground plane escolhe-se a espessura para o Thermal relief.


dio123

#124
Esta é a 2ª fonte, em anexo,  parece estar estavel, tanto no lt spice como na prática a olho.

Tenho 1 led de 12v ligado a saida e a voltagem há saida é  12,04v.
Mudo o led para uma lampada 12v 7w  aprox: 1.7A ai acende o CC, acerto o potenciometro do ajuste CC e fica ok.
O problema é que vou medir a voltagem há saida da fonte novamente e tenho 11,74v. Depois tenho de ir ao cv dar-lhe um ajustezinho para ir 12.08v. Se desligar a lampada e ligar o led a volta a voltagem na saida sobe para 12.68v.

A minha duvida é a seguinte: o op-amp U2 nao devia corrigir este drop voltage que acontece com o variar das correntes?


Obrigado


dropes

#125
12V 7W dá 0.583A e não 1.7A
Não estarás a perder tensão nos cabos?
Na simulação funcionou bem com cargas?

senso

Poderá ser o facto de esse op-amp não ser rail to rail e não ter grande capacidade de drive quando próximo da massa ou do Vcc?
Avr fanboy

dio123

As breadboard são muito traisoeiras. Tenho um fio que leva GND depois do RSENSE para a parte superior da breadboard e ai liga as resistencias que metem a tensão.  depois a resistencia do GND  e puxei um fio para a parte inferior da breadboard e já funciona.  Técnicamente está ligado ao mesmo sitio.

Vou fazer a placa, e logo se ve...

dio123

Com a 1ª parte da fonte alimentação feita, e a placa final feita começo agora a  2ª parte da fonte que é medir tensão e corrente e controlo da fan. 

montei o circuito todo na breadboard http://cl.ly/image/3L1T2t0W1323 , começei por usar a referencia interna do atmega8, e o resultado foi que a voltagem  tem  ligeira  diferença, que é corrigivel.
O grande problema é que a voltagem no lcd está sempre oscilar, exprimentei fazer ume media de 16 amostras, e o problema melhorou muito pouco.  Depois  troquei a referencia interna por externa usando TL431, mas o resultado foi o mesmo. Neste momento está a oscilar entre 11.78v, 11.82v,11.87v  11.80v ,11.82v. sendo a saida da fonte 12v certos pelo o multimetro.

O que estou a fazer mal?

senso

Esquema de como estás a fazer a medição, mas possivelmente um condensador de 1uF á entrada do pino do ADC deve estabilizar a coisa.
Avr fanboy

dio123

Já coloquei condensadores  1uF e de 10uF , mas continua a oscilar.

código em anexo mas fica aqui o resumo:
Quotereadout = read_adc(1);
      buf_medias[i++] = readout;
      if(i < 16) continue;
      // Calcular a media de 16 amostras
      for(i = 0; i < 15;  i++)
      {
         voltage += (float)buf_medias;
      }
      voltage = (voltage / 16.0)*factor;

senso

#131
Não uses assim floats com fartura..
Faz só a conversão final de counts de adc para float quanto metes o valor no lcd, não ganhas nada em estar a guardar valores float, só perdes ram, e torna-se muito mais lento.

E o código que trata da leitura do ADC?
Estás a usar vários canais?
Em modo free-runing sempre que mudas de canal, a primeira leitura após a mudança tem um valor do canal anterior.

Se é para fazer scanning usas interrupts, isto é para um atmega328p em SMD que tem mais dois pinos analógios, e está a saltar o A4 e o A5 porque os estou a usar para i2c:
Quoteinline void adcInit(void){

   ADCSRA |= (_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0)|_BV(ADIE));   //16Mhz/128 = 125Khz ADC interrupts ON
   ADMUX = ADCREF;          //Referencia de 5v
   ADCSRA |= _BV(ADEN);      //Adc ligada
   ADCSRA |= _BV(ADSC);      //Fazer uma primeira conversão para iniciar o circuito e porque é a mais lenta
}

ISR(ADC_vect){
   
   static uint8_t inputIndex=0;
   
   if(inputIndex > 4){
      adcRaw[inputIndex-2] = ADCW;   //grab the new conversion data   
   }
   else {
      adcRaw[inputIndex] = ADCW;
   }
   
   if (++inputIndex >= 8 )
   {
      inputIndex=0;
   }
   
   if(inputIndex == 4){
      inputIndex = 6;
   }
   
   ADMUX = ADCREF + inputIndex;   //Define o novo canal a ler do ADC
   ADCSRA |= (1<<ADSC);   //Start a new conversion

   
}

Avr fanboy

dio123

Neste caso , só preciso de um canal que é ADC1.  Os outros não me interessam. Mas no caso de crer ler vários canais terei de usar interrupts certo?

Não estou a perceber o que quer dizer com " E o código que trata da leitura do ADC?"

Então uint16_t read_adc só vai ler o canal que eu escolher neste caso 1, e dai vou receber um valor entre 0-1023 que vai para a variável readout e na continuação do loop o valor é convertido e calculado a voltagem Vin do divisor restritivo.

Se calhar está parte das "contas" havia de estar num void a parte do loop , e no loop ter só ficar o resultado final para passar para o lcd?

senso

Mantem a leitura, médias e afins tudo em uint's, só no print para o lcd é que fazes a multiplicaçã/divisão para passar para float.
Avr fanboy

Njay

#134
Quote from: dio123 on 23 de July de 2014, 00:24
Os outros não me interessam. Mas no caso de crer ler vários canais terei de usar interrupts certo?
Não.

Mete 100nF em C5 (ou além de C5). C5, C4 e C6 têm que estar mesmo "em cima" das patas do chip.

Esta é a minha rotina tipica de leitura do ADC, quando não quero usar a interrupção para fazer o trabalho todo. É um esquema "hibrido", uso a interrupção apenas para não estar a fazer um ciclo activo à espera do final da conversão, assim posso fazer sleep para reduzir a interferência do trabalhar do chip.

EMPTY_INTERRUPT(ADC_vect)

static uint16_t ReadAdc (uint8_t channel)
{
    uint8_t  prevSREG;
    uint16_t  val;

    // Set channel
    ADMUX = (ADMUX & 0xf0) | channel;
    //set_sleep_mode(SLEEP_MODE_ADC);       // does not allow timer1 to continue operate
    // Enable intrs, ADC. Conversion starts automatically when entering
    // sleep mode (idle or ADC noise reduction). @@TODO CHECK THIS - não funca no simulador

    ADCSRA |= _BV(ADIE);
    ADCSRA |= _BV(ADSC);

    // Wait end-of-conversion. The ADC interrupt will unblock sleep.
    do sleep_mode();
    while (ADCSRA & _BV(ADSC));     // wait for the bit to go to zero

    // Read the value
    prevSREG = SREG;
    cli();
    val = ADCW;
    SREG = prevSREG;

    // Disable the ADC interrupt
    ADCSRA &= ~_BV(ADIE);
    return val;
}


(Há ali umas experiências que fiz mas não funcionaram e não voltei a debruçar-me sobre o assunto, ignorem.) Como é que isto funca? O CPU sai de sleep sempre que há uma interrupção. Quando a conversão terminar vai haver uma e portanto o loop termina. Entretanto o core está em sleep (e idealmente estaria num modo especial de sleep para o ADC) e há menos ruído digital a ser gerado. A interrupção é implementada vazia (o handler só tem uma instrução, o iret). Como posso ter outras interrupções no sistema, quando o sleep desbloqueia tenho à mesma que testar se a conversão acabou mesmo.
Esta rotina assume que o ADC já foi ligado e configurado noutro sítio.