Eu tenho uma configuração, conectando uma placa do sensor Razor IMU , com uma placa RS-485 Breakout , a uma interface serial USB-RS485 via cabo USB no meu laptop. Eu executo um software no laptop (Max / MSP) que envia mensagens de pesquisa ao sensor, aguarda os dados de resposta e, ao receber a resposta, dispara automaticamente uma nova mensagem de pesquisa. É um loop constante:
- envie uma mensagem de pesquisa
- aguarde uma resposta
- em resposta, vá para 1.
Quero que essa pesquisa seja o mais rápida possível, pois terei de conectar 21 desses sensores ao mesmo barramento RS485. O firmware do Razor é programado com o Arduino IDE e, de acordo com o código, deve haver apenas um atraso de ~ 2ms entre a mensagem de pesquisa e a gravação da resposta. O firmware também gasta 12ms a cada 20ms em alocação e cálculo de sensores. Às vezes, esse cálculo atrasa a resposta à pesquisa. Estou ciente disso e todos os resultados estão em conformidade.
Meu problema agora é que a pesquisa do sensor está travada a uma taxa de atualização de 15 milissegundos em média. Olhei para os dados com meu pequeno osciloscópio usb e fiz um diagrama (> PDF).
Meu osciloscópio fica diretamente na interface USB-RS485 e vê o polling sair, e a mensagem de resposta é recebida. O atraso entre esses dois fica entre 2 e 13 ms. Essa diferença é explicável pelo fato de que, às vezes, a máquina de barbear está ocupada fazendo seus cálculos de matemática-sensor. O fato estranho é que, embora as respostas cheguem com atrasos diferentes, a pesquisa sempre sai no mesmo intervalo de cerca de 15ms.
Também implementamos a mesma configuração com
- codificando o firmware em C e programando o Razor com avr-dude
- fazendo a pesquisa de software no código Python
- no Mac OSX e PC Windows 7
Todas as combinações possíveis resultaram no mesmo intervalo de 15 ms. Portanto, o problema não está no código do Arduino, nem no Max / MSP. Suspeito que o problema possa estar relacionado à interface serial USB-RS485 e / ou ao driver FTDI necessário.
Esse problema parece familiar para alguém?
Respostas:
Isso se deve ao timer de latência de 16ms do driver FTDI e ao fato de que minhas respostas à pesquisa não foram longas o suficiente para preencher o buffer de 64 bytes para acionar automaticamente o esvaziamento do buffer. Leia AN232B-04_DataLatencyFlow.pdf se você estiver interessado, ou simplesmente vá para o Gerenciador de dispositivos e altere as configurações nas propriedades da porta serial USB.
fonte
Sem conhecer muitos detalhes (o que realmente não quero saber), eu culparia o adaptador USB para RS-485. Tivemos um problema semelhante em um processador Intel Q7 executando Linux com um desses adaptadores.
Estávamos usando o adaptador temporariamente até que nosso hardware personalizado estivesse pronto. Nosso hardware personalizado usa um link PCIe e um FPGA para fazer a mesma interface RS-485 (e muito mais). O software permaneceu o mesmo para o adaptador e nosso hardware personalizado. Quando mudamos para o hardware personalizado, o problema desapareceu.
fonte