Come faccio a presentare un elenco di requisiti per un microcontrollore per il mio progetto? Come posso quindi trovare i microcontrollori adatti?


20

Ho lavorato su un progetto di controllo eBike su Arduino MEGA2560. Il programma esegue 3 circuiti di controllo PID, un circuito di controllo della capacità della batteria (interpolazione basata su tabelle di ricerca), un tachimetro (campioni basati su un interruttore reed) e uno schermo LCD per visualizzare le informazioni. I suoi ingressi sono 3 segnali analogici: tensione della batteria, corrente e ingresso dell'acceleratore utente, nonché un ingresso digitale: segnale on / off del tachimetro (interruttore reed). Attualmente, con tutto questo in esecuzione su aritmetica "lunga", Arduino riesce a completare 10 loop al secondo. Poiché lo schermo LCD TFT richiede enormi quantità di potenza computazionale, sto pensando di sostituirlo con uno schermo alfanumerico.

Le uscite sono costituite da un segnale analogico dell'acceleratore diretto a un controller del motore, dallo schermo LCD e potenzialmente da alcuni altri dispositivi che richiedono segnali analogici. Pertanto, i convertitori ADC sono essenziali e il DAC sarebbe molto utile anche se attualmente sto utilizzando l'uscita PWM Arduino con un filtro passa basso RC. Allo stesso modo, la capacità di leggere segnali digitali e analogici senza interrompere il processore sarebbe grande.

Vorrei potenzialmente creare un prodotto di consumo da questo, quindi voglio costruire la mia piattaforma da zero con un diverso microcontrollore che potrebbe darmi almeno 100 campioni al secondo (10 volte quello che Arduino sta ottenendo). Inoltre, per evitare punti fluttuanti, i miei calcoli usano variabili lunghe e di conseguenza numeri maggiori di 16 bit, quindi presumo che una MCU a 32 bit sarebbe una buona idea. Inoltre, un MCU in grado di eseguire calcoli in virgola mobile potrebbe essere interessante per semplificare la matematica nel codice.

Alla fine non sono sicuro di come iniziare a cercare MCU in grado di soddisfare questi requisiti e consentire una rapida transizione dall'ambiente Arduino. Qualsiasi consiglio su come procedere alla ricerca di tali MCU sarebbe molto apprezzato!


1
Non voglio necessariamente essere parti raccomandate ma solo un metodo o una piattaforma o qualsiasi guida su come trovare la piattaforma di cui ho bisogno.
Eliott W

5
È molto meglio della tua domanda precedente, ma è ancora molto ampia e alcuni punti delle tue esigenze non sono chiari. Ad esempio, cosa intendi con "senza interrompere il processore"? Immagino che nemmeno tu voglia fare l'I / O polling. È inoltre necessario comprendere meglio la quantità di elaborazione da eseguire su ciascun set di campioni.
Dave Tweed

1
Dovresti prendere in considerazione l'utilizzo della matematica intera. È la cosa giusta da fare.
Scott Seidman,


4
La matematica intera, lunga o corta, è molto più veloce della virgola mobile; e anche la matematica intera più lunga della profondità di bit "nativa" del processore sarà lenta. Quindi a 32 bit sembra un'ottima idea, forse uno dei dispositivi di tipo "DSP".
pjc50,

Risposte:


18

(Questa è una guida generica. Sospetto che potresti anche beneficiare dell'ottimizzazione del codice, ma questo è al di fuori dell'ambito di questo sito Web.)

Passaggio 1: dimensionamento approssimativo, budget, fornitore

Scegli uno di:

  • Computer (Raspberry Pi, Beagleboard, scheda PC104, Intel Edison, ecc.). Avvia un sistema operativo generico e ha molta potenza di elaborazione. Più costoso e assetato di potere. $ 10- $ 100.

  • MCU di grandi dimensioni. ARM DSP serie Cortex-A / PIC32 / dsPIC / AVR32 / TI C ecc. Potenza di elaborazione discreta, sistema operativo opzionale. ~ $ 5.

  • Piccolo MCU. Cortex-M / PIC16. Non abbastanza spazio per un vero sistema operativo, forse solo un programmatore di attività leggero. ~ 2 $.

  • Piccolo MCU. Solo per le applicazioni a cui tieni fino all'ultimo microamp di consumo energetico. ~ $ 1 o meno.

In questa fase dovresti anche considerare quali venditori e toolchain ti piacciono e non ti piacciono. Dai un'occhiata al costo di cose come dispositivi di debug in circuito e IDE.

Passaggio 2: periferiche minime

Hai bisogno di cose come USB? PCI? HDMI? SATA? ADC o DAC insolitamente veloci? Quasi tutte le categorie "piccole" o "minuscole" non ne hanno, sebbene l'USB sia abbastanza ampiamente disponibile.

Passaggio 3: prototipo

Scegli qualcosa che soddisfi i criteri di cui sopra, a caso se necessario, inizia, scopri quanto è fattibile e di quanto spazio / potenza di elaborazione hai bisogno. Ne hai già fatto un po '. Scrivere in C dovrebbe rendere la maggior parte della logica portatile.

Una volta che hai il prototipo puoi dire a te stesso: "Ne ho bisogno come uno, ma con più X" e lascia che guidino le tue decisioni.

Passaggio 4: ridurre

In genere è più facile iniziare con il membro più grande (la maggior parte di Flash e RAM) di una famiglia di CPU, scrivere v1 dell'applicazione e quindi sceglierne uno più piccolo ed economico. Puoi anche dedicare tempo all'arte di adattare il software a meno risorse. Ciò che vale dipende da quante unità farai.


14
Passaggio 0: catena degli strumenti (ambiente di sviluppo del firmware). Trova gli ambienti di sviluppo che puoi lavorare per te. Questo è dove è vinto o perso. Anche se hai un silicio che si adatta perfettamente, ma non puoi far funzionare l'ambiente di sviluppo del firmware (per qualsiasi motivo), il tuo progetto non decollerà. (Caso in questione: l'IDE di Arduino ha fatto decollare il tuo prototipo basato su Arduino.)
Nick Alexeev

8
Classificare Cortex-M come "Small MCU" e PIC32 / AVR32 come "Large MCU" sembra un po 'sfortunato. Non ho usato PIC32 / AVR32, personalmente, ma basandomi su una rapida occhiata alla gamma di specifiche, direi che dovrebbero essere tutti nella stessa parentesi. (Ci sono MCU Cortex-M che funzionano a> 200MHz, hanno molti megabyte di flash e più di mezzo megabyte di RAM)
Aleksi Torhamo

13

Bel progetto. Ecco alcuni suggerimenti, ma sarebbe difficile generalizzare questo per ogni progetto.

Inizia con i requisiti computazionali

Questo è ciò che ti dirà che tipo di core hai bisogno e le prestazioni generali dell'MCU. Ti suggerisco di iniziare con questo, dal momento che ovviamente non può essere esteso utilizzando componenti esterni, a differenza delle periferiche.

In primo luogo, sembra che tu usi pesanti operazioni matematiche con numeri interi grandi all'interno del ciclo. Quindi, come hai suggerito, qui sarebbe utile 32 bit, quindi ARM si presenta come un candidato ideale. Per quanto riguarda la frequenza di funzionamento: attualmente stai usando un Arduino MEGA2560 (funzionante a 16MHz, presumo) e puoi fare 10 loop / s. Se vuoi ottenere 100 loop / s, dovresti andare bene con un Cortex-M3 / M4 nel range di 100 MHz o più (stima approssimativa). Notare che Cortex-M4F ha un'unità a virgola mobile.

Abbiamo già ristretto la selezione.

Requisiti di memoria

Questo è facile: scegli l'MCU che ha il maggior numero di RAM / Flash della sua gamma per il prototipo. Dopo aver convalidato il prototipo, passa all'MCU dallo stesso intervallo che ha abbastanza RAM / Flash, ora che conosci i tuoi esatti requisiti.

Nota che non penso che la tua applicazione abbia bisogno di quantità incredibili di memoria.

Ora, le periferiche

Hai assolutamente bisogno di un po 'di ADC. Tutti gli MCU della gamma che stiamo esaminando ne hanno alcuni, quindi non è un criterio utile. Né sono ingressi / uscite digitali, tranne se ne hai bisogno di un numero molto grande (che non sembra essere il tuo caso).

Sembra che tu abbia bisogno di un DAC. Tuttavia, questo è qualcosa che in realtà non troverai facilmente e restringerai troppo i candidati. Quindi non manteniamo questo requisito e rimarremo con un PWM e un passa-basso (che è certamente accettabile, in realtà).

Non menzionate alcuna interfaccia di comunicazione, tranne l'LCD (in seguito). Ad ogni modo, tutte le MCU hanno I2C / SPI / UART / ... se ne hai bisogno.

Il display LCD

Questo è più complicato, perché ci sono molte soluzioni diverse che impongono requisiti completamente diversi sull'MCU. Ma non scegliere il display LCD a seconda dell'MCU. Scegli il display LCD che desideri per il tuo prodotto, quindi seleziona l'MCU che lo guiderà in modo efficiente.

  • Se vuoi un LCD a caratteri: allora il più semplice e il meno vincolante per l'MCU è parlare con esso attraverso un'interfaccia seriale (spesso SPI). In questo modo non utilizzerà troppi PIN, è possibile utilizzare MCU più piccoli / economici e la velocità non è un problema.
  • Se vuoi un LCD TFT grafico: se è piccolo, il collegamento seriale può ancora essere appropriato. Tuttavia, per 320x200 o più grande e se vuoi avere una bella interfaccia grafica, inizierai a voler comunicare con l'interfaccia parallela. In questo caso, o usi un po 'di GPIO (ma ciò caricherà maggiormente l'MCU perché dovrai sbattere le linee di controllo) o scegli un MCU che ha un'interfaccia LCD dedicata (che spesso è la stessa di un interfaccia di memoria esterna). Quest'ultimo pone un forte vincolo nella scelta della MCU, ma non hai altri forti vincoli, quindi ...

Ora scegli tu

Vai al sito Web di ST Micro / NXP / Atmel e usa i loro strumenti di selezione MCU. Passerai molto tempo a leggere anche i fogli dati. Prenditi questo tempo. Non è sprecato. Tutto ciò che imparerai qui, anche se non lo usi specificamente per questo progetto, può essere utile.

A questo punto, devi anche dare un'occhiata al numero di PIN effettivamente necessari e controllare lo schema multiplexing dei candidati MCU scelti per verificare che puoi utilizzare tutte le funzioni PIN necessarie. Perché ovviamente, vorrai prendere le MCU con il minor numero di pin che soddisfa i tuoi requisiti (per motivi immobiliari di costo / PCB).

Controlla i prezzi / disponibilità su Mouser / Digikey. Ma non dovresti aver bisogno di qualcosa di particolarmente costoso qui. Forse 5 € o giù di lì.

L'ultima cosa riguardante il controllo LCD

Sembra che l'aggiornamento dell'LCD sia parte del tuo loop principale. Non dovrebbe. Soprattutto se stai ripetendo 100 volte al secondo, è inutile. Fai in modo che il loop di controllo calcoli tutto e regola il comando del motore su ogni iterazione, ma aggiorna i valori per visualizzarli da qualche parte nella memoria. Quindi, fai in modo che un altro loop con priorità inferiore mostri queste informazioni all'utente quando non c'è niente di più importante da fare.

Sì, idealmente, richiede alcune attività di commutazione e roba. Un vero sistema operativo, in realtà (ricerca FreeRTOS, Coocox OS, Nuttx, ... quelli sono molto piccoli, sono ampiamente utilizzati su Cortex-M e forniscono i meccanismi multitasking richiesti).


Grazie mille per la tua risposta esaustiva! Sto notando che le MCU ARM Cortex funzionano tutte su 3.3V. Il mio segnale dell'acceleratore deve ridimensionare tra 1 e 5 V. Immagino che se voglio usare un controller ARM dovrò trovare un modo per aumentare la tensione in quanto sarà limitata a 3,3 V dall'MCU?
Eliott W,

Sì. Il segnale dell'acceleratore è l'uscita analogica, giusto? In tal caso, è possibile utilizzare un opamp per amplificarlo.
dim

Non sono sicuro di essere d'accordo con l'ultima frase sulla necessità di "un vero sistema operativo". Suppongo che dipenda da quanto vuoi in soluzioni pronte. Se vuoi qualcosa in cui puoi semplicemente inserire la tua logica aziendale e iniziare a sbattere le unità, sì, un sistema operativo completo (nota che questo non deve significare qualcosa come Windows o persino Linux!) È sicuramente utile.
un CVn,

1
@ MichaelKjörling, ovviamente, non intendevo qualcosa di simile a Linux. Ma piuttosto qualcosa come FreeRTOS, Coocox OS o Nuttx, per esempio. Questi sono ciò che considero un vero sistema operativo, sebbene molto piccolo. L'ho scritto perché, in effetti, farlo su bare metal richiederà più tempo, sarà un problema per il debug e sarà meno flessibile. E l'ambiente Arduino (anche se sono tutt'altro che un esperto in questo) non sembra fornire meccanismi di tasking (e, come tale, non lo considero un vero sistema operativo).
dim

1
Ah. Bene, allora ho letto male la parte "reale". Solo per il beneficio di noi stranieri che occasionalmente finiscono qui, potresti prendere in considerazione l'idea di chiarire quella parte nella tua risposta.
un CVn,

4

Si noti che questo è un argomento ampio a cui è possibile rispondere correttamente utilizzando approcci multipli (soggettivi).

Inoltre, il formato stackexchange non è efficace nella progettazione di soluzioni per problemi. Ad esempio, raramente fai in modo che le persone progettino l'hardware per te. Piuttosto proponi un design hardware e fai domande al riguardo.

Detto ciò...

Inizia con le funzionalità del processore che non puoi cambiare. Come velocità e dimensioni della memoria (se applicabile). Verificare se sono necessari interrupt e quanto complessa deve essere la gestione degli interrupt.

Se hai bisogno di supporto periferico come ADC o DAC, la situazione è più complessa. Queste funzionalità devono essere integrate nel processore o essere esterne al processore. Prezzo, precisione e persino rumore sono i fattori di questa decisione.

Se si devono supportare periferiche esterne, considerare il tipo di comunicazioni seriali necessarie. L'hardware esterno potrebbe richiedere SPI, I2C o altri tipi di UART. Se la velocità dei dati è elevata, potrebbe essere meglio trovare un processore con funzionalità DMA associate alle sue porte di comunicazione seriale.

Infine, se si tratta di un'applicazione di processore integrata (che normalmente significa un processore dedicato a un'attività), prendere in considerazione la suddivisione dei requisiti in più gruppi e l'assegnazione di un processore a ciascuno. Ad esempio, un processore di visualizzazione della GUI probabilmente non necessita di una funzione ADC. Questo approccio oggettivo alla risoluzione dei problemi si è dimostrato efficace nel software e con la caduta dei prezzi del processore può essere applicato anche all'hardware.

Nel mondo reale, questo approccio è iterativo. Cioè, molti progetti iniziano con un processore e cambiano diversi processori quando si verificano problemi hardware e / o software o la portata del progetto cambia.


Sei un giudice migliore di quale tipo di numeri aspettarti rispetto al compilatore. Eviterei l'approccio generico dell'uso dei float. Ad esempio, è possibile che i risultati float non siano gli stessi su piattaforme diverse! Vorrei utilizzare l'aritmetica intera e adattare la soluzione alle tue esigenze.
st2000,

3

Non ho visto nessuno menzionare il costo degli strumenti. La mia azienda ha scelto un TI CC2541 e l'ho scoperto compilato solo con un compilatore IAR da $ 4k, sicuramente un punto fermo per un hobbista. Anche il programmatore. Può essere $ 20 o molto di più. Gli strumenti più economici sembrano più la norma ora, quindi forse questo sarà presto un ricordo del passato.

Inoltre, se lo ripeti da solo, pacchetti come TQFP sono più facili di, diciamo, BGA. Un BGA di grandi dimensioni è difficile da ottenere, in base all'esperienza personale.


2

Se il prodotto è relativamente sensibile al prezzo e disponi di finanziamenti per lo sviluppo decenti, puoi procurarti un gruppo di schede di valutazione e profilare il codice su ciascuno di essi per avere un'idea. Questo dovrebbe essere abbastanza semplice se il tuo codice è scritto in C. portatile A parte il micro, valuterai le toolchain con le versioni demo prima di sborsare il costo di un IDE completo come IAR o Keil. In alcuni casi è possibile profilare il codice del collo di bottiglia direttamente sull'IDE senza hardware.

Se sei strettamente vincolato ai costi di sviluppo, potresti dover scendere a compromessi per trovare qualcosa che non costa troppo per la configurazione dello sviluppo.

Ad esempio, ST ha una scheda ARM Cortex M7 eval con un bel display a colori per <$ 100. Ha una FPU con funzionalità DSP in modo da poter fare qualsiasi cosa di cui hai parlato facilmente - probabilmente eseguire un loop PID a 100kHZ anziché solo a 100Hz. Probabilmente è eccessivo a meno che quel display non sia una priorità.

Se stai mirando a un processore più economico senza FPU, probabilmente vorrai profilare il codice PID nella sua forma finita. Assicurati che siano inclusi tutti i fattori di ridimensionamento, linearizzazione e calibrazione, in quanto possono sommarsi in termini di tempo di elaborazione.

Spesso le periferiche e la qualità e la disponibilità del middleware associate (e termini di licenza) influenzeranno fortemente la tua scelta. Se hai bisogno della modalità host BT o Wifi o USB e dei file FAT da memorizzare su una chiavetta USB o un'interfaccia SD veloce, questi saranno tutti fattori importanti. Alcuni chip hanno un controller LCD integrato e un controller di digitalizzazione che possono consentire l'uso di un pannello TFT relativamente economico. Non trascurare i costi di licenza a volte elevati.

Se hai un'idea della memoria del programma richiesta, della velocità di elaborazione e delle periferiche (includi FPU in questo), puoi fare una ricerca parametrica presso il distributore prima di eseguire il drill down nei fogli dati. Alcune cose troppo vincolanti potrebbero essere: pacchetto a foro passante, DAC interno, PHY Ethernet interno, FPU. Nessuno di questi è probabilmente necessario e potrebbe limitare indebitamente le tue scelte prematuramente.

Buona fortuna, è un sacco di lavoro per farlo correttamente. Nella mia esperienza è una falsa economia tagliarlo troppo vicino a un nuovo prodotto perché i clienti inevitabilmente chiederanno cose che non avevi previsto e che vuoi avere una certa capacità di riserva per fornirle senza ricominciare da capo. D'altra parte, se il prodotto è troppo costoso, non sarai in grado di vendere abbastanza con margini adeguati per sostenere l'attività.


1

Esistono diverse piattaforme diverse che puoi iniziare a guardare come Arduinos, microcontrollori PIC, FPGA e molto altro. Ho lavorato con Arduinos in passato e ha una porta ADC in grado di raggiungere 74kS / s. 100 campioni al secondo sono estremamente lenti e mi chiedo come l'hai scoperto? D'altra parte, vuoi chiederti se avrai bisogno di qualsiasi tipo di interfaccia come SPI, CAN, I2C o UART. Tutti possono avere i loro benefici ed è per te che devi considerare se parlerai con uno o più schiavi. L'ultimo ma probabilmente il passo più importante sarebbe quello di indovinare quanti pin sul microcontrollore dovrai usare.

"La capacità di leggere segnali analogici o digitali senza interrompere il processore sarebbe eccezionale." Posso indovinarlo dicendo che non vuoi avere a che fare con buffer esterni o interni che faranno circolare i tuoi dati e potenzialmente rallenteranno l'elaborazione dei dati. È giusto? In tal caso, questa è una maggiore programmazione da fare ma i processori sono in genere in grado di gestire la velocità di 100 campioni al secondo. Spetterà a te programmare l'orologio, la frequenza di campionamento e il resto.

Inoltre, considerare gli interrupt nel programma se si desidera mantenere continuamente i dati di campionamento ed eseguire altre attività quando viene sollevato un flag.


2
Penso che tu abbia perso il punto. Ha un prototipo costruito su un Arduino. Il campionamento non è lento. I circuiti di controllo SONO lenti. Ha tre controller PID calcolati usando il virgola mobile sull'Arduino, quindi sono più lenti della melassa in un inverno antartico. Quindi, il campionamento non è il problema. Il codice inefficiente è.
JRE,

Hai ragione a riguardo.
12Lappie

Sì, il problema è che sebbene i miei loop siano in aritmetica lunga e non in virgola mobile, ci sono così tanti calcoli da fare che quando Arduino prende un campione una volta per loop, la mia frequenza di campionamento è molto piccola (attualmente 20 campioni al secondo) .
Eliott W,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.