MODALITA' GOD MODE

per Win 7 - GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}


 

 

3PWM

Un modulino, tre PWM indipendenti e un pò di fantasia..

 

Premessa: questo articolo nasce solo come spunto per approfondire la conoscenza

di questi dispositivi per poterli poi applicare con facilità dove necessita.

Non approfondirò l'argomento su come funziona la comunicazione I2CBus ma mi limiterò

a dare istruzioni su come indirizzare correttamente il dispositivo.

Maggiori informazioni riguardo il protocollo I2C si trovano facilmente in rete.

 


 

Breve storia... (...era metà LUGLIO!, tenetelo presente più avanti...)

 

Tempo fà un grosso imprenditore della zona mi diede "carta bianca" per progettargli una scheda elettronica

da applicare alle sue macchine elettromedicali. Per la precisione si trattava di un lettino per il benessere per

il corpo (...e che CORPO!... poi spiegherò meglio...) la quale doveva somigliare quasi ad un'astronave...

quindi tutti i comandi dovevano essere gestiti da una consolle complessa e dedicata...

 


 

Descrizione

 

Tralascio i particolari che sono copyright ma voglio approfondire in questa paginetta come ho gestito la parte

elettronica che generava i segnali PWM per la cromoterapia, una delle numerose applicazioni "DELL'ASTRONAVE".

 

Ho iniziato a buttar giù un pò di codice per poter utilizzare un PIC16F877A, ma visto che era occupato a fare

tantissime altre cosine che lo tenevano impegnato parecchio, ho deciso di fare una ricerca in rete per trovare

qualcosina che potesse fare al caso mio. 10 minuti dopo, ZAKK! ...TROVATO! Viva Internet!!

L'attenzione si è subito rivolta sul dispositivo DS1050-25 della DALLAS Semiconductor, definito come:

 

"I2CBus, 5 Bit Programmable, Pulse-Width Modulator, 25 KHz"

 

Ecco il link.. https://datasheets.maximintegrated.com/en/ds/DS1050-DS1050X-010.pdf

 

Si tratta di un IC a 8 pin, contiene al suo interno un generatore PWM a 5 bit, comunica col protocollo I2CBus

con la possibilità di indirizzare fino a 8 dispositivi sullo stesso bus dati, funziona con una tensione di

alimentazione che può andare da 2,7 a 5,5 volt e la sua corrente di uscita arriva a 3 mA.

 

L'IC in questione si adattava benissimo alle mie esigenze. Una volta "avviato" tramite opportuno comando in

I2C, se ne stava tranquillo, buono buono e generava il suo bel duty cycle a 25 KHz mentre il PIC era

impegnatissimo a svolgere altri compiti, tre dei quali prioritari in quanto i finecorsa e i pulsanti di emergenza

necessitavano una maggiore supervisione e una "risposta" calcolata in base allo stato dell'apparecchiatura.

Era l'ideale per la mia applicazione.

 


 

Un pò di schemi e di teoria...

 

 

Il DS1050-25

 

 

Tralasciando i pin di alimentazione notiamo i pin SCL (Serial Clock) e SDA (Serial Data) dedicati al bus

per la comunicazione seriale tramite il protocollo I2C.

 

SCL è il clock del bus e serve a sincronizzare la comunicazione seriale.

SDA è il pin dove i dati entrano ed escono dal dispositivo, in sincronia con lo stato alto di SCL.

 

A0, A1 e A2 sono tre pin che servono ad indirizzare il dispositivo in questione. Che vuol dire: se abbiamo per

esempo i tre dispositivi connessi sulla stessa linea I2C, come potremmo interrogare o comandare SOLO il

dispositivo che ci interessa? Facile, basta collegare i pin A1, A2 e A3 a massa oppure sul positivo di alimentazione

secondo una combinazione a nostra scelta, basata sul sistema binario. Con 3 pin possiamo farne 8 di combinazioni.

Poi, inviando un comando sul bus I2C aggiungendo l'INDIRIZZO uguale alla combinazione fatta sui tre pin,

comunicheremo SOLO ed ESCLUSIVAMENTE col dispositivo interessato.

 

 

 

Spiego meglio facendo un'esempio con due dispositivi connessi come la foto qui sopra, chiamati X e Y:

mettiamo a massa tutti e tre i pin A0, A1 e A2 del dispositivo X, poi colleghiamo al positivo di alimentazione

tutti e tre i pin A0, A1 e A2 del dispositivo Y.

 

A questo punto avremo il dispositivo X con indirizzo = "000" e invece il dispositivo Y con indirizzo "111"

Inviando ora dei comandi appropriati sul bus I2C, specificando "000" risponderà X, specificando "111" risponderà Y.

 

Rimane solo il pin PWM: avete indovinato a cosa serve? ... bravissimi!

 


 

La comunicazione col DS1050-25

 

 

NOTA:

Utilizzo spesso il compilatore PicBasicPro per i miei progetti, anche se incorporo sempre molto assembler

per ottimizzare e personalizzare alcune parti del codice a modo mio. Il PBP mi da una mano con le routines

più antipatiche, guarda caso torna proprio a fagiolo con il protocollo I2C del generatore PWM in questione.

Visto che rende molto più leggibile e leggero il sorgente per chi "digerisce poco" l'assembler, ho deciso

che utilizzerò il compilatore PicBasicPro per gli esempi.

 

 

 

Il CONTROL BYTE:

 

 

E' il registro a 8 bit del dispositivo dove vengono confrontati i comandi in transito sul bus.

 

Il DS1050 ha un indirizzo FISSO di 4 bit per poterlo discriminare in mezzo ad altri dispositivi connessi al bus I2C,

che possono essere memorie, espansori di bus, circuiti audio, pll, separatori di luminanza/crominanza TVC ecc. ecc.

In pratica non è altro che un prefisso che inizia con "0101" che identifica la famiglia di appartenenza.

Seguono altri tre bit che rispecchiano la configurazione dei 3 pin denominati A2-A1-A0 come spiegato sopra.

Per ultimo abbiamo il bit di "Lettura/Scrittura". Vale 1 quando si legge il dispositivo, 0 quando lo si scrive.

 

Vediamo un codice di esempio in PBP:

 

 

Ho inserito un'immagine in quanto l'editor non mi permetteva di visualizzare il codice in questa modalità, boh!

...credo sia il simbolo "PERCENTUALE" che rompe le balle al PHP di Grix...

 

Per pasticciare un pò col sorgente di esempio scaricatelo da  QUI!

 

 


 

Il codice sorgente:

 

Si inizia a definire quali pin del PIC utilizzare per la comunicazione, nell'esempio uso la PORTC pin 6(SDA) e 7(SCL).

 

Definisco tre variabili che conterranno il valore del duty cycle da generare, una per ogni colore: PWM_R, G e B.

 

Definisco le tre costanti (LED_R, G e B) che indirizzeranno i tre PWM sul Bus: iniziano tutte e tre con "0101" che è

l'indirizzo COMUNE, (la FAMIGLIA) dei tre dispositivi, seguono poi tre bit, A2, A1 e A0 che saranno diversi tra loro

rispecchiando i rispettivi pin del dispositivo connessi o a massa (0) o sul positivo di alimentazione (1).

 

(che poi lo vedremo in dettaglio sul modulino e sullo schema elettrico)

 

Per ultimo mettiamo un bit a 0, segno che il comando sarà di SCRITTURA sul dispositivo.

 

Definisco la costante (PWM_ON), valore 128 Decimale.

Questo valore forza a 1 il bit 7 del registro dati mantenendo

bassi i rimanenti bit. Serve ad attivare il generatore PWM e a caricare l'ultimo valore utilizzato.

 

(FUNZIONE RELOAD)

E' importante inizializzare il dispositivo con questo comando almeno una volta, pena il non funzionamento del PWM.

 

Faccio notare che nel sorgente è stata definita una costante di nome " MASK_5BIT " a cui ho assegnato il

valore binario "00011111" (31 Decimale). La utilizzo con la funzione AND prima di inviare il valore da scrivere

nel PWM. Questa evita che un numero superiore a 31 possa essere inviato distrattamente al PWM, il quale

inizierebbe a dare letteralmente i numeri.

 

Alla fine, nel loop del main program, come esempio incremento la variabile del colore rosso (PWM_R).

Collegando al PWM un led, l'effetto sarà di vederlo illuminarsi gradualmente per poi, dopo 31 incrementi, spegnersi

e ricominciare all'infinito.

 

 


 

La funzione "IC2WRITE" del PBP ha bisogno di 4 parametri:

 

1) pin DATI - il pin del micro assegnato come SDA

 

2) pin CLOCK - il pin del micro assegnato come SCL

 

3) indirizzo del dispositivo (8 bit) - 0101-A2-A1-A0-0 (nel caso del PWM del verde sarà "01011100")

 

4) DATO (8 bit) da trasferire al dispositivo - (per il DS1050 il valore va da 0 a 31)

 

La stringa inviata attraverso il Bus è composta da 16 BIT(1 BYTE di COMANDO + 1 BYTE di DATI).

Una istruzione del tipo " IC2WRITE, SCL, SDA, "01010010", [15] " in PBP, scriverà il valore 15 (DECIMALE)

nel dispositivo PWM connesso al bus, che avrà i pin siglati A2 e A1 connessi a massa e il pin siglato A0 sul +Vcc.

Il PWM in questione inizierà a generare una frequenza di circa 25KHz con duty cycle del 50%.

Infatti il range di lavoro del PWM va da 0 (spento) a 31 (uscita sempre ON). Il valore 15 è a metà del range.

 

 


 

Il modulino

 

Finalmente eccoci alle foto con tutti i particolari del modulino in questione:

 

  

   

 

   

  

 

 

I tre PWM sono in SMD, la basetta misura 34 x 23 mm e lo spessore del CS è di 0,7 mm.

Durante la fase di prototipatura della famosa ASTRONAVE, dovevo lasciare la scheda madre in azienda dal cliente.

Non potevo continuare a saldare e dissaldare componenti per non farmi gabbare dalla concorrenza. Così, la sera,

il modulino me lo portavo via... non si sa mai... Ora è a disposizione di Grix per l'autopsia...

 

 

 

LO SCHEMA

          

 

IL CS

          

 

Il LAYOUT

          

 

PULL-UP

 

     

 

Per far lavorare correttamente il circuito in questione è necessario inserire due resistenze di pull-up sull'I2CBus.

Nel modulino non le avevo predisposte solo perchè erano già cablate sulla scheda madre, quindi inseritele come

da schema allegato. La 10K su SCL in teoria si potrebbe omettere dato che il clock è generato da un pin del micro

e DOVREBBE essere automaticamente configurato come uscita DRIVED dal PBP. Meglio però non rischiare!

La 10K su SDA invece va messa, in quanto questo pin del micro può lavorare sia come INPUT che come OUTPUT

a collettore aperto (OPEN COLLECTOR MODE), e se non mettiamo un piccolo carico (la 10K) il pin in questione

rimarrà nello stato basso o peggio, FLOTTANTE, durante le operazioni di "ACKNOWLEDGE", cioè di scambio

di un comando di VALIDITA' da parte del DS1050. In questo caso la comunicazione sul Bus risulterebbe impossibile.

 


 

 Conclusioni

 

Lascio a voi decidere come utilizzare questi dispositivi viste le feste natalizie alle porte.

 

Aggiungo solo che per pilotare dei led o delle lampade basta aggiungere un Darlington tipo BDX33A in configurazione

open collector. La base va direttamente collegata all'uscita di uno dei 3 PWM (sul modulino c'è già la 1000 Ohm) e

l'emettitore collegato a massa. L'alimentazione può arrivare fino a 50 volt tranquilli e la corrente a 10 Ampere se

si usa un dissipatore adeguato...

 

 


 

Il prototipo della scheda ce l'ho ancora, non c'entra niente con questo progetto ma se volete dare un'occhiata...

...ultimamente le ho rubato un pò di componenti... ma i tre BDX33A per la chromoterapy li ho lasciati a bordo...

...poi per la produzione in serie è stata costruita tutta in SMD...

 

 

 

Spero che l'articolo sia stato di vostro interesse... alla prossima

 

zioCarlino...

 

 


...uuuuhh! dimenticavo... facevo riferimento al "CORPO", là, in cima all'articolo...

Non vi dico ragazzi che soddisfazione passare metà luglio a spalmare olio profumato sulle chiappe sode di tre

ESAGERATISSIME 25enni, (insieme al mio cliente diventato poi un'inseparabile amico per la pelle!!), che si

prestavano divertite a provare tutte le capacità rilassanti, emollienti, profumanti e chi più ne ha più ne metta

del lettino/astronave, oramai supercollaudato da TUTTE, dico TUTTE le segretarie del capo.

Una delle tre era portatrice sana di capezzoli, l'altra mi metteva a disagio solo guardandomi da 1,96 di altezza

e l'altra... ...vabbè dai, lascio a voi immaginare che tortura con quel caldo nel capannone... ...a luglio poi!

(...ma come mi piàcceee il mio lavoro...)


 

Tutti i commenti e i voti di questo progetto

 

Pag1   Pag2   Pag3

 


 

Your sniffed IP is:  - All rights reserved - 2022/2023 - Tutti i diritti riservati.

I marchi citati sono di proprieta' delle rispettive aziende - All trademarks are the property of their respective owners and companies.

Carlo Manzoni - Via Enrico Fermi, 10 - 26848 San Fiorano (Lo) - Mobile: +39 338 3114954 - C.F: MNZCRL57A04H844O

(i numeri sconosciuti sono bloccati, al cellulare rispondo solo previo SMS/Whatsapp di presentazione)