Domanda:
Ottenere due (o, uno e mezzo) output da un singolo pin
Paolo Bonzini
2017-10-15 21:34:40 UTC
view on stackexchange narkive permalink

Sto realizzando un progetto con un ATtiny85 e ovviamente sono a corto di pin I / O.Un'idea che ho avuto è stata quella di utilizzare un singolo pin per due uscite (chiamiamole EN e DATA).

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

So che DATA non ha importanza quando EN = 0.In altre parole, queste due uscite possono assumere solo i valori EN = 0 / DATA = x, EN = 1 / DATA = 0, EN = 1 / DATA = 1.Esiste un modo semplice per mappare, ad esempio, da 0 a EN = 0 / DATA = x, da 1 a EN = 1 / DATA = 1, Z (pin di ingresso) a EN = 1 / DATA = 0?Il consumo energetico è importante solo quando EN = 0.

Non da un input binario.Se usi un ingresso ADC potresti.
Non ho capito bene!Il titolo dice "* Ottenere uno 0 e un 1 da un input fluttuante *" ma la domanda dice "* usa un singolo pin per due output *".Cos'è questo?
@Transistor: Vorrei ottenere due uscite (tre stati in totale) dalla mia scheda utilizzando un singolo pin GPIO dal microcontrollore e un po 'di logica di colla sulla scheda.La mia idea era che il microcontrollore potesse configurare il pin come output-low / output-high / input per ottenere gli stati desiderati.
@Trevor: potrebbe essere possibile utilizzare un'uscita PWM invece dell'input fluttuante poiché non ne sto usando nessuno, ma come potrei farlo?;)
@Paulo: Non è ancora chiaro.Stai cercando di utilizzare un pin per due * uscite * o stai tentando di monitorare due segnali su un pin di ingresso.C'è un pulsante schematico sulla barra degli strumenti dell'editor.Disegnalo.Devi modificare la tua domanda.
@Transistor: un pin per due uscite, ha aggiunto uno schema
È molto più facile ottenere 5 uscite da 4 pin che 2 uscite da 1 pin.Forse stai facendo la domanda sbagliata.
Sono disponibili 3 stati di uscita: 0, 1 e hi-Z;quindi usa 2 R per impostare la tensione hi-Z a metà, quindi 2 comparatori per dare 00, 01 (o 10) e 11.
Quindi dubito che le soluzioni PWM siano ciò che stai cercando, ma il mio primo pensiero è la telefonia.I telefoni trasmettono tutti i numeri sulla tastiera utilizzando un unico filo (più un ritorno).E sono certo che ci sia l'hardware per farlo =)
Hai tre stati distinti.Potresti fare qualcosa con il pin basso per uno stato, il pin alto per lo stato successivo e il pin alto-alto-basso reale rapidamente per il terzo stato?
Sette risposte:
Marcus Müller
2017-10-15 22:09:24 UTC
view on stackexchange narkive permalink

Verità onesta: quello che stai cercando di fare è implementarlo più facilmente semplicemente utilizzando un microcontrollore con abbastanza pin.Probabilmente è anche più economico di un Attiny85.Chi lo sa.

Ma: se proprio devi, puoi fare varie cose per ottenere più output da una singola riga:

  • Acquista un espansore IO che utilizza lo standard 1-Wire (pseudo) e implementa un trasmettitore 1-Wire su Attiny
  • Anche un dispositivo UART potrebbe andare bene, ma non conosco adattatori UART a IO a filo singolo che in realtà non siano solo un altro microcontrollore programmato
  • Implementa un DAC, seguito da un ADC
    • DAC mediante PWM dell'output,
    • alimentare il PWM in un filtro passa basso RC, producendo un voltaggio variabile "regolare"
    • acquista un ADC con output parallelo economico, o
    • implementa il tuo ADC con uscita parallela con diodi Zener
Potrebbe essere davvero una soluzione (acquistare un altro microcontrollore :) o semplicemente usare PB5 e un programmatore ad alta tensione).È principalmente un esercizio di apprendimento dell'elettronica, che costruisce il mio espansore I / O con la minima programmazione possibile e una logica collante discreta.Stavo pensando di usare resistori e diodi, ma non sono riuscito a farlo funzionare.
Votato.Ho una soluzione nota per funzionare ma richiede che il pin in questione sia avanzato in modo innaturale.
Marcus Müller
2017-10-15 23:07:22 UTC
view on stackexchange narkive permalink

Ovviamente sono un nerd, quindi ecco le soluzioni che è meno probabile che vengano implementate da te, ma vale la pena menzionarle per il gusto di farlo:

Shenanigans basati sul registro dei turni

Le seguenti idee si basano su registri a scorrimento da seriale a parallelo.

Pin di uscita -> Ingresso dati

Puoi semplicemente spostare i tuoi dati sull'ingresso dati seriale del tuo registro a scorrimento.

Problem: I registri a scorrimento hanno bisogno di un orologio per sapere quando "campionare" l'input.

Solution: Genera un impulso di clock ogni volta che l'input cambia.

N Nuovo problema: OK, possiamo farlo con una semplice porta logica AND, combinando il tuo DataIN e una versione minimamente ritardata del suo output (ritardo attraverso componenti discreti, ad esempio un filtro RC). Ma: allora possiamo avere solo schemi di bit alternati.

Solution: La sequenza di output del tuo pin deve essere sempre

0->1 [lungo] ->B [breve] ->0 .

Quello che succede qui è che il primo 1 carica un condensatore (da qui il "lungo" 1), la tensione attraverso quel tappo innesca un one-shot ritardato (ad esempio, attraverso un NE555) quando attraversa una soglia, che quindi provoca un impulso di clock per il registro a scorrimento.

Nel momento in cui si verifica l'impulso, hai già impostato il bit di uscita desiderato B sull'uscita. Deve essere più breve di 1 "fisso" per evitare di attivare nuovamente l'impulso di clock.

Fai quanto sopra due volte per spostare in due diversi bit B1 e B2 nel registro a scorrimento.

È possibile implementare lo schema di invio di cui sopra

  0b1111BB00
 

con l'unità UART (se il tuo microcontrollore lo ha).

Se guardi da vicino, questo è molto simile a quello che fanno le cose "neopixel" di WSxxxx per comunicare: 0->1 segna l'inizio di un punto e la quantità di 1 all'interno di quel periodo imposta se è uno 0 logico o 1.

Pulsazione popolare passiva polinomiale

Questo richiedeva un titolo in rima. In verità, questo dovrebbe probabilmente essere chiamato "generazione di registro a scorrimento a retroazione lineare di una sequenza di output" o giù di lì.

L'idea è che quando si utilizza un registro a scorrimento e si collega il suo ingresso a una combinazione logica delle sue celle interne, è possibile costruire qualcosa che cicla tutti i possibili stati di uscita (se si sceglie la funzione di feedback in modo appropriato). Lo spiegherei qui, ma meh, pigro, quindi leggi l'articolo di wikipedia sui registri di spostamento del feedback lineare.

Da asporto: se puoi avere un LFSR di questo tipo, puoi, semplicemente attivando il suo clock, ottenere tutti gli output (cambia solo il giusto numero di volte).

Doh '. È carino, ma è più difficile da spiegare di un contatore

Ovviamente, quanto sopra è molto interessante (perché ha numerose applicazioni, ad esempio nella comunicazione, nel controllo dell'integrità dei dati e così via), ed è molto efficace in termini di numero di porte di cui hai bisogno per questo, ma:

Puoi anche acquistare o costruire un contatore a 2 bit (o più). E conta le levette della tua spilla Attiny. L'output di bit parallelo del contatore può essere il tuo 2 pin di output (o più).

Penso che la dice lunga ho pensato prima a LFSR invece che a contatori.

Discriminazione basata sulla frequenza

Filterbank con due frequenze discrete

L'idea è semplice:

  1. Genera due frequenze diverse con il pin, ad esempio, attivandolo con una frequenza di 1 kHz (cioè ogni 1 ms l'uscita si ripete, devi alternare ogni 500 µs), oppure a 2 kHz (alternare ogni 250 µs) o il somma logica di entrambe le oscillazioni (un po 'difficile da fare nella testa, ma si riduce ad avere periodi alti e lunghi alternati).
  2. Filtra l'output con due filtri diversi:
    1. un filtro passa-basso che lascia passare solo tutto ciò che è sotto, diciamo 1.2 kHz, un RC andrà bene
    2. un filtro passa banda che lascia passare 2 kHz, ma non 1 kHz né 3 kHz.
  3. rettifica e filtra passa-basso l'uscita di questi due filtri. Tada, hai costruito un ricevitore 2FSK a 2 toni, se sei così incline.
  4. Questi sono i tuoi due segnali di uscita; utilizzare un dispositivo di soglia, un "discriminatore" (diodo Zener, comparatore) per convertirli in binario 0 o 1.

Bonus

Se non usi 1 e 2 kHz, ma un paio di MHz, puoi effettivamente sostituire il cavo di collegamento con antenne adatte e farlo trasferire via etere. Infrangeresti la legge anche abusando dello spettro per il quale non hai licenza.

PWM che

Idea: come sopra, ma più semplice.

Lascia che ci siano due informazioni indipendenti:

  1. Ciclo di lavoro in uscita> 50%
  2. Tutte le modifiche all'output

Puoi avere il ciclo di lavoro> 50% sia

  • cambiare il pin costantemente alto (ciclo di lavoro 100%) o basso (0%) o di
  • impostare l'unità PWM in modo da ottenere un ciclo di lavoro del 25% o del 75%.

Quindi, come sopra, un filtro passa basso, seguito da un discriminatore che commuta a metà dell'intervallo di tensione di uscita, fornisce il primo bit di uscita.

Un filtro passa-alto, seguito da un raddrizzatore, un condensatore e un discriminatore ti danno il secondo bit.

frarugi87
2017-10-16 16:59:28 UTC
view on stackexchange narkive permalink

È possibile utilizzare due comparatori e i valori alto-input-basso. Ad esempio:

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

I due comparatori daranno un 1 logico quando la tensione in ingresso è maggiore di 3/4 * Vcc (DATA uno) o 1/4 * Vcc (EN one).

Quando il pin attiny è abbassato, la tensione sarà fissata a 0V; i comparatori avranno quindi valore 0 e 0. Quando il pin sarà lasciato flottante (impostato come ingresso), la tensione andrà a Vcc / 2 per effetto delle due resistenze; i comparatori mostreranno 1 per EN, 0 per DATA. Quando il pin viene tirato in alto, la tensione sarà fissata a Vcc; entrambi i comparatori mostreranno un 1. Riassumendo:

  Stato del pin | EN | DATI
------------------------
  OUT 0 | 0 | 0
  INPUT | 1 | 0
  OUT 1 | 1 | 1
 

Nota che questo non è scalabile a differenza delle soluzioni con PWM o espansore di porte. Se hai bisogno di più pin, forse è meglio prendere un registro a scorrimento e dedicargli due pin (clock e dati); in questo modo avrai più output se ne avrai bisogno.

EDIT: un'altra soluzione, che non prevede l'utilizzo di circuiti integrati ma solo componenti discreti, è la seguente:

schematic

simula questo circuito

In questo caso, dovrai scegliere i MOS in modo che possano accendersi con Vcc / 2; si noti che i valori delle resistenze possono essere aumentati anche se si desidera un flusso di corrente inferiore. Puoi anche cambiare il P-MOS con un PNP e l'N-MOS con un NPN, ma dovrai aggiungere un resistore limitatore di corrente sulla loro base (e non sono sicuro di come questo influenzi i tre stati).

In ogni caso, ecco la tabella che mostra gli stati

  Stato del pin | EN | DATI
------------------------
  OUT 0 | 1 | 1
  INPUT | 1 | 0
  OUT 1 | 0 | 0
 
Più elegante della mia soluzione.Ho dimenticato l'opzione tri-stato.+1.
Questo è il più vicino a ciò a cui stavo pensando.A Vcc = 3,3 V, BSS84 e BSS138 dovrebbero funzionare per i MOSFET.Per ridurre il consumo di corrente per EN = 0 potrei aggiungere due diodi tra R1 e R2, collegando l'ingresso tra i diodi e le porte sui due lati.Quindi la parte destra del circuito può utilizzare inverter CMOS.Quando l'ingresso è flottante, dovrebbero andare rispettivamente a 0 (per DATA) e 1 (per EN).
@PaoloBonzini tieni presente che potresti lavorare leggermente fuori dalle specifiche, poiché la tensione di soglia è molto vicina a Vcc / 2 ... Per quanto riguarda i diodi, perché dovrebbe diminuire il consumo energetico?Puoi (e probabilmente dovresti) aumentare il valore dei resistori fino a qualche centinaio di kiloohm.Per quanto riguarda i CMOS, tieni presente che la regione tra 0,8 V e 2,0 V è vietata (quindi 1,65 V non va bene per le porte CMOS).
I diodi darebbero una tensione diversa ai gate anziché 1,65 V per entrambi, in modo da poter utilizzare inverter CMOS (discreti, non 7404) e diminuire il consumo di energia statica.Ha senso?
Transistor
2017-10-15 22:36:50 UTC
view on stackexchange narkive permalink

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

Figura 1. Una semplice codifica binaria a 3 stati alimentata attraverso un filtro passa-basso e monitorata da due comparatori per estrarre i dati.Nota che molti comparatori sono output a collettore aperto e richiedono un resistore di pull-up.

Dovrai affrontare alcune difficoltà per ottenere la costante di tempo R1-C1.

sì, bello, questa è una delle possibili implementazioni di ADC menzionate nella mia [prima risposta] (https://electronics.stackexchange.com/a/334574/64158).
TLW
2017-10-16 00:21:37 UTC
view on stackexchange narkive permalink

Una (cattiva) soluzione è la seguente.

data = gpio
trigger schmitt invertito debole da gpio a gpio.
monostabile riattivabile invertito da gpio a en.

L'idea di base è che se l'output è tristato, lo schmitt lo farà oscillare, il che sarà rilevato dal monostabile per disabilitare l'uscita.Questo però si guasterà quando si disabilita l'output.E ha un consumo energetico quando è disabilitato.

In realtà non è una cattiva idea.Ho dimenticato l'opzione tri-stato quando ho scritto la mia risposta.Inseriscilo in un antirimbalzo RC sull'input dell'altro chip.Il secondo chip può leggere lo stato dell'input, commutare l'input in un'uscita e provare a portarlo all'altro livello logico, rilasciarlo e vedere se rimane lì.Se lo fa, il primo chip viene dichiarato in tre.In caso contrario, sono dati.Rafforza la tua risposta.
Per risolvere il problema del consumo energetico, potrei semplicemente invertire la direzione di EN e DATA.
Nick Gammon
2017-10-17 00:53:37 UTC
view on stackexchange narkive permalink

A meno che tu non stia eseguendo un compito che specifica che devi usare un Attiny85, non importa cosa, allora la soluzione di gran lunga più semplice è usare un chip con più pin (es. Atmega328P). Il costo sarebbe praticamente lo stesso (ad es. $ 2,00 rispetto a $ 1,50).

Alcune delle altre risposte che suggeriscono di utilizzare un protocollo a filo, registri a scorrimento, trigger schmitt, comparatori, ecc. stanno semplicemente aggiungendo più parti (e costi) comunque. Sarebbe molto più facile usare un microprocessore che fa effettivamente quello che vuoi, piuttosto che aggiungere chip extra per estenderne le funzionalità in un modo meno facile da usare.


Un'altra possibilità: il pin / RESET può essere configurato come un pin IO generale. Puoi ottenere una spilla in più in questo modo. Tieni presente che riprogrammarlo in seguito sarà più difficile. Detto questo, non è impossibile. Ho un post sulla programmazione ad alta tensione di chip come Attiny85, utilizzando un altro processore (in questo caso un Arduino Uno). Alcune parti consentono di accendere il 12V al pin / RESET al momento opportuno.

AaronD
2017-10-17 01:46:40 UTC
view on stackexchange narkive permalink

Scorporando il secondo esempio di @ frarugi87 ( https://electronics.stackexchange.com/a/334700/53375), potresti fare una cosa simile con gli optoisolatori:

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

Il vantaggio di questa versione è che può consumare pochissima corrente se la tensione diretta degli optos (inclusi eventuali diodi extra in serie per garantire ciò) è più della metà dell'alimentazione.Ovviamente, non può essere più della fornitura completa o non arriveranno mai.

OUT0 e OUT1 possono avere i nomi appropriati e le resistenze pull-up / down per produrre la combinazione di segnali che desideri.

È pulito, ma fai attenzione che con il GPIO tri-affermato che entrambi i LED saranno in qualche modo a conduzione.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...