AJUSTE
AUTOMATICO DE ANTENAS LOOP MAGNETICA 2 - ARDUINO
Potencia maxima permitida 20W.
Ola amigos
Vamos a segunda parte do trabalho:
Modifquei a ponte de SWR e inclui um amplificador de RF para medir a
frequencia, pois em 28MHz estava apresentando medidas falsas.
Calibrei a o medidor de potencia via software, com uma carga fantasma e
calculei os valores.
Video da
nova montagem
Esquema

Descrição do funcionamento do programa :
Ao ligar o aparelho ele ajusta para a parte mais alta da banda de 10m,
abrindo o capacitor totalmente (zero) até atingir o limite
switch (ehfim2). Este retorno se dá da forma mais rapida
possivel.
Após abrir o capacitor, e usa ela como referencia (30Mhz)
ele entra no loop do programa.
No loop ele mede a frequencia em kHz e compara com a anterior.
Se for uma frequencia baixa ele ignora e retorna.
Caso seja a mesma frequencia, dentro de +6 kHz e -6 kHz, tambem ignora
e retorna.
Caso a diferença seja maior que 6kHz, o ajuste sera subindo a
frequencia (abrindo o capacitor). Neste caso o operador subiu a
frequencia ou mudou para uma banda mais alta.
Caso a diferença seja menor que 6kHz, o ajuste
sera baixando a frequencia (fechando o capacitor). Neste caso o
operador desceu a frequencia ou mudou para uma banda inferior.
Nos casos de alteração de frequencia maior ou menor que
6kHz, o motor /capacitor se move no modo de ajuste fino (half step ou
meio passo) até encontrar uma medida de SWR abaixo do
especificado em programa (ROE=1.05). Caso o capacitor esteja totalmente
aberto ou fechado no ajuste ele ira para a condição
inicial (zero) e retorna ao loop do programa.
Caso atinja o objetivo de SWR volta a condição inicial do
loop do programa, mostarndo no display a medida de frequencia, SWR e de
potencia.
Como medimos
A frequencia : link frequencimetro
,... prescaler , ...outro frequencimetro ... retiramos
o sinal da saida de RF do radio, internamente na ponte de SWR com um
capacitor de 6p8 ceramico. o sinal vai para um amplificador de RF
simples com o 2N3904 e segue para o prescaler e finalmente para o
arduino.


Amplificador de RF montado - como shield do arduino proprio para
montagem rapida.
A estacionaria - ROE - usamos uma ponte de SWR, o circuito foi baseado
na ponte do medidor de
SWR e potencia com PIC do Francesco IK3OIL. Fizemos apenas
alterações no esquema para poder ler sinais mais fracos
QRP, pois o descrito é para 100W e nosso equipamento não
pode passar de 20W.
A alteração principal foi usar um toroide de lampada
economica, equivalente ao FT37-43. Diminuir o numero de espiras para
25. E alterar o sistema de aterramento via trimer ceramico (usamos um
de 47pF max. amarelo) e o capacitor (33pF) e resistor do conjunto (4k7).

Este foi a ponte de ROE ou SWR usada para medir a estacionaria eretirar
o sinal de RF para medir a frequencia.

Outra vista da ponte - a descrição da ponte estará
em nova postagem.
A potencia medimos via a tensão de incidencia da ponte de
SWR. esta tensão é proporcional a tensão de RF ...
assim usando a formula
Potencia (W) = Vp * Vp /2*R
Vp é a
tensão retificada de meia onda e R é a carga resistiva.
Usamos
no programa uma formula derivada desta
Potencia (W) = (((Vinc) * (Vinc)) - 0.25 )*k ....
onde :
K é coeficiente de ajuste do valor obtido para o real, no nosso
caso é de 194/200 ou seja quase 1 e levandoi em conta o divisor
resistivo 47/2k2 que dá cerca de 4% (cerca de 8 pontos em 194)
resolvemos manter como 1. O valor deste coeficiente é obtido com
a calibração de valores obtidos com a leitura de
tensão VP em uma carga de 50 Ohms, com a aplicação
d potencia em valores distintos. Como explicado pelo IK3OIL no link
acima.
Vinc = ((Vinc1 * 5.0) / 1024.0) + 0.5;
Vinc1 é a tensão medida pelo arduino ...e Vinc a
tensão Vp transformada em Volts de RF.
Na formula de Vinc a leitura digital varia de 0 a 1024 que se refere de
zero a 5V ... assim transforma a leitura digital em analogica, o 0,5V
que se somam ao resultado é a compensação da perda
da tensão de barreira do diodo.
Para não mostar a potencia como 0,25W quando Vinc for zero, o
software soma este valor somente quando a potencia for maior que
zero.

Esta foi a ponte de ROE SWR que montei como descrita pelo Francesco
IK3OIL para 100W, usei dois toroides de lampada economica e 35 voltas
de fio , o sinal de RF era pequeno e resolvi montar para menor potencia
com um toroide e 25 voltas, acertei o valor do resistor e do capacitor
de balanceamento (zero de retorno).
Conclusão :
Este ajuste automatico funciona bem, mas pode ter seu desempenho
melhorado, com uma antena com uma cobertura de banda menor e com a
construção usando um tubo de menor diametro, obtendo uma
banda mais larga dentro de 1:1 de estacionaria.
Outras melhorias seriam uma maior rigidez do sistema de acionamento,
com menor folga, de giro no eixo do motor e um acoplamento melhor entre
capacitor e motor.
Um motor com maior precisão tambem seria uma boa
opção.
Para cada caso é necessario um bom planejamento de montagem.
Este equipamento pode ser montado junto a antena, alimentado por
bateria por exemplo, não necessitaria de um display (nem a
medição de potencia) e entre antena e radio teria apenas
o cabo coaxial.
Duvidas e sugestões mandem um Email.
73 de py2ohh miguel feb/2020
Sketch (IDE 1.6.1) --- library counter
programa para o arduino
// entrada do frequencimetro pino 5 digital
#include <FreqCounter.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
float frq;
float frqin;
float frq2 = 30000;
int frqin0;
int frq20;
float pwr;
int flat;
const int motorPin1 = 8;
const int motorPin2 = 9;
const int motorPin3 = 10;
const int motorPin4 = 11;
float Vinc, Vref = 0, SWR;
int delayTime = 5;
const int fim1 = 4;
const int fim2 = 6;
int ehfim1 = LOW ;
int ehfim2 = LOW ;
float ROE = 1.01 ;
int inicio = LOW ;
// Inicializa o display no endereco 0x27 -this adress depends LCD type
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
Serial.begin(9600);
lcd.begin (16, 2);
lcd.setBacklight(HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" AUTO MAGLOOP ");
lcd.setCursor(0, 1);
lcd.print(" PY2OHH QRP_BR ");
delay(3000);
pinMode(motorPin1, OUTPUT); // motor passo
pinMode(motorPin2, OUTPUT); //motor de passo
pinMode(motorPin3, OUTPUT); //motor de passo
pinMode(motorPin4, OUTPUT); //motor de passo
pinMode(fim1, INPUT);
pinMode(fim2, INPUT);
Zero();
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
imprime();
}
void loop() {
FreqCounter::f_comp = 7; // Cal Value / Calibrate with
professional Freq Counter
delay(100);
FreqCounter::start(10); // values of 10, 100 or 1000 ms
are practicable for a resolution of 100, 10 and 1 Hz
while (FreqCounter::f_ready == 0) {
frq = (FreqCounter::f_freq);
}
frqin = (int(frq));
if (frqin < 11000 ) flat = 1;
if ((frqin < (frq2 + 5) || frqin > (frq2 - 5)) &&
(frqin > 11000)) flat = 2;
if ((frqin > frq2 + 6) && (frqin > 11000))
flat = 3;
if ((frqin < frq2 - 6) && (frqin > 11000)) flat =
4;
switch (flat) {
case 1 :
break;
case 2 :
break;
case 3 :
frq2 = (frqin);
frq20 = abs(frq2);
recua();
Vinc = ((Vinc * 5.0) / 1024.0) + 0.5;
pwr = (((Vinc) * (Vinc)) - 0.25 ) ;
if (pwr > 0 ) (pwr = pwr + 0.25);
imprime();
delay(2000);
break;
case 4 :
frq2 = (frqin);
frq20 = abs(frq2);
avanca();
Vinc = ((Vinc * 5.0) / 1024.0) + 0.5;
pwr = (((Vinc) * (Vinc)) - 0.25 ) ;
if (pwr > 0 ) (pwr = pwr + 0.25);
imprime();
delay(2000);
if (digitalRead(fim1) == HIGH) {
Zero() ;
}
break;
default : break;
}
}
void Zero()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" AGUARDE ");
lcd.setCursor(0, 1);
lcd.print(" ZERANDO ");
while (ehfim2 == LOW ) {
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
(inicio = HIGH);
break;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(5);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
(inicio = HIGH);
break;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(5);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
(inicio = HIGH);
break;
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
delay(5);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
(inicio = HIGH);
break;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(5);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
(inicio = HIGH);
break;
}
}
}
void avanca() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" AVANTE ");
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
while (SWR > 1.01) {
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
if (digitalRead(fim1) == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
if (digitalRead(fim1) == HIGH) {
break;
}
delay(delayTime);
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
Vinc = analogRead(2);
}
void recua() {
// while (ehfim2 = LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" VOLTA ");
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
while (SWR > 1.01) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, HIGH);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
ehfim2 = digitalRead(fim2);
if (ehfim2 == HIGH) {
break;
}
Vinc = analogRead(2);
Vref = analogRead(3);
SWR = (Vinc + Vref) / (Vinc - Vref);
if (SWR < ROE) {
break;
}
delay(delayTime);
}
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
delay(delayTime);
Vinc = analogRead(2);
}
void imprime()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("F kHz
P ");
lcd.setCursor(2, 0);
lcd.print(frq20);
lcd.setCursor(0, 1);
lcd.print("SWR :1/ W");
lcd.setCursor(4, 1);
lcd.print(SWR);
lcd.setCursor(11, 1);
lcd.print(pwr);
}