Ir ao conteúdo
  • Cadastre-se

Sistema de baterias baseado em programação de Arduino


Posts recomendados

  • Membro VIP

...e nesta outra simulação fiz a recomposição da senoide usando 2 trafos e um filtro chutado com 1H e 10uF

2.png.56510884251f11dd4946fb689118d6d1.png

https://i.imgur.com/2yeYSud.mp4

Algo me diz que é quase isso que vai rolar na real quando colocar drivers, ponte (?) de mosfet e etc, certo?

A senoide -  agora em 60Hz - continua imperfeita.. Suponho ser pelos valores do L & C 'amatemáticos' 😜

 

Edit...

 

Indiretamente descobri que minha teoria da falta de teoria matemática estava certa 😜... coloquei um voltímetro ac, fui ajustando o valor do capacitor na simulação até dar o maior valor vac. 2.52 e 3.52 de pico que foram os máximos3.thumb.png.13c99111271b9f04fc3332a02480637d.png

O valor de C 14.5uF ficou totalmente coerente com a teoria da ressonância LC

image-66.png

bem como a de L em paralelo

Tipo assim 1H//1H=0.5H .. coloque na fórmula acima com C=14.5 e vai achar ... ~60Hz 😁. Capacitor menor ou maior que isso cai a tensão e/ou distorce a onda. Perceba que a onda ficou mais surfável  🤪

Link para o comentário
Compartilhar em outros sites

4 horas atrás, .if disse:

@albert_emule olha isso agora...

https://i.imgur.com/ThcvakD.mp4

 

fyZkXLT.png

Senoide sinistra - é soma dos sinais filtrados - mas perceba na simulação os canais que se invertem. Está mais lento algo como 3Hz mas é só pra gente ver mesmo.

Nos anexos é só uma prova de conceito mesmo pra você gravar e testar se quiser pois a freq ainda está baixa. Caso você ou alguém se interesse eu dou mais uma estudadela nos registros pra aumentar a freq pra 60 ou 50hz.

A referência que me ajudou indiretamente a inverter os sinais - não menciona explicitamente como inverter:

https://www.eprojectszone.com/how-to-modify-the-pwm-frequency-on-the-arduino-part2timer-1-and-phase-correct-pwm-mode/

Como dei uma raladinha básica, o fonte eu posto só se alguém me implorar de joelhos, ok? 😁

 

 

 

arduino.avr.nano.zip 15.57 kB · 2 downloads

 

Ficou top demais. 

É justamente isso que precisava. 

 

Agora a próxima etapa do projeto é gravar no arduino, e testar lá naquele circuito que fiz.

 

Poderia enviar o código em arquivo de texto, para eu ver o que mudou?

Embora eu não entenda muito. Mas fiquei curioso.  

3 horas atrás, .if disse:

...e nesta outra simulação fiz a recomposição da senoide usando 2 trafos e um filtro chutado com 1H e 10uF

2.png.56510884251f11dd4946fb689118d6d1.png

https://i.imgur.com/2yeYSud.mp4

Algo me diz que é quase isso que vai rolar na real quando colocar drivers, ponte (?) de mosfet e etc, certo?

A senoide -  agora em 60Hz - continua imperfeita.. Suponho ser pelos valores do L & C 'amatemáticos' 😜

 

Edit...

 

Indiretamente descobri que minha teoria da falta de teoria matemática estava certa 😜... coloquei um voltímetro ac, fui ajustando o valor do capacitor na simulação até dar o maior valor vac. 2.52 e 3.52 de pico que foram os máximos3.thumb.png.13c99111271b9f04fc3332a02480637d.png

O valor de C 14.5uF ficou totalmente coerente com a teoria da ressonância LC

image-66.png

bem como a de L em paralelo

Tipo assim 1H//1H=0.5H .. coloque na fórmula acima com C=14.5 e vai achar ... ~60Hz 😁. Capacitor menor ou maior que isso cai a tensão e/ou distorce a onda. Perceba que a onda ficou mais surfável  🤪

 

 

A ideia é trabalhar no inversor com center tap:

430063757_7222646424529935_1355838674890

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Estava editando quando você apareceu...

Esta brincadeira com este tipo de inversor me leva a crer que:

-Não posso ligar carga indutiva ou capacitiva com segurança na saída. L e C da carga vão interferir na ressonância

-L do motor ac tende a ser elevado. Pra eu ligar ele na saída o L secundário deve ser bem baixo pra que o paralelo L alto não derrube a ressonância...

2 horas atrás, albert_emule disse:

Poderia enviar o código em arquivo de texto, para eu ver o que mudou?

Claro amigo... Está minimalista ao extremo, como sempre. Como sempre + é - ...🙃

#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions;
static unsigned int lookUp[SinDivisions];

void setup()
{
  double temp;
  for(int i = 0; i < SinDivisions/2; i++)
  {
    temp = sin(i*2*M_PI/SinDivisions)*period;
    lookUp[i] = (int)(temp+0.5);           
  }
  TCCR1A = 0b10110010;
  TCCR1B = 0b00011001;
  TIMSK1 = 0b00000001;
  ICR1   = period;   
  sei();             
  DDRB = 0b00010110;
//  DDRC = 0b00001000;
  pinMode(13, OUTPUT);
}

void loop()
{

}

ISR(TIMER1_OVF_vect)
{
static int num;
static char trig;
static bool led;
    
OCR1A = OCR1B = lookUp[num]; // = OCR1B 
if(num++ >= (SinDivisions/2)) 
  {
  num=0;
  if (trig++>59) {trig=0;digitalWrite(13,led);led^=1;}  //led tô vivo
  }
} 

 

Acredite se quiser mas é só isto que está rodando:

OCR1A = OCR1B = lookUp[num]; 

O led é só frescura pra dizer que não tá travado.

Ajustar o registro TCCR1A = 0b10110010 e alimentar o registro OCR1B com a tabela foram os pulos de gato

 

Anexo também o .hex já em 60Hz pra você gravar se quiser...arduino.avr.nano.zip

 

Queria fazer um pra um mini inversor de frequência pra controlar meu ventilador - atualmente uso um dimmer e fica um pôômmm irritante além do que ele esquenta. A ideia é reduzir tanto a V como a F pra reduzir a velocidade. Ainda não vi como fazer... Este controle deve ser feito dentro do loop() que neste momento está vazio.

Em caso de seu sucesso inicial, autorizo a você publicar nos seus grupos. O preço: alguém fazer o controle acima pro meu ventilador 😁

2 horas atrás, albert_emule disse:

A ideia é trabalhar no inversor com center tap:

Ah tá... O trafo é comum ou especial de ferrite, gap, alta freq e tal?

Para a realimentação pode-se bolar um sistema com acoplador ótico.. se bem que do jeito que você fez também vale...

edit...

França Veja esta simulação "com center tape". Os diodos - configurados como digital - simulam o mosfet com a corrente de lado só se alternado entre um tap e outro. De fato deu um resultado quase esperado..só por uma questão que quando tem carga a onda vai caindo por isso tirei o 10K de carga. Mas ele ndv com a coisa. A ideia foi remontar a senoide gerada por sw com sua ...

2 horas atrás, albert_emule disse:

ideia é trabalhar no inversor com center tap:

https://i.imgur.com/XVwSVSI.mp4

Resta agora a questão de saber se trafo comum dá um resultado prático bom. Tenho trafinho 6+6... cogito ligar direto no pino arduino com os diodos igual à simulação só pra zoar... Será que se ligar a saída num chuveiro 220 a potência vai ser tão alta que vai queimar ele ...? o chuveiro? 😁

 

 edit II. pra não alimentar viradas de página

1 hora atrás, Sérgio Lembo disse:

ressonância para alisar a onda, creio que este tipo de topologia só funcione com frequência fixa, ótimo para nobreak

Tens razão caro amigo. De fato prum inversor de freq nem está na pauta a bateria.. me confundi.  Sorry.. Há alguns anos fiz um com pic16fxxx e de fato usara Vdc da rede retificada. Como o motor num tá nem aí pra tensão senoidal, o inversor aplica-lhe direto o pwm e sua indutância se vira pra filtrar e senoidizar a corrente que lhe circula - que é a que ele considera. Assim sendo não é necessário o capacitor. Desconsideremos portanto o controle que mencionei lá atrás, ok?

 

1 hora atrás, Sérgio Lembo disse:

Para 220Vrms, se a fonte for de 400V, duty = seno x 0,78 (311Vp / 400Vp), nosso fator de correção. Para um inversor de frequência variável, se a máquina for de 60Hz e o input for de 40Hz passamos a ter o segundo fator de correção.

duty = seno x 0,78 (311Vp / 400Vp) x 0,67 (40Hz / 60Hz).

Vou estudar isso sim.. agradeço.

 

1 hora atrás, Sérgio Lembo disse:

#define SinDivisions 200 #define microMHz 16 #define freq 240  sei()

1 hora atrás, Sérgio Lembo disse:

funções cuja resposta desconheço.

O carinha do projeto original usou desnecessariamente variáveis - que ficam na ram - pra 'representar' valores fixos, ou constantes. Isso é algo como "coisa de criança" e não é totalmente bom pois além de ocupar memória, pode criar vida própria em ambientes muito agressivos. .. mas isso chega às raias da paranóia, ok?

 

#define é inato do C. e não é função. Literalmente ele define (no caso) valores numéricos. Quando o compilador acha a palavra SinDivisions ele considera - e troca por - simplesmente como 200. Lembrando que é usado mais no tempo da compilação. Já o sei() é inato do compilador ou até mesmo do arduino movido a atmega328. Praticamente é um assembly que seta um registro que libera as interrupções...

Bem... nem sei se é isso que te inquietou mas...

 

 

1 hora atrás, Sérgio Lembo disse:

No projeto que descreveste foi usada ressonância para alisar a onda, creio que este tipo de topologia só funcione com frequência fixa

De fato fiz por minha conta e risco ... nem sei se é usual. Se sim, comente sobre indutâncias e capacitâncias na carga, se de fato altera a boa relação L&C da saída...

 

edit III

 Dei mais uma microanalisada no fonte e fiz uma microotimização com #define com base no que expliquei pra Serjão

@Sérgio Lembo

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions;

🙃

 

Link para o comentário
Compartilhar em outros sites

@.if

#define SinDivisions 200 #define microMHz 16 #define freq 240  sei()

Cara Isadora. No seu código usaste funções cuja resposta desconheço. Se bem entendi seu código retorna 60Hz e pelas imagens com uma serrilha de tensão bem reduzida, parabéns. Na definição de tensão a ser aplicada esta é a tensão de pico vezes o seno do ângulo. Supondo que a fonte tenha a tensão de pico, duty = fonte x seno. Para 220Vrms, se a fonte for de 400V, duty = seno x 0,78 (311Vp / 400Vp), nosso fator de correção. Para um inversor de frequência variável, se a máquina for de 60Hz e o input for de 40Hz passamos a ter o segundo fator de correção.

duty = seno x 0,78 (311Vp / 400Vp) x 0,67 (40Hz / 60Hz).

No projeto que descreveste foi usada ressonância para alisar a onda, creio que este tipo de topologia só funcione com frequência fixa, ótimo para nobreak. As minhas considerações focam a saída PWM sem alisamento usada em motores, não sei se dá para usar em topologias onde foram usadas capacitores fixos visando ressonância ou se é possível compensar de alguma forma isso no duty, vai um bom conhecimento de matemática nisso.

 

Todas as considerações acima são para o motor comum de indução, não sei se aplicáveis à variante utilizada nos ventiladores.

 

 

 

  • Haha 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, .if disse:

Estava editando quando você apareceu...

Esta brincadeira com este tipo de inversor me leva a crer que:

-Não posso ligar carga indutiva ou capacitiva com segurança na saída. L e C da carga vão interferir na ressonância

-L do motor ac tende a ser elevado. Pra eu ligar ele na saída o L secundário deve ser bem baixo pra que o paralelo L alto não derrube a ressonância...

Claro amigo... Está minimalista ao extremo, como sempre. Como sempre + é - ...🙃

 

 

Estou com um nobreak de 2000Va que funciona com esse PWM. 

Vou ligar um motor de 70W nele, para ver como se comporta. 

5 horas atrás, .if disse:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions;
static unsigned int lookUp[SinDivisions];

void setup()
{
  double temp;
  for(int i = 0; i < SinDivisions/2; i++)
  {
    temp = sin(i*2*M_PI/SinDivisions)*period;
    lookUp[i] = (int)(temp+0.5);           
  }
  TCCR1A = 0b10110010;
  TCCR1B = 0b00011001;
  TIMSK1 = 0b00000001;
  ICR1   = period;   
  sei();             
  DDRB = 0b00010110;
//  DDRC = 0b00001000;
  pinMode(13, OUTPUT);
}

void loop()
{

}

ISR(TIMER1_OVF_vect)
{
static int num;
static char trig;
static bool led;
    
OCR1A = OCR1B = lookUp[num]; // = OCR1B 
if(num++ >= (SinDivisions/2)) 
  {
  num=0;
  if (trig++>59) {trig=0;digitalWrite(13,led);led^=1;}  //led tô vivo
  }
} 

 

Acredite se quiser mas é só isto que está rodando:

OCR1A = OCR1B = lookUp[num]; 

O led é só frescura pra dizer que não tá travado.

Ajustar o registro TCCR1A = 0b10110010 e alimentar o registro OCR1B com a tabela foram os pulos de gato

 

Anexo também o .hex já em 60Hz pra você gravar se quiser...arduino.avr.nano.zip

 

Queria fazer um pra um mini inversor de frequência pra controlar meu ventilador - atualmente uso um dimmer e fica um pôômmm irritante além do que ele esquenta. A ideia é reduzir tanto a V como a F pra reduzir a velocidade. Ainda não vi como fazer... Este controle deve ser feito dentro do loop() que neste momento está vazio.

Em caso de seu sucesso inicial, autorizo a você publicar nos seus grupos. O preço: alguém fazer o controle acima pro meu ventilador 😁

Ah tá... O trafo é comum ou especial de ferrite, gap, alta freq e tal?

Para a realimentação pode-se bolar um sistema com acoplador ótico.. se bem que do jeito que você fez também vale...

edit...

França Veja esta simulação "com center tape". Os diodos - configurados como digital - simulam o mosfet com a corrente de lado só se alternado entre um tap e outro. De fato deu um resultado quase esperado..só por uma questão que quando tem carga a onda vai caindo por isso tirei o 10K de carga. Mas ele ndv com a coisa. A ideia foi remontar a senoide gerada por sw com sua ...

https://i.imgur.com/XVwSVSI.mp4

Resta agora a questão de saber se trafo comum dá um resultado prático bom. Tenho trafinho 6+6... cogito ligar direto no pino arduino com os diodos igual à simulação só pra zoar... Será que se ligar a saída num chuveiro 220 a potência vai ser tão alta que vai queimar ele ...? o chuveiro? 😁

 

 edit II. pra não alimentar viradas de página

Tens razão caro amigo. De fato prum inversor de freq nem está na pauta a bateria.. me confundi.  Sorry.. Há alguns anos fiz um com pic16fxxx e de fato usara Vdc da rede retificada. Como o motor num tá nem aí pra tensão senoidal, o inversor aplica-lhe direto o pwm e sua indutância se vira pra filtrar e senoidizar a corrente que lhe circula - que é a que ele considera. Assim sendo não é necessário o capacitor. Desconsideremos portanto o controle que mencionei lá atrás, ok?

 

Vou estudar isso sim.. agradeço.

 

O carinha do projeto original usou desnecessariamente variáveis - que ficam na ram - pra 'representar' valores fixos, ou constantes. Isso é algo como "coisa de criança" e não é totalmente bom pois além de ocupar memória, pode criar vida própria em ambientes muito agressivos. .. mas isso chega às raias da paranóia, ok?

 

#define é inato do C. e não é função. Literalmente ele define (no caso) valores numéricos. Quando o compilador acha a palavra SinDivisions ele considera - e troca por - simplesmente como 200. Lembrando que é usado mais no tempo da compilação. Já o sei() é inato do compilador ou até mesmo do arduino movido a atmega328. Praticamente é um assembly que seta um registro que libera as interrupções...

Bem... nem sei se é isso que te inquietou mas...

 

 

De fato fiz por minha conta e risco ... nem sei se é usual. Se sim, comente sobre indutâncias e capacitâncias na carga, se de fato altera a boa relação L&C da saída...

 

edit III

 Dei mais uma microanalisada no fonte e fiz uma microotimização com #define com base no que expliquei pra Serjão

@Sérgio Lembo

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions;

🙃

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Boa França... Tentei fazer na simulação mas o simulador dá uma travada legal.. acho que é muito processamento pro meu cp500. Perceba em baixo o 8uF e 1H com chaves. A ideia em cima da ideia era testar com carga indutiva, capacitiva e ambas formando um corretor de f.p. meia boca. Perceba também os mosfets e 12v e os pretendidos 220Vac... Portanto deu quase muito totalmente 100% certo. .. na teoria3.thumb.png.30d8ae822c27f839f01bec7a3672c3a2.png

 

Apesar de semi coerente com o título do tópico, parece que o autor já se decidiu e estamos avançando páginas o que pode incomodar pessoas (tipo esta que vos escreve). Vi um tópico seu acho de 2017 totalmente coerente com a discussão atual mas está fechado.. algo como "inversor senoidal com arduino". Sugiro criar outro atualizado (eu não crio) ... Nele atualizo os fontes e esquema...

 

4 horas atrás, albert_emule disse:

Fui testar agora. A senoide desse está esquisita.

na real ou simulado? Mostre...

Algo me diz que você sabe que quem mantém a harmonia da senoide é um bom casamento L & C, né? NÉH?

 

De novo... pra melhor 'casamento' de ideias e ideais e harmonia do forum, peça pra equipe do forum reabrir:

ou preferencialmente crie outro

 

Link para o comentário
Compartilhar em outros sites

Em 29/02/2024 às 14:19, .if disse:

Estava editando quando você apareceu...

Esta brincadeira com este tipo de inversor me leva a crer que:

-Não posso ligar carga indutiva ou capacitiva com segurança na saída. L e C da carga vão interferir na ressonância

-L do motor ac tende a ser elevado. Pra eu ligar ele na saída o L secundário deve ser bem baixo pra que o paralelo L alto não derrube a ressonância...

Claro amigo... Está minimalista ao extremo, como sempre. Como sempre + é - ...🙃

#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions;
static unsigned int lookUp[SinDivisions];

void setup()
{
  double temp;
  for(int i = 0; i < SinDivisions/2; i++)
  {
    temp = sin(i*2*M_PI/SinDivisions)*period;
    lookUp[i] = (int)(temp+0.5);           
  }
  TCCR1A = 0b10110010;
  TCCR1B = 0b00011001;
  TIMSK1 = 0b00000001;
  ICR1   = period;   
  sei();             
  DDRB = 0b00010110;
//  DDRC = 0b00001000;
  pinMode(13, OUTPUT);
}

void loop()
{

}

ISR(TIMER1_OVF_vect)
{
static int num;
static char trig;
static bool led;
    
OCR1A = OCR1B = lookUp[num]; // = OCR1B 
if(num++ >= (SinDivisions/2)) 
  {
  num=0;
  if (trig++>59) {trig=0;digitalWrite(13,led);led^=1;}  //led tô vivo
  }
} 

 

 

 

Fui testar agora. A senoide desse está esquisita.

Parece que é mais fácil fazer isso em analógico 😁

Em 01/03/2024 às 09:28, .if disse:

Boa França... Tentei fazer na simulação mas o simulador dá uma travada legal.. acho que é muito processamento pro meu cp500. Perceba em baixo o 8uF e 1H com chaves. A ideia em cima da ideia era testar com carga indutiva, capacitiva e ambas formando um corretor de f.p. meia boca. Perceba também os mosfets e 12v e os pretendidos 220Vac... Portanto deu quase muito totalmente 100% certo. .. na teoria3.thumb.png.30d8ae822c27f839f01bec7a3672c3a2.png

 

Apesar de semi coerente com o título do tópico, parece que o autor já se decidiu e estamos avançando páginas o que pode incomodar pessoas (tipo esta que vos escreve). Vi um tópico seu acho de 2017 totalmente coerente com a discussão atual mas está fechado.. algo como "inversor senoidal com arduino". Sugiro criar outro atualizado (eu não crio) ... Nele atualizo os fontes e esquema

 

Esse parece estar bom. Qual é esse código? 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Moris ...

coloquei um R de 1mR. Perceba o pico de 2.7mV=2.7A.. Ok não deve dar pra diagnosticar nada mas um detalhe: a corrente está 1/2 senoidal ou seja linear. Achei que ia aparecer o pulso pwm. Suponho ser devido ao ter ligado o gate direto no mc sem driver ou a indutância está filtrando ou algo do gênero... Ou era pra ser assim mesmo? O sinal amarelo é a V em 1mR

 

1.thumb.png.85066175b4533084aa78a6f35345580e.png

 

A simulação fica muuuiiitooo lenta quando com este esquema. Estou fazendo teste com esta

2.thumb.png.a14c2e6f87412b3244b90b3e76a51fed.png

sem mosfet que fica menos lenta. Com alguns saltos felinos pessoais - sem google, IA e afins, já tive sucesso em ler a vac com este esquema minimalista com 2 resistores acima e mostrar no terminal. O foco agora é...

Em 16/02/2024 às 15:44, albert_emule disse:

uma realimentação para correção da tensão de saída.

A qualquer momento vos mostro minha saga até este ponto... Alerta de spoiler - o compilador arduino parece ter bugs. Tive que fazer uma verdadeira ginástica pra operar a contento. Penso em migrar pro Keil C ou IAR ou o XC8 da microchip mesmo...

 

Link para o comentário
Compartilhar em outros sites

11 horas atrás, albert_emule disse:

O mais normal é ver uma senoide com ondulação em dente de serra.

PWM não vai ver, pois a indutância do trafo filtra o PWM.

Pois é isso mesmo que eu esperava ver. Com o monitoramento da corrente (diferencial) no positivo da fonte.

 

Outro detalhe é que o trafo usado na simulação parece ser ideal, não possuindo indutância parasita. Isso deve acarretar um pico de corrente alto nas comutações, devido a presença do capacitor no secundário.

MOR_AL

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
12 horas atrás, albert_emule disse:

PWM não vai ver, pois a indutância do trafo filtra o PWM.

18 horas atrás, .if disse:

ou a indutância está filtrando

 

47 minutos atrás, MOR_AL disse:

é isso mesmo que eu esperava ver.

18 horas atrás, .if disse:

Achei que ia aparecer o pulso pwm.

tmj...🙃

 

Também tenho outra teoria sobre a ausência visual do pulso ou dente de serra.. tanto faz: a granulação senoidal é de 100 unidades além do que a portadora ou freq do pwm é relativamente grande para o tipo de trafo e sua indutância. Indutância grande suaviza demais a coisa - não vos esqueceis que vejo fluxo de eletrons e não necessariamente a matemática da coisa ok?.

Numa próxima revisão do sw vou reduzir o número de amostras de seno bem como a freq pwm pra ver. A ideia é colocar uns 8 ou 16 senos apenas - já que o hw se encarrega de 'senoidizar' a coisa. E também devo controlar apenas 1 quadrante da senoide - já que os outros 3 são 'espelhos' deste.

 

Voltando a:

18 horas atrás, .if disse:

 

Em 16/02/2024 às 15:44, albert_emule disse:

uma realimentação para correção da tensão de saída.

 

Uma ideia inicial que tive foi fazer com opto pra efeito de isolação. Isso aqui deu quase muito certo:

Capturadetelade2024-03-0907-31-46.thumb.png.012b5b8ce30cdc0bfd754ecb5966dcda.png

O vac do terminal não tem a ver com a 'realidade' da simulação. Já o Ad é o valor que efetivamente vou usar pra fazer a correção da tensão - largura do pwm. O salto felino que disse foi a captura naquele único ponto de pico da onda bem como a não necessidade de retificação e filtragem pra ler dc que em tese tornará o sistema mais rápido. A ideia é deixar o sistema bem parecido com que um hw dedicado faria mas com 'anabolizantes' 🤪

 

O fonte abaixo é o que usei. Mas é só pra curiosidade mesmo pois devo evoluir a versão. Basicamente é só pra você - caro leitor experiente em c - perceber as bizarrices necessárias pra que funcionasse... e nem me pergunte de onde veio a inspiração para tal...

#include <avr/io.h>
#include <avr/interrupt.h>
//#include <math.h>

#define SinDivisions 200
#define microMHz 16
#define freq 240   
#define period microMHz*1e6/freq/SinDivisions
//static unsigned int lookUp[SinDivisions/2];

//não quis usar a matemática mas sim dados pre computados
//Era pra ser "const" - na flash - mas não funciona.. suposto bug do compilador
unsigned int lookUp[101]= { //tabela na ram
                                0,10,21,31,42,52,62,73,83,93,103,
                                113,123,132,142,151,161,170,179,
                                187,196,204,212,220,228,236,243,
                                250,257,263,270,276,281,287,292,
                                297,302,306,310,314,317,320,323,
                                325,327,329,331,332,333,333,333,
                                333,333,332,331,329,327,325,323,
                                320,317,314,310,306,302,297,292,
                                287,281,276,270,263,257,250,243,
                                236,228,220,212,204,196,187,179,
                                170,161,151,142,132,123,113,103,
                                93,83,73,62,52,42,31,21,10,0
                                };

unsigned int num;
unsigned char trig;
bool led;
unsigned int a0,a1;
bool dtrig;
float Vac;

void setup()
{
//  double temp;
  for(int i = 0; i < SinDivisions/2; i++)
  {
//  lookUp[i] = (sin(i*2*M_PI/SinDivisions)*period);
//    temp = (sin(i*2*M_PI/SinDivisions)*period);
//    lookUp[i] = (int)(temp+0.5);           
  lookUp[i]=lookUp[i+1];//insanidade pra funcionar: +1 suposto bug no compilador
  }
  TCCR1A = 0b10110010;
  TCCR1B = 0b00011001;
  TIMSK1 = 0b00000001;
  ICR1   = period;   
  DDRB = 0b00110110;
  DDRD |= 0b10000000;
//  DDRC = 0b00001000;
//  pinMode(13, OUTPUT);
  Serial.begin(9600); 
  Serial.println("teste");
  sei();             
}


ISR(TIMER1_OVF_vect)
{
OCR1A = OCR1B = lookUp[num]; 
if (num==50) //sincronia com o loop
  {
  dtrig=1; //meio da tabela => vpico
  if (trig++>59) {trig=0;PORTB^=0b00100000;}//digitalWrite(13,led);led^=1;}  //led tô vivo
  }
if(num++ >= (SinDivisions/2)) num=0;
} 

void loop()
{
dtrig=0; //aguardar momento Vp
// sinc. com interrupt   //outro suposto bug do compilador:
while(!dtrig) asm("NOP");//Não era pra precisar do NOP
a0=analogRead(A0); //captura logo após atingir Vp
PORTD=0b10000000; //apenas para mostrar o momento da captura do sinal
PORTD=0b00000000; //no osciloscópio
//a1=analogRead(A0);
//PORTD=0b10000000;
//PORTD=0b00000000;
Serial.print("Ad=");
Serial.print(a0);
Vac=((float)a0*0.03447);
Serial.print(" Vac=");
Serial.println(Vac);
//Serial.write(10);
//Serial.print(" a1=");
//Serial.println(a1);

}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
11 horas atrás, MOR_AL disse:

Np = Ns = 60,66mH = 0,06066H.

Moris deu isso...

https://i.imgur.com/4eva8LB.mp4

A I é o amarelo. Dá uns 20A de pico. Pena que a senoide desmontou (azul). Não sei qual capacitor usar. O da ressonância 116nF não deu certo.  Acho que depende mais da freq do pwm. Qual a indutância de um trafo 12+12 uns 30A 60Hz.. Acho que tenho algo do tipo. Ainda não aprofundei na evolução deste treco. De novo, este não é meu ramo. Só estou xeretando por estas bandas...

 

@albert_emule não vejo sua imagem meu rei.

 

 

Link para o comentário
Compartilhar em outros sites

@.if

Confesso que eu não entendi quase nada, hehehe.

Sempre tive dificuldade em relacionar (no Proteus) o nível cc da chave com o da onda na tela.

Não sei porque a corrente aparece antes da tensão na saída.

Não vi mais os valores de Lp e de Ls. A ressonância seria em 50Hz. 

A corrente teria a forma da senóide, porém com os "dentes" do PWM.

Deixa pra lá!!! ☹️☹️☹️☹️

MOR_AL

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@MOR_AL  e eu ainda menos .. 😜

Refiz a conta da ressonância mas deixei em 60Hz mesmo. C=116uF com seus mH. Agora até que quase deu igual ao do real do França...Tive que aumentar o R shunt pra 10mR pro osc captar. E pra aparecer as ondas abaixo tive que intuir um fator de acoplamento 0.5 (o tal M). Apesar do nome sugestivo, como não sou do ramo não sei exatamente o que significa. RP e RS são a R em mR.

2.thumb.png.e19859634b126e72ae6c764865d388e2.png

com zoom...

1.thumb.png.7584e7f0b55007a03022a4cccafeb5df.png

1 hora atrás, MOR_AL disse:

A corrente teria a forma da senóide, porém com os "dentes" do PWM.

Meio que tentou aparecer a senoide mas pelo menos mostrou os dentes ... amarelos.

 

Na IDE arduina o código ocupou + de 3K - sem o tal bootloader - além de não funcionar a contento alimentando os dados de seno direto da flash e etc. Já num compilador de verdade ocupou 600B e, claro, lê da flash de boa. Mas pra tornar o projeto open source acho que vou ter que retornar ao arduino mesmo... pensando... em fazer em ambos só pra efeito de benchmarking

França.. agora sim vi a figura.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, .if disse:

E pra aparecer as ondas abaixo tive que intuir um fator de acoplamento 0.5 (o tal M). Apesar do nome sugestivo, como não sou do ramo não sei exatamente o que significa.

Coloque o M = 0,99.

2 horas atrás, .if disse:

RP e RS são a R em mR

Se estes Rp e Rs pertencerem às especificações do trafo, então Rp seria a resistência (de fuga equivalente), que deveria ser muito alta, algo como 1M Ohms.

Rs seria a resistência dos fios da bobina, algo como 1 Ohm.

A forma de onda da corrente começa a parecer como eu (eu) acho que deveria ser.

Só que a corrente ainda está defasada da tensão, o que mostra uma carga reativa.

Quando mencionei Lp = Ls = 60,66mH, era quando o eletrolítico valia 14,5uF e era a ressonância para 50Hz, que constava em seu programa.

Coloque o valor do capacitor para ressonar na frequência da rede que você está usando, juntamente com os valores de Lp e Ls. Como suponho que a relação de espiras é de 1:1, já que os valores são iguais, considero que o valor de L da ressonância seja L = Lp/2 = Ls/2.

MOR_AL

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

 

@MOR_AL  Num 1º momento usei calculadora mesmo mas esta calculadora

https://www.omnicalculator.com/pt/fisica/calculadora-frequência-de-ressonancia

dá resultados diferentes do seu mas bem semelhante ao meu lá de trás.

1 hora atrás, MOR_AL disse:

Quando mencionei Lp = Ls = 60,66mH, era quando o eletrolítico valia 14,5uF e era a ressonância para 50Hz, que constava em seu programa.

De fato estou usando 60Hz mesmo.

 

1 hora atrás, MOR_AL disse:

estes Rp e Rs pertencerem às especificações do trafo

..sim mas são resistências da bobina mesmo ok? No caso o default do simulador é 1mR mesmo.

 

1 hora atrás, MOR_AL disse:

M = 0,99.

.. distorce a onda. O que mais deixou senoide foi o 0.5 mesmo.

 

O simulador com mosfet fica muuuiito lento e as vezes instável.. dá algum tipo de erro e pára. Vou parar de usar ele com mosfet e fazer testes de realimentação com trafo direto no pino do mc cuja simulação é bem rápida. Em breve faço teste real pra saber - já que ninguém me iluminou - se trafo comum dá resultado com com este spwm doidão aí... Meu indutímetro sumiu. Vou ter que usar gerador de sinais + osc pra calcular o C ressonante

Link para o comentário
Compartilhar em outros sites

4 horas atrás, .if disse:

resultados diferentes do seu

Ops!!!

F = 50Hz

C = 14,5uF

L = 0,7H

Lp = Ls = 1,4H

 

F = 60Hz

C = 14,5uF

L = 0,485H

Lp = Ls = 0,97H

4 horas atrás, .if disse:

.. distorce a onda. O que mais deixou senoide foi o 0.5 mesmo

M = 0,5 acrescenta uma indutância em série com o trafo.

Acho que é isso que está faltando no seu circuito. Veja o vídeo do @albert_emule , na postagem #35 em t = 1,51min. O trafo "estranho" possui dois indutores acoplados.

O indutor também pode ser obtido via shunt magnético parcial, incluído no trajeto do percurso magnético. Mas esta solução costuma dar um pouco mais de trabalho e é usada quando se quer montar diversos trafos.

MOR_AL

 

Link para o comentário
Compartilhar em outros sites

Em 12/03/2024 às 16:02, MOR_AL disse:

Ops!!!

F = 50Hz

C = 14,5uF

L = 0,7H

Lp = Ls = 1,4H

 

F = 60Hz

C = 14,5uF

L = 0,485H

Lp = Ls = 0,97H

M = 0,5 acrescenta uma indutância em série com o trafo.

Acho que é isso que está faltando no seu circuito. Veja o vídeo do @albert_emule , na postagem #35 em t = 1,51min. O trafo "estranho" possui dois indutores acoplados.

O indutor também pode ser obtido via shunt magnético parcial, incluído no trajeto do percurso magnético. Mas esta solução costuma dar um pouco mais de trabalho e é usada quando se quer montar diversos trafos.

MOR_AL

 

 

 

Enquanto vocês desenvolvem o código, vou testar um módulo chinês chamado EGS002.

 

Esse módulo chinês possui uma opção no microcontrolador para alterar o PWM de unipolar para bipolar.

O que aconteceu é que os drivers IR2110 queimaram.

Portanto, eu vou remover esses drivers e coletar o sinal PWM diretamente do microcontrolador, o que fará com que funcione da mesma forma que este projeto do Arduino.

 

Assim, se estiver funcionando com o módulo EGS002 chinês, também funcionará com o Arduino.

 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, albert_emule disse:

Enquanto vocês desenvolvem o código...

Justiça seja feita. O @.if é que desenvolve o código, pois eu não saberia programar em c com tanta desenvoltura como ele. 

Eu apenas fico dando "pitaco" teórico e você é quem monta e testa. O que tem mais trabalho, pois a prática é que manda.

MOR_AL

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!