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!
fonte
Respostas:
(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á.
fonte
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.
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).
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte