Vai al contenuto

Lettura segnale da sonda lambda

Home Forum Discussioni su problematiche generali Lettura segnale da sonda lambda

  • Questo topic ha 7 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 7 mesi fa da Anonimo.
Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Autore
    Post
  • #35087
    Anonimo
    Inattivo

    Ho bisogno di un sensore lambda per controllare il tenore di ossigeno nei fumi di scarico di un generatore di vapore, ho trovato il sensore ma non riesco a trovare un elettronica di controllo che possa adattarmi il segnale per l’uso con lo slimline.

    Avete suggerimenti ?

    #36920
    Sergio Bertana
    Amministratore del forum

    Le sonde lambda hanno una uscita in tensione variabile tra 0 ed 1 volt in funzione del rapporto di ossigeno presente nei fumi di scarico e quello ambientale.

    Utilizzando il modulo espansione I/O analogico della famiglia SlimLine, è possibile configurare l’ingresso per acquisizione differenziale con fondo scala di 1 volt. Tenuto conto che il convertitore è un 19 bit hai sicuramente la capacità di acquisire un dato molto preciso.

    Su valori così bassi di tensione consiglio di usare un cavo twistato e schermato per la connessione della sonda agli ingressi del modulo analogico, e di tenere al minimo la lunghezza del cavo.

    #36960
    Anonimo
    Inattivo

    Ho utilizzato un sensore lambda con uscita in CAN bus, ora scrivo per avere un aiuto riguardo alla comunicazione tramite CAN bus. Nel documento allegato è riportato lo schema di collegamento ed il formato frame dati.

    Per la ricezione del frame ho utilizzato un programma in ST che utilizza la funzione SysCANRxMsg, di seguito il codice sorgente del programma:

    SysCANRxMsg(16#3fffffff, 16#00000123, ADR(CANMsg));
    MB_TenoreOssigeno:= CANMsg.Data[4]/1000;

    Ma, in fase di compilazione ottengo questo messaggio:

    READFIELDBUS(3) – warning S1300:  SYSCANRXMSG => Function return value ignored
    1 warnings, 0 errors.

    Quale può essere il problema ?

    #36961
    Sergio Bertana
    Amministratore del forum

    La funzione SysCANRxMsg come si vede dal manuale ritorna una variabile BOOL, il cui significato è:

    FALSE: Messaggio non ricevuto
    TRUE: Messaggio ricevuto

    La warning stà ad indicare che è stata utilizzata la funzione senza eseguire il controllo sul suo valore di ritorno. Inoltre il valore del tenore di ossigeno sarà valido solo se il messaggio è stato ricevuto. Quindi consiglio di riscrivere il programma nel modo.

    IF SysCANRxMsg(16#3fffffff, 16#00000123, ADR(CANMsg)) THEN
        MB_TenoreOssigeno:=CANMsg.Data[4]/1000;
    END_IF;

    #36962
    Anonimo
    Inattivo

    SI, dopo aver postato mi sono reso conto che il warning dipende da questo. Il mio problema però persiste, sto monitorando i valori ottenuti:

    CanRcv := SysIsCANRxTxAv(FALSE);

    read := SysCANRxMsg(16#00000000, 16#00000121, ADR(CANMsg));
    MB_TenoreOssigeno := CANMsg.Data[4]/1000;

    CanRCV mi risulta sempre FALSE, tutti i campi della variabile CANMSG assumono valore 0, c’è qualcosa da preconfigurare sullo slimline ?

    C’è qualche tentativo che posso fare per verificare l’effetiva trasmissione di messaggi dal dispositivo lambda ?

    #36963
    Sergio Bertana
    Amministratore del forum

    Così com’è il programma non è formalmente corretto, occore prima controllare se è stato ricevuto un frame CAN, poi eseguirne la lettura e salvare i valori letti solo se lettura positiva.

    Eseguendo sempre la lettura se non sono stati ricevuti messaggi il frame di ritorno è sempre azzerato, quando viene ricevuto un messaggio i campi sono valorizzati, ma subito dopo vengono riazzerati. Ecco come dovrebbe scrivere il programma:

    IF SysIsCANRxTxAv(FALSE) THEN
        RxFrame:=TRUE; (* Flag che indica ricezione frame da azzerare in debug *)

        IF SysCANRxMsg(16#3fffffff, 16#00000123, ADR(CANMsg)) THEN
            RxData:=TRUE; (* Flag che indica ricezione dati da azzerare in debug *)
            MB_TenoreOssigeno:=CANMsg.Data[4]/1000;
        END_IF;

    END_IF;

    Come si vede ho definito due variabili BOOL che devono essere azzerate in debug, la variabile RxFrame è settata su ricezione di un qualsiasi frame CAN. La variabile RxData è settata se ricevuto un frame dalla sonda lambda.

    Per testare il protocollo CAN esistono degli appositi analizzatori di protocollo, ma con un oscilloscopio è almeno possibile vedere se la sonda trasmette.

    #36964
    Sergio Bertana
    Amministratore del forum

    Aggiungo una nota sulla acquisizione del valore di ossigeno dal frame CAN. Non ho il tuo programma, ma ti ricordo che CANMsg.Data è un array di USINT, ed il valore che ricevi è riportato su due USINT. Quindi per leggerne il valore devi scrivere:

    MB_TenoreOssigeno:=(TO_UINT(CANMsg.Data[4])*256)+CANMsg.Data[5];
    MB_TenoreOssigeno:=MB_TenoreOssigeno/1000;

    Questo è verò se il valore nel messaggio CAN è scritto nel formato big-endian (La memorizzazione inizia dal byte più significativo per finire col meno significativo). Se invece è di tipo little-endian devi invertire i due valori di CANMsg.Data.

    #36965
    Anonimo
    Inattivo

    Il produttore della centralina mi pone le seguenti domande:

    La velocità di connessione e corretta ?
    NON SO COME VERIFICARLO OD IMPOSTARLO SULLO SLIMLINE.

    Il settaggio della tipologia di messaggio (estesa o standard) è corretta ?
    NON SO DI COSA SI TRATTI

    L’allineamento del messaggio (intel o motorola) è corretto ?
    HO SCELTO ALLINEAMENTO MOTOROLA PENSANDO ALLA BASE RISC DELL’ARCHITETTURA ARM

    Misurando la resistenza della linea dovrebbe avere un valore <= 120 ohm.
    HO VERIFICATO CHE SIA COSI’

Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Devi essere connesso per rispondere a questo topic.