Go Down

Topic: [OT] richiesta di aiuto per programmino x Accordatore (Read 79542 times) previous topic - next topic

Maurotec

Per comprare quei relè hai fatto il finanziamento? :smiley-mr-green:

Io per adesso ho il cervello come il burro al sole e ho cose mie da fare che non so come fare, anche perché ormai ho fuso. Aspetto settembre nella speranza che il clima sia più favorevole ai mie neuroni.

Ciao.

Campa1957

#136
Jul 23, 2013, 06:05 pm Last Edit: Aug 02, 2013, 04:33 pm by Campa1957 Reason: 1
Ciao Mauro,

è vero costano un botto però non ti danno problemi.
C'è tutta una teoria su come pilotarli, che dice di sovraalimentarli e poi mettere una resistenza di caduta per ottenere una chiusura più veloce che invece dice di sotto alimentarli per farli durare di più!!!

Ne devo recuperare ancora mezza dozzina poi basta!!!

Campa1957

Campa1957

Ciao a tutti,

Il collega OM americano, che ho segnalato tempo addietro, ha aggiornato il suo lavoro. Se un'anima buona ha voglia di buttarci un'occhio.....

questo è il link:

http://blog.radioartisan.com/arduino-antenna-tuner/

Campa1957

Campa1957

Ciao a tutti,

finalmente ho trovato un po' di tempo per riprendere il mio lavoro!

come detto in un post pecedente ho inserito un buffer invertente sulle 6 uscite utilizzate fino ad ora di Arduino e ho fatto un po' di prove con un partitore resistivo per simulare la riduzione del segnale sull'ingresso della potenza riflessa.
un paio di cose che non mi sono chiare:
- vorrei capire se, fatta la prima lettura, aspetta il ritardo impostato e poi fa la seconda .... poi la terza ......
oppure si comporta in modo diverso ???
- il range di segnale sugli ingressi è corretto che sia da 0 a 5v ???

Allego il lavoro di Leo72 con inserimento della riga 59 (temporizazione)
Code: [Select]

//
// ACCORDATORE DI ANTENNE
// V. 1.0
// Scritto da Leonardo Miliani
// copyleft 2013 :-P
// GNU GPL 3.0
// relé induttori collegati sui pin D8..D13
// relé condensatori sui pin D0..D5
// led di stato su D7

void setup() {
   DDRB = 0b00111111; //pin PB0..5 come OUTPUT - questi pin comandano i relé degli induttori
   PORTB = 0b00000000; //segnale LOW sulle uscite
   DDRB = 0b11111111; //pin PD0..7 come OUTPUT - questi pin comandano i relé dei condensatori
   PORTD = 0b00000000; //segnale LOW sulle uscite
   DIDR0 |= ((1<<ADC2D) | (1<<ADC3D) | (1<<ADC4D) | (1<<ADC5D)); //spengo il buffer digitale sui pin PC2..5
   checkAntenna(0); //induttante
   delay(10000); //faccio leggere il led di stato AAAAA
   PORTB = 0b00000000;
   PORTD = 0b00000000;
   checkAntenna(1); //condensatori
}

void loop() {
}

void checkAntenna(byte Cap) {
   float ROS = 1.0; //ROS ideale AAAAA
   float realROS = 1.0; // AAAAA
   ROS = 1.45; //impostare qui il ROS fissato come obiettivo finale sull'antenna
   byte relais = 0;
   boolean exit = false;
   boolean done = false;
   float oldROS = readRos(); //lettura iniziale
   do {
       float realROS = readRos();
       if (realROS < ROS) {
           if (oldROS < realROS) {
               relais--;
               if (!Cap) {
                   PORTB = relais; //tolgo il relé precedente
               } else {
                   PORTD = relais;
               }
           }
           done = true;
           exit = true; //terminato
       } else { //correggo il ROS
           oldROS = realROS; //salvo la vecchia lettura
           if (++relais == 64) { //raggiunto il max di combinazioni
               exit = true; //esco
           }
           if (!Cap) {
               PORTB = relais; //aggiungo un relé in formato binario
           } else {
               PORTD = relais;
           }
        }
        delay(300); // Temporizzazione per poter vedere il funzionamento!!! Leo72/AZ
   } while (!exit);
   if (done) {
       PORTD |= (1<<7); //accende il led "OK"
   }
}


float readRos() { //lettura del ROS
   int pot_rifl = readAnalogInput(A0); // lettura della pot. riflessa AAAAA
   int pot_dir = readAnalogInput(A1); // lettura della potenza diretta AAAAA
   return ((1.0 + (float)(pot_rifl / pot_dir)) / (1.0 - (float)(pot_rifl / pot_dir))); // calcolo del ROS AAAAA
}


int readAnalogInput(byte input) { //lettura con media di un pin
   int tempRead = 0;
   for (byte i = 0; i < 10; i++) {
       tempRead += analogRead(input);
   }
   return (tempRead /= 10);
}


Campa1957

leo72

Ciao, ti rispondo qui.
Il mio programma non ha attese fra una impostazione e la successiva.
Ma il programma era una bozza, doveva servirti per poterti permettere di lavorarci sopra in autonomia. Mi sembra di capire però che di programmazione sei messo maluccio, quindi non hai sviluppato niente in più giusto?

Se mi dici come si deve comportare il programma, potremmo vedere di modificarlo. Puoi inserire uno o due pulsanti, sul tuo circuito? Ne potremmo usare uno per avviare/far ripartire la procedura d'accordatura, ad esempio.

Campa1957

#140
Aug 02, 2013, 06:22 pm Last Edit: Aug 03, 2013, 07:34 am by Campa1957 Reason: 1
Ciao Leo

Quote

Il mio programma non ha attese fra una impostazione e la successiva.

A questo proposito mi avevi suggerito di inserire alla riga 59 un ritardo
Quote

Ma il programma era una bozza, doveva servirti per poterti permettere di lavorarci sopra in autonomia. Mi sembra di capire però che di programmazione sei messo maluccio, quindi non hai sviluppato niente in più giusto?

Le mie capacità come programmatore sono pari ZERO  :smiley-red:  :smiley-red:  :smiley-red:
Quote

Se mi dici come si deve comportare il programma, potremmo vedere di modificarlo. Puoi inserire uno o due pulsanti, sul tuo circuito? Ne potremmo usare uno per avviare/far ripartire la procedura d'accordatura, ad esempio.


Sicuramente possiamo utilizzare un paio di pulsanti, direi di collegarli agli ingressi analogici A3 e A4.

Ricapitoliamo il tutto:
1) leggere i due segnali con range 0 - 5v su A1 e A2
2) applicare la formula di calcolo del ROS
3) se valore ROS <= del valore impostato, non fare nulla
4) se valore ROS > al valore impostato, attivare le uscite "L" per inserire in serie all'antenna delle induttanze, dopo ogni inserimento di una uscita, inserire piccolo ritardo al solo scopo di visualizzare al meglio il funzionamento del sistema, deve essere rifatta la lettura ed il calcolo del ROS, fino al reggiungimento del miglior valore di ROS possibile
5) quando all'inserimento dell'ultima combinazione di relè il valore di ROS sale, invece che scendere, si deve tornare alla combinazione precedente.

finito di attivare le uscite "L" si passa alle uscite "C" ma direi che della cosa ne possiamo parlare più avanti, il procedimento è lo stesso salvo fare una scelta, se attivare o meno un'uscita, una volta inserito il primo scalino.

Campa1957


leo72


Campa1957

Mi permetto di aggiungere ancora una cosa a quanto detto sopra.

La versione finale dovrebbe essere pensata per 8 uscite "L" + 8 uscite "C" + 1 uscita selezione punto inserimento condensatori + 1 uscita Accordo OK.

Arduino UNO rev.3 redo che permetta di utilizzare come uscite anche una parte degli ingressi anaogici ?!?

Campa1957

leo72

Usando l'Arduino la cosa si complica perché le uscite PB6 e PB7, che permetterebero di manipolare direttamente le porte del microcontrollore, sono occupate dal risonatore. Andrebbe rivisto il codice rispetto a quello che è ora.

Campa1957

#144
Aug 03, 2013, 10:27 am Last Edit: Aug 03, 2013, 10:29 am by Campa1957 Reason: 1
Non voglio assolutamente incasinare troppo il lavoro, andiamo avanti così, come siamo partiti!

Campa1957


leo72

In allegato il programmino rivisto.
Ho spostato alcune cose sui pin, anche in risposta allo spostamento su A1/A2 che mi hai detto tu degli ingressi analogici che usi per leggere il ROS. Il led è su A0, ora. Poi metti un pulsante su A3 collegati a massa, non usare resistenze di pull-u che attivo quella interna al pin.

La logica è questa. All'avvio, lampeggia il led in attesa della pressione del pulsante per avviare l'accordatura.
Premuto il pulsante, fa l'accordatura con gli induttori, ad intervallo di 1 secondi tra un'attivazione e l'altra. La scansione è scandita dal lampeggio del led. Quando trova l'accordatura giusta, fa 3 lampeggi veloci ed esce e passa all'accordatura con i condensatori. Se vuoi saltare questo passaggio, commenta la chiamata dell'accordatura con i condensatori. Terminata la procedura, torna all'inizio.

PROGRAMMA NON TESTATO, non ho breadboard libere  :smiley-sweat:
Dimmi se funziona e se fa cosa dovrebbe. Se vuoi usare 8 induttori, possiamo invertire i pin usati, quello non è un problema. 

Campa1957

Primissima verifica di funzionamento:

senza nuovo led e pulsante, appena caricato il SW parte, arriva ad un punto di accordo, aspetta un paio di secondi e ripete il cilclo.

Nel pomeriggio cerco un pulsante e un led e li collego per continuare le prove.

Campa1957

Campa1957

#147
Aug 03, 2013, 01:26 pm Last Edit: Aug 03, 2013, 02:06 pm by Campa1957 Reason: 1
Inserito Led, sempre senza pulsante collegato.

confermo che quando arriva a quello che vede come punto di accordo si ferma, il led lampeggia ad un'altra frequenza, e dopo un paio di secondi resetta le uscite e riparte da ZERO.
Quando ha trovato il primo punto 'di accordatura' non deve disabilitare le uscite ma lascire tutto come ha calcolato fino a quel momento, e poi passare ad inserire i condensatori.

Adesso provo a spiegare la mia idea su cosa dovrebbe fare quando ha sistemato la parte "L"

1) leggere i due segnali in ingresso e calcolare il nuovo ROS e memorizzarlo
2) inserire il primo scalino della serie "C"
3) una volta attivata la prima uscita della serie "C" leggere e calcolare il nuovo valore di ROS
4) attivare un'uscita che non fa' parte di nessuno dei due gruppi "L" e "C"
5) Verificare se ultimo valore di ROS dopo l'inserimento della nuova uscita è sceso oppure salito
6) se è sceso lasciare inserita l'uscita e fare lo stesso giro di calcoli con la serie "C"
7) se è salito disabilitare nuova uscita e fare lo stesso giro di calcoli con la serie "C"

Spero di essere stato almeno comprensibile nelle mia descrizione.

ciao

Campa1957


leo72

Lo sketch precedente aveva una parte del vecchio 1.0 che non avevo cambiato e che di dovrebbe aver dato quei problemi iniziali.
Vediamo se così ora va la logica. Parte, lampeggia ed aspetta il pulsante. Premendolo, inizia la taratura con gli induttori. Trovata la taratura, aspetta la pressione del pulsante mentre lampeggia il led.

Se così va bene, poi passiamo al resto delle tue richieste.

Campa1957

#149
Aug 03, 2013, 03:57 pm Last Edit: Aug 03, 2013, 04:21 pm by Campa1957 Reason: 1
Ho caricato il SW sulla scheda di Arduino, il comportamento è sempre uguale, una volta raggiunto il valore 'di accordo' resetta le uscite.
Non deve farlo!

Per chiarezza spiego come faccio le prove 'in bianco', senza RF.
1) trimmer multigiri collegato fra 0V e +5V con cui imposto la tensione per la misura della potenza diretta, quella che va in antenna.
2) partitore resistivo con il quale all'inserire delle varie uscite, relè che aprono il loro contatto, la tensione della potenza riflessa scende.

Campa1957

Go Up