por MarcusPonce » 04 Jun 2009 19:49
Este é uma pergunta interessante, com nuances não visíveis à primeira vista.
O melhor seria usar mesmo o DMA, pois é rápido e vários ARM7 do mercado certamente conseguiriam transferir 20Msamples/s a 30Ms/s
Mas para usar DMA existe um problema: quase nenhum ARM dispõe de uma entrada com a função de DMA Request. A função desta entrada seria o seguinte: o DMA transfere do AD para a memória uma amostra quando você der um pulso em DMA Request. Portanto, você ligaria nesta entrada o clock do AD. Veja que o clock do ARM só precisaria ser rápido, mas não precisaria ter relação com o clock do AD.
Acontece que na maioria dos ARMs por aí só existe DMA request internamente ao ARM, para conectar uma serial ou outro periférico interno dele. Exemplo: toda vez que chega um dado pela SPI ocorre o disparo do DMA e ele transfere o dado para a memória. Mas não tem como pendurar um AD externo e fazer a mesma coisa...
Agora de memória não lembro qual ARM sugerir, o qual tenha uma entrada DMA request.
Outra abordagem seria transferir usando firmware e você teria que fazer uma rotina bem otimizada. Mas provavelmente não daria tempo de ficar conferindo se tem dado novo disponível, transferindo para a memória, contando se já deu as 10000 amostras e incrementando ponteiro. Então provavelmente você faria a rotina apenas para incrementar ponteiro e transferir amostras. Teria que terminar disparando uma INT. E teria que sincronizar o clock do ARM com o clock do AD, para não precisar ficar esperando o instante certo de pegar a amostra nova. Ou seja: cada clock do AD tem que corresponder exatamente a X clocks do ARM suficientes para uma volta do loop que está transferindo e incrementando o ponteiro.
Não é muito bonito mas funciona.
Outra idéia: Coloca uma memória FIFO que caibam as 10000 amostras, entre o AD e o ARM. Depois transfere mais lentamente usando firmware mesmo. Bem, é mais fácil porém não é barato.