Como faço para apresentar uma lista de requisitos para um microcontrolador para o meu projeto? Como posso encontrar microcontroladores adequados?


20

Estou trabalhando em um projeto de controle de eBike no Arduino MEGA2560. O programa executa 3x circuitos de controle PID, um loop de controle de capacidade da bateria (interpolação com base em tabelas de pesquisa), um velocímetro (amostras com base em um interruptor de palheta), bem como uma tela LCD para exibir informações. Suas entradas são 3 sinais analógicos: tensão da bateria, corrente e entrada do acelerador do usuário, além de uma entrada digital: sinal de ligar / desligar do velocímetro (interruptor reed). Atualmente, com tudo isso funcionando na aritmética "longa", o Arduino consegue completar 10 loops por segundo. Como a tela LCD TFT requer enormes quantidades de energia computacional, estou pensando em substituí-la por uma tela alfanumérica.

As saídas consistem em um sinal de aceleração analógico que vai para um controlador de motor, a tela LCD e, potencialmente, alguns outros dispositivos que requerem sinais analógicos. Assim, os conversores ADC são essenciais e o DAC seria muito útil, embora atualmente esteja usando a saída PWM do Arduino com um filtro passa-baixo RC. Da mesma forma, a capacidade de ler sinais digitais e analógicos sem interromper o processador seria ótima.

Eu gostaria de potencialmente criar um produto de consumo com isso, portanto, quero construir minha própria plataforma a partir do zero com um microcontrolador diferente que possa me fornecer pelo menos 100 amostras por segundo (10 vezes o que o Arduino está alcançando). Além disso, para evitar pontos flutuantes, meus cálculos usam variáveis ​​longas e, consequentemente, números maiores que 16 bits, então estou assumindo que um MCU de 32 bits seria uma boa idéia. Além disso, um MCU capaz de fazer cálculos de ponto flutuante pode ser interessante para simplificar a matemática no código.

No final, não sei como começar a procurar MCUs que atendam a esses requisitos e permitam uma transição rápida do ambiente do Arduino. Qualquer orientação sobre como encontrar esses MCUs seria muito apreciada!


11
Eu não necessariamente quero peças recomendadas, mas apenas um método ou plataforma ou qualquer orientação sobre como encontrar a plataforma de que preciso.
Eliott W

5
Isso é muito melhor do que sua pergunta anterior, mas ainda é muito ampla, e alguns pontos em seus requisitos não são claros. Por exemplo, o que você quer dizer com "sem interromper o processador"? Eu estou supondo que você também não quer fazer E / S com polling. Você também precisa ter uma idéia melhor de quanto exatamente a computação precisa ser feita em cada conjunto de amostras.
Dave Tweed

11
Você deve considerar o uso de números inteiros. É a coisa certa a fazer.
21816 Scott Seidman #


4
A matemática inteira, longa ou curta, é muito mais rápida que o ponto flutuante; e números inteiros maiores que a profundidade de bits "nativa" do processador também serão lentos. Portanto, 32 bits parece uma boa ideia, talvez um dos dispositivos do tipo "DSP".
Pjc50 21/10

Respostas:


18

(Este é um guia genérico. Suspeito que você também possa se beneficiar da otimização de código, mas isso está fora do escopo deste site.)

Etapa 1: dimensionamento aproximado, orçamento, fornecedor

Escolha um dos seguintes:

  • Computador (Raspberry Pi, Beagleboard, placa PC104, Intel Edison, etc). Inicializa um sistema operacional de uso geral e possui muito poder de processamento. Mais caro e sedento de energia. US $ 10 a US $ 100.

  • MCU grande. ARM Cortex-A / PIC32 / DSPIC / AVR32 / TI DSP da série C etc. Poder de computação decente, sistema operacional opcional. ~ $ 5.

  • MCU pequeno. Cortex-M / PIC16. Não há espaço suficiente para um verdadeiro sistema operacional, talvez apenas um agendador de tarefas leve. ~ $ 2.

  • MCU minúsculo. Apenas para aplicações em que você se preocupa com cada microamp de consumo de energia. ~ $ 1 ou menos.

Você também deve considerar, nesta fase, quais fornecedores e cadeias de ferramentas você gosta ou não. Veja o custo de coisas como dispositivos de depuração no circuito e IDEs.

Etapa 2: Periféricos mínimos

Você precisa de coisas como USB? PCI? HDMI? SATA? ADCs ou DACs extraordinariamente rápidos? Quase todas as categorias "pequenas" ou "pequenas" não as possuem, embora o USB esteja amplamente disponível.

Etapa 3: Protótipo

Escolha algo que atenda aos critérios acima, aleatoriamente, se necessário, comece, descubra como é possível e quanto espaço / poder de processamento você precisa. Você já fez isso. Escrever em C deve tornar grande parte da lógica portátil.

Depois de ter o protótipo, você pode dizer para si mesmo: "Eu preciso de um como este, mas com mais X" e deixe que ele guie suas decisões.

Etapa 4: Encolher

Geralmente é mais fácil começar com o maior membro (a maioria dos Flash e RAM) de uma família de CPUs, escrever a v1 do seu aplicativo e escolher um menor e mais barato para caber. Você também pode dedicar tempo à arte de ajustar o software a menos recursos. O que vale a pena depende de quantas unidades você fabricará.


14
Etapa 0: Cadeia de ferramentas (ambiente de desenvolvimento de firmware). Encontre ambientes de desenvolvimento em que você possa trabalhar para você. É aqui que é ganho ou perdido. Mesmo se você tiver um silicone que se encaixa perfeitamente, mas não puder fazer o ambiente de desenvolvimento de firmware funcionar (por qualquer motivo), seu projeto não decolará. (Caso em questão: o IDE do Arduino retirou o seu protótipo baseado em Arduino.)
Nick Alexeev

8
Categorizar o Cortex-M como um "MCU pequeno" e o PIC32 / AVR32 como o "MCU grande" parece um pouco infeliz. Eu não usei o PIC32 / AVR32 pessoalmente, mas com base em uma rápida olhada na gama de especificações, diria que todas elas devem estar no mesmo suporte. (Há Cortex-M MCUs que correm em> 200MHz, tem muitos megabytes de Flash e mais de metade de um megabyte de memória RAM)
Aleksi Torhamo

13

Bom projeto. Aqui estão algumas dicas, mas seria difícil generalizar isso para cada projeto.

Comece com os requisitos computacionais

É isso que lhe dirá que tipo de núcleo você precisa e o desempenho geral do MCU. Eu sugiro que você comece com isso, pois obviamente não pode ser estendido usando componentes externos, diferentemente dos periféricos.

Primeiro, parece que você usa operações matemáticas pesadas com números inteiros grandes dentro do loop. Portanto, como você sugeriu, 32 bits seria útil aqui, portanto o ARM é um candidato ideal. Quanto à frequência de operação: atualmente, você está usando um Arduino MEGA2560 (rodando a 16MHz, presumo) e pode fazer 10 loops / s. Se você deseja atingir 100 loops / s, deve estar bem com um Cortex-M3 / M4 na faixa de 100 MHz ou mais (estimativa aproximada). Observe que o Cortex-M4F possui uma unidade de ponto flutuante.

Já reduzimos a seleção.

Requisitos de memória

Essa é fácil: escolha o MCU que possui mais RAM / Flash de sua faixa para o protótipo. Depois de validar o protótipo, mude para o MCU do mesmo intervalo que possui RAM / Flash suficiente, agora que você conhece seus requisitos exatos.

Observe que não acho que seu aplicativo precise de quantidades incríveis de memória.

Agora, os periféricos

Você absolutamente precisa de um ADC. Todas as MCUs do intervalo que estamos vendo possuem algumas, portanto não é um critério útil. Nem as entradas / saídas digitais, exceto se você precisar de um número muito grande delas (o que não parece ser o seu caso).

Você parece precisar de um DAC. No entanto, isso é algo que você não encontrará facilmente e diminuirá muito os candidatos. Portanto, não mantemos esse requisito e permaneceremos com um PWM e lowpass (o que é certamente aceitável, na verdade).

Você não menciona nenhuma interface de comunicação, exceto o LCD (posteriormente). Enfim, todos os MCUs têm I2C / SPI / UART / ... se você precisar de algum.

O LCD

Essa é mais complicada, porque existem muitas soluções diferentes que colocam requisitos completamente diferentes no MCU. Mas não escolha o LCD dependendo do MCU. Escolha o LCD desejado para o seu produto e selecione o MCU que o conduzirá com eficiência.

  • Se você deseja um LCD de caractere: o mais fácil e o menos restritivo para o MCU é conversar com ele por meio de alguma interface serial (geralmente SPI). Dessa forma, ele não usará muitos PINs, você pode usar MCUs menores / mais baratos e a velocidade não é um problema.
  • Se você deseja um LCD TFT gráfico: se for pequeno, o link serial ainda poderá ser apropriado. No entanto, para 320x200 ou superior e se você deseja ter uma boa interface gráfica, começará a se comunicar com a interface paralela. Nesse caso, você usa algum GPIO (mas isso sobrecarrega a MCU porque você terá que interromper as linhas de controle) ou escolhe um MCU que possui uma interface LCD dedicada (que geralmente é a mesma que uma interface de memória externa). Este último coloca uma forte restrição à escolha do MCU, mas você não tem outras restrições fortes, então ...

Agora você escolhe

Acesse o site da ST Micro / NXP / Atmel e use suas ferramentas de seleção de MCU. Você também gastará muito tempo lendo folhas de dados. Tome esse tempo. Não é desperdiçado. Tudo o que você aprender aqui, mesmo que não o utilize especificamente para este projeto, pode ser útil.

Nesse ponto, você também precisa dar uma olhada no número de PINs necessários e verificar o esquema de multiplexação dos candidatos escolhidos à MCU para verificar se você pode usar todas as funções dos PINs necessárias. Como é óbvio, convém levar as MCUs com o menor número de pinos que atenda aos seus requisitos (por razões de custo / PCB no setor imobiliário).

Verifique os preços / disponibilidade na Mouser / Digikey. Mas você não deve precisar de algo particularmente caro aqui. Talvez 5 € ou mais.

Última coisa sobre o controle do LCD

Parece que a atualização do LCD faz parte do seu loop principal. Não deveria. Especialmente se você estiver repetindo 100 vezes por segundo, é inútil. Faça o loop de controle calcular tudo e ajuste o comando do motor em cada iteração, mas apenas atualize os valores para exibir em algum lugar na memória. Em seguida, faça com que outro loop com prioridade mais baixa exiba essas informações para o usuário quando não houver nada mais importante a fazer.

Sim, idealmente, requer alguma troca de tarefas e outras coisas. Um sistema operacional real, na verdade (pesquisa FreeRTOS, Coocox OS, Nuttx, ... esses são muito pequenos, são amplamente usados ​​no Cortex-M e fornecem os mecanismos de multitarefa necessários).


Muito obrigado pela sua resposta abrangente! Percebo que todos os MCUs do ARM Cortex funcionam em 3.3V. Meu sinal do acelerador precisa variar entre 1 e 5V. Eu estou supondo que, se eu quiser usar um controlador ARM, terei que encontrar uma maneira de aumentar a tensão, pois ela será limitada em 3,3V a partir do MCU?
Eliott W

Sim. O sinal do acelerador é a saída analógica, certo? Nesse caso, você pode usar um opamp para amplificá-lo.
dim

Não sei se concordo com a última frase sobre a exigência de "um sistema operacional real". Suponho que depende de quanto você deseja em termos de soluções prontas. Se você quiser algo em que possa simplesmente inserir sua lógica de negócios e começar a interromper as unidades, sim, um sistema operacional completo (observe que isso não precisa significar algo como Windows ou mesmo Linux!) Certamente é útil.
um CVn

11
@ MichaelKjörling, é claro, não quis dizer algo remotamente parecido com o Linux. Mas algo como FreeRTOS, Coocox OS ou Nuttx, por exemplo. Estes são o que eu considero sistema operacional real , embora muito pequeno. Escrevi isso porque, de fato, fazer isso em bare-metal levará mais tempo, será uma dor de depuração e será menos flexível. E o ambiente do Arduino (embora eu esteja longe de ser um especialista nisso) não parece fornecer mecanismos de tarefas (e, como tal, não o considero um sistema operacional real ).
dim

11
Ah Bem, entendi errado a parte "real", então. Apenas para o benefício de nós, estrangeiros, que ocasionalmente acabamos por aqui, considere esclarecer essa parte da sua resposta.
um CVn

4

Observe que este é um assunto amplo que pode ser respondido corretamente usando várias abordagens (subjetivas).

Além disso, o formato stackexchange não é bom para projetar soluções para problemas. Por exemplo, você raramente leva as pessoas a projetar hardware para você. Em vez disso, você propõe um design de hardware e faz perguntas sobre ele.

Dito isto...

Comece com os recursos do processador que você não pode alterar. Tais como velocidade e tamanho da memória (se aplicável). Investigue se você precisa de interrupções e quão complexa é a manipulação de interrupções.

Se você precisar de suporte periférico, como ADCs ou DACs, a situação é mais complexa. Esses recursos devem estar embutidos no processador ou serem externos ao processador. Preço, precisão e até ruído são fatores nessa decisão.

Se houver suporte a periféricos externos, considere o tipo de comunicação serial necessária. O hardware externo pode precisar de SPI, I2C ou outro tipo de UART. Se a taxa de dados for alta, talvez seja melhor encontrar um processador com recursos de DMA associados às suas portas de comunicação serial.

Por fim, se esse for um aplicativo de processador incorporado (que normalmente significa um processador dedicado a uma tarefa), considere dividir os requisitos em vários grupos e designar um processador para cada um. Por exemplo, um processador de exibição da GUI provavelmente não precisa de um recurso ADC. Essa abordagem objetiva para solucionar problemas provou ser bem-sucedida em software e, com a queda dos preços do processador, também pode ser aplicada ao hardware.

No mundo real, essa abordagem é iterativa. Ou seja, muitos projetos começam com um processador e trocam processadores diferentes à medida que ocorrem problemas de hardware e / ou software ou o escopo do projeto muda.


Você julga melhor que tipo de números esperar do que o compilador. Eu evitaria a abordagem genérica de usar carros alegóricos. Por exemplo, pode ser que os resultados flutuantes não sejam os mesmos em diferentes plataformas! Eu usaria aritmética inteira e adaptava a solução às suas necessidades.
St2000 #

3

Não vi ninguém mencionar o custo das ferramentas. Minha empresa escolheu uma TI CC2541 e descobriu que ela era compilada apenas com um compilador de US $ 4 mil IAR, definitivamente uma parada para um hobby. Também o programador. Pode custar US $ 20 ou muito mais. As ferramentas mais baratas parecem mais a norma agora, então talvez isso seja coisa do passado em breve.

Além disso, se você mesmo refletir, pacotes como o TQFP são mais fáceis do que, digamos, o BGA. É difícil acertar um BGA grande, com base na experiência pessoal.


2

Se o produto for relativamente sensível ao preço e você tiver um financiamento decente para o desenvolvimento, poderá adquirir vários painéis de avaliação e criar um perfil do código em cada um para ter uma idéia. Isso deve ser bastante simples se o seu código for escrito em C. portátil. Além do micro, você avaliará as cadeias de ferramentas com versões demo antes de arcar com os custos de um IDE completo, como o IAR ou o Keil. Em alguns casos, você pode criar um perfil do código de gargalo diretamente no IDE sem hardware.

Se você está fortemente restrito ao custo de desenvolvimento, pode ser necessário se comprometer a encontrar algo que não custa muito para a configuração de desenvolvimento.

Por exemplo, a ST possui uma placa de avaliação ARM Cortex M7 com uma bela tela colorida por <$ 100. Ele possui uma FPU com recursos DSP para que você possa fazer tudo o que falou com facilidade - provavelmente executar um loop PID a 100kHZ em vez de apenas 100Hz. Provavelmente é um exagero, a menos que a exibição seja uma prioridade.

Se você está buscando um processador mais barato sem FPU, provavelmente desejará criar um perfil do código PID em sua forma final. Verifique se todos os fatores de escala, linearização e calibração estão incluídos, pois eles podem aumentar em termos de tempo de processamento.

Geralmente, os periféricos e a qualidade e disponibilidade de middleware associados (e os termos de licença) influenciam fortemente sua escolha. Se você precisar do modo de host BT ou Wifi ou USB e dos arquivos FAT para armazenar em um pen drive ou em uma interface SD rápida, todos esses fatores serão importantes. Alguns chips possuem um controlador LCD integrado e um controlador digitalizador que podem permitir o uso de um painel TFT relativamente barato. Não negligencie as altas taxas de licenciamento.

Se você tiver alguma idéia da memória do programa necessária, velocidade de processamento e periféricos (inclua a FPU), poderá fazer uma pesquisa paramétrica no distribuidor antes de pesquisar as folhas de dados. Algumas coisas que são muito restritivas podem ser - pacote através do orifício, DAC interno, Ethernet PHY interna, FPU. Provavelmente, nada disso é necessário e pode restringir indevidamente suas escolhas prematuramente.

Boa sorte com isso, é muito trabalho fazer isso corretamente. Na minha experiência, é uma falsa economia reduzi-lo muito perto de um novo produto, porque o (s) cliente (s) inevitavelmente pedem coisas que você não antecipou e você deseja ter alguma capacidade disponível para supri-lo sem recomeçar. Por outro lado, se o produto for muito caro, você não poderá vender o suficiente em margens adequadas para sustentar os negócios.


1

Existem várias plataformas diferentes que você pode começar a procurar, como Arduinos, microcontroladores PIC, FPGAs e muito mais. Eu trabalhei com o Arduinos no passado e ele possui uma porta ADC capaz de atingir 74kS / s. 100 amostras por segundo é extremamente lento e estou me perguntando como você descobriu isso. Por outro lado, você deseja se perguntar se precisará de algum tipo de interface, como SPI, CAN, I2C ou UARTs. Todos eles podem ter seus próprios benefícios e cabe a você considerar se estará conversando com um ou mais escravos. O último passo, mas provavelmente o mais importante, seria adivinhar quantos pinos do microcontrolador você precisará usar.

"A capacidade de ler sinais analógicos para digitais sem interromper o processador seria ótima." Posso adivinhar dizendo que você não deseja lidar com buffers externos ou internos que circularão seus dados e potencialmente diminuirão o processamento de dados. Isso esta certo? Nesse caso, é mais programado, mas os processadores geralmente são capazes de lidar com a velocidade de 100 amostras por segundo. Depende de você programar o relógio, a taxa de amostragem e o restante.

Além disso, considere interrupções no seu programa se desejar manter a amostragem de dados continuamente e executar outra tarefa quando um sinalizador for levantado.


2
Eu acho que você perdeu o ponto. Ele tem um protótipo construído em um Arduino. A amostragem não é lenta. Os loops de controle ESTÃO lentos. Ele tem três controladores PID sendo calculados usando ponto flutuante no Arduino, então eles são mais lentos que o melaço em um inverno antártico. Portanto, amostragem não é o problema. Código ineficiente é.
JRE

Você está certo sobre isso.
usar o seguinte código

Sim, o problema é que, embora meus loops estejam em aritmética longa e não em pontos flutuantes, há tantos cálculos a serem feitos que, como o Arduino tira uma amostra uma vez por loop, minha taxa de amostragem é muito pequena (atualmente 20 amostras por segundo) .
Eliott W
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.