Circuito per leggere la resistenza di una fase di un motore brushless

Buongiorno,

come da titolo sto cercando di sviluppare un circuito per misurare la resistenza di un 4 motori BLDC 24V al fine di riconoscerli prima di andare ad alimentarli.

  • MCU ESP32 Adafruit.
  • 4 motori BLDC con le seguenti resistenze tra due fasi 4-5-8-16 Ohm.
  • Obbiettivo capire quale motore sia connesso alla board prima di alimentarlo.

fatta questa premessa passiamo al mio problema:
il circuito che ho pensato (di cui allego immagine) è composto da due mosfet N che fungono da interruttori, un diodo e una resistenza per formare il partitore di tensione.

I gate dei due mosfet sono comandati da un pin dell'ESP, mentre prendo 3V3 per alimentare il partitore resistivo dal lineare montato sulla board, il problema sorge perché con i componenti da me utilizzati tutto il circuito ha una resistenza di quasi 700 Ohm e quindi la resistenza del motore è influente e non riesco quindi ad identificarlo.

Ora ho a disposizione solo mosfet 2n7000 e diodi 1n4007, quindi vorrei un consiglio su quali componenti siano più indicati per quello che voglio fare non essendo molto pratico :cold_sweat:

Grazie

Ammettiamo che Q1B e Q1A siano in piena conduzione è la RDSON sia prossima a zero. In queste condizione nel partitore scorre una corrente di circa 340mA quando Rphase = 4ohm e circa 135mA quando Rphase = 16ohm. Dubito che il regolatore a 3.3V possa reggere questa corrente senza andare in protezione.

Mi pare che 16 + 3.9 = 19.9ohm

Ddrop = 0.6 (caduta di tensione sul diodo)
Vout = 3.3-0.6 = ~2.7V
I = V/R = 2.7/19.9 = 0.135A

Mentre se R6 = 39ohm
2.7 / (39 + 16) = 0,049A (49mA) e dovresti leggere 1,911

oppure: 2.7 / (39 + 4) = 0,062A (62mA) e dovresti leggere circa 2.4V

Ora sappiamo che RDSON non è molto prossima a zero ohm per cui se ipotizziamo 7 ohm per ciascun mosfet sono 14 ohm, quindi alla 39 + 14 + 16 = 69ohm
2.7/69 = 0,039A (39mA)

Ciao.

Però correggimi se sbaglio, nel mio caso Vgs = Vds quindi sono in zona di saturazione e quindi non sono in zona di piena conduzione.

Come potrei risolvere tale problema ?

Mentre per quanto riguarda RDSon opterei per un mosfet con tale caratteristica nel ordine dei milli Ohm.

Avrei anche pensato a sostituire i mosfet n-channel con quelli p-channel e quindi avere un circuito normalmente chiuso che viene aperto dallo stato HIGH di un pin digitale del micro, ma non mi convince il fatto molto l'idea di avere un "interruttore" tenuto aperto solamente grazie allo stato HIGH di un pin, ma magari è solo una mia impressione ::slight_smile:

In effetti Q1A dovrebbe essere a canale P e il gate mantenuto pullupd da una resistenza da 10k, così quando lo spingi LOW con il pin passa in saturazione. Se scolleghi il pin arduino Q1A risulta interdetto dalla R di pullup.

Per fare le prove e trovare le formule per capire quale motore è stato collegato penso che puoi ponticellare Q1A lasciando Q1B come da schema. Per il 2N7000 il manuale dice che RDSON vale circa 5 ohms e allora se sai la corrente che scorre puoi calcolare la tensione che cade su RDSON, puoi anche misurarla con il tester la V su rdson. Allora collegando un ingresso ADC direttamente sulla fase bassa (li hai nominati allo stesso modo V/2.3B) leggi la tensione che cade su RDSon.

4 ohm phase

4 ohm + 5 RDSon = 9 ohm
I = 2.7V / 9 = 0.3A (300mA)
Vrdson = 5 * 0.3A = 1.5V.

8 ohm phase

8 ohm + 5 RDSon = 13 ohm
I = 2.7V / 13 = 0.207A (207mA)
Vrdson = 5 * 0.207A = 1.038V.

5 ohm phase

5 ohm + 5 RDSon = 10 ohm
I = 2.7V / 10 = 0.27A (270mA)
Vrdson = 5 * 0.27A = 1.35V.

Puoi anche fare le prove per confermare le formule senza mosfet e al posto della RDSon di 5 ohm ci metti una R da 4.7 ohm, anzi direi proprio che devi procedere così, poi passi ad inserire un mosfet per volta e se i calcoli non tornano sai l'errore introdotto dal mosfet e lo usi per fare quadrare i conti.

Ciao.

PS: serve sempre un sorgente di 3.3V in grado di erogare almeno 500mA.

Come mosfet potresti usare FDN335N e FDN336P (rdson 200mohm).
Con FDN335N dovrai connettere il source ad una R campione e l'altro capo a GND, perche la RDSon di questo mi pare sia soli 70mohm.

3 edit, quando finirò: Occhio che la ID del 2N massimo 200mA (500mA impulsivo)

Penso di essere arrivato a buon punto e soprattutto grazie ai tuoi suggerimenti penso di aver capito.

A tal proposito allego 2 schermate fatte con il simulatore di circuiti, dove ho simulato le due possibili situazioni, come componenti ho utilizzato quelli da te indicati mentre per il diodo ho usato uno Schottky(RSX101, penso possa andare) per ridurre la caduta di tensione.

Ovviamente sul gate del n-mosfet metterò una res di pulldown da 10k per evitare strani comportamenti dello stesso in fase di avvio.
Dovrebbe essere tutto giusto :sweat_smile:

Unica cosa è che mi tocca avere due pin distinti per ogni gate e non uno solo, a meno che non ci siano altre soluzioni per comandare insieme i due mosfet.

Per quanto riguarda la corrente assorbita userò uno regolatore fatto 24 -> 3V3 fatto con MC34063 e quindi il problema non dovrebbe porsi.

Ho un altra domanda però, gli ingressi analogici dell'ESP32 vanno da 0 a 3V3 e da 0 a 4095, quale ordine di grandezza posso tenere per reputare la misura affidabile ?

Perché correggimi se sbaglio ma mi sembra abbastanza utopistico (3,3V/4095 = 0,0008) apprezzare differenze inferiori al millivolt.

Unica cosa è che mi tocca avere due pin distinti per ogni gate e non uno solo, a meno che non ci siano altre soluzioni per comandare insieme i due mosfet.

Certo che c'è, il gate del mosfet P (lo chiamo Q1) lo colleghi al collettore di un bjt npn bc548-47-46 (o quello che hai nel cassetto) l'emettitore a GND e la base la colleghi al gate di Q2.

Perché correggimi se sbaglio ma mi sembra abbastanza utopistico (3,3V/4095 = 0,0008) apprezzare differenze inferiori al millivolt.

Quella è la risoluzione, ovviamente la temperatura può fare variare la lettura che ne ricavi per cui se leggi dall'ADC 1600 o 1700 sai che c'è collegato il motore da 5 ohm. Sperimentalmente ricavi il valore di ADC a cui aggiungi un +- 50 count ADC, per cui come dici tu un millivolt in più o meno non ti falsa l'identificazione del motore. Volendo con la risoluzione a 12-bit puoi provare a fare scorrere ancora meno corrente nella fase.

Visto che l'ADC dovrà lavorare in DC un filtro RC non può che aiutare ad avere letture meno ballerine.

Non conoscendo le caratteristiche delle porte di quella MCU non so dire se in serie al gate ci va o meno una resistenza e il suo valore, eventualmente un altro bjt npn risolve il problema.

Domanda: ma che simulatore stai usando?

Ciao.

per lo OP
spiega di nuovo il problema, se non ti spiace
perchè semplicemente riconoscere i motori si potrebbe fare in altre maniere
tu hai un gruppo di motori (sempre gli stessi) che "scambi" tra loro?

Maurotec:
Domanda: ma che simulatore stai usando?

Questo è il simulatore che utilizzo, spero che adesso non mi veniate a dire che è una porcheria :grinning:, comunque mi è sempre stato molto utile per quello che serve a me.

Adesso non mi resta che iniziare a sperimentare il tutto e vedere cosa ne esce, grazie mille per il tuo aiuto.

Standardoil:
spiega di nuovo il problema, se non ti spiace

Certo, magari cerco di fare un passo indietro e di spiegare perché ero giunto a tale conclusione.

Dunque, ho 4 motori BLDC diversi tra loro, questi motori andrebbero controllati con una scheda custom composta da MCU (in questo caso ESP32 ma non vincolante) e driver della Texas DRV10987.

Ovviamente per ogni motore il driver avrà bisogno di essere settato con parametri diversi, questi parametri li vado a definire con il loro software e la loro EVB.

Questi parametri vanno caricati nei registri interni del driver via I2C, ma tralasciamo questo aspetto, per farla semplice avrei 4 schede diverse per ogni motore, quello che vorrei fare io è di unificare tutto e quindi avere una scheda che mi riconosca che motore è collegato.

Quindi definito il mio obbiettivo, ho pensato a come poter riconoscere i motori prima di alimentarli quindi sono giunto al riconoscere la resistenza fase-fase, purtroppo il driver in questione non ha una funzione simile cito risposta datami dalla TI:

Measure the phase to phase resistance. The DRV10987 cannot help measure the phase resistance for you, so you would need external circuitry

Una volta riconosciuto il motore vado a scrivere nel driver i parametri che quel motore mi richiede e disabilito questa funzione salvando una variabile in eeprom così da evitare il settaggio del driver ad ogni alimentazione, ma solo in caso di reset tramite un pulsante.

Nel connettore che usi per collegare i motori 'nascondi' una resistenza nota e molto differente da un motore all'altro
Prima di dare corrente misuri, con un piedino dedicato, la resistenza e riconosci il connettore, ovvero il motore ad esso collegato

Prima di dare corrente misuri, con un piedino dedicato, la resistenza e riconosci il connettore, ovvero il motore ad esso collegato

Questa è un ottimo consigli che semplifica tanto il circuito, ovviamente di serviranno due più aggiuntivi sul connettore motore, tra questi due pin c'è la resistenza di valore conosciuto che un volta connesso il connettore si trova a formare un partitore di tensione. Se calcolato bene il partitore ti consente anche di connettere un motore non previsto e non compatibile con quella schede e il circuito impedirà di avviare il motore e magari segnalarlo con il led lampeggiante ad una certa frequenza o ancora meglio se c'è un display.

Ciao.

Grazie
Non è farina del mio sacco, ma la normalità in certi ambiti....

Grazie delle risposte,

quella di mettere una resistenza aggiuntiva era il piano B, ma per evitare di avere cavo e connettore a 5 fili volevo tentare la strada del riconoscimento dello statore.

A questo punto, penso di percorrere questa strada per evitare possibili errori dati dalle tolleranze degli statori (4-5ohm)

Ciò non toglie che comunque una prova con il piano A la farò comunque.