Página 1 de 1
DMA é Suficiente?

Enviado:
04 Jun 2009 12:58
por Jorge_Francisco
Olá Pessoal,
Me surgiu esta dúvida quando estava analisando um projeto. O projeto consiste em um AD de 30MHz, com saída na mesma frequencia do clock, ou seja, a saída paralela de dados é atualizada a uma taxa de 30Mhz. Minha pergunta é, poderia usar algum ARM para ler estes dados diretamente em alguma porta, com DMA ou sei lá o que?
Abraço,
Jorge

Enviado:
04 Jun 2009 13:10
por Jorge_Francisco
Editei acima. Na verdade,um clock entre 20Mhz e 30Mhz seria razoável para a minha aplicação. Será que ainda que tem ARM que poderia ler o AD diretamente e armazenar este valores(Aproximadamente 10.000 leituras)?

Enviado:
04 Jun 2009 15:44
por tcpipchip
um barato...LPC2103

Enviado:
04 Jun 2009 19:49
por MarcusPonce
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.

Enviado:
05 Jun 2009 14:27
por tcpipchip
desculpe...eu nao tinha entendido a pergunta...
Quanto A/D que faz DIRECT MEMORY ACCESS, parece que alguns chips STM32 tem este recurso...
Eu lembro que o ECG que montei para um STM32 (STM32 CIRCLE OS)... lia o A/D e mandava direto para a memoria memoria INTERNA via DMA...
T+
TCPIPCHIP

Enviado:
07 Jun 2009 13:04
por Jorge_Francisco
Muito Obrigado MarcusPonce. Estou achando que o jeito será usar uma fifo mesmo. Queria usar ARM e entrar neste mundo, mas já vi que não será dessa vez,hehehe.

Enviado:
11 Jun 2009 08:01
por RobL
Dê uma olhada no Xmega da Atmel, apesar de 8 bits, tem velocidade compatível com ARMs em certas aplicações.
DMA:
http://www.atmel.com/dyn/resources/prod ... oc8046.pdf