2016-02-10 5 views
1

Адаптер Adu D Arduino занимает около 0,1 мс в соответствии с руководством. На самом деле, мои тесты показывают, что на Uno я могу выполнить около 7700 в секунду в цикле.Вычисление во время аналоговой обработки на Arduino

К сожалению, analogRead ждет пока чтение выполняется, что затрудняет получение чего-либо.

Я хочу чередовать вычисления с серией конверсий A/D. Есть ли способ инициировать analogRead, а затем проверить время и получить завершенное значение позже? Если это должно быть низкоуровневым и не переносимым для других версий, я могу справиться с этим.

Ищет решение, позволяющее регулярно собирать все каналы на Arduino, а затем отправлять данные через SPI или I2C. Я готов рассмотреть прерывания, но выборка должна оставаться чрезвычайно периодической.

ответ

1

Да, вы можете запустить преобразование АЦП, не дожидаясь его завершения. Вместо использования analogRead ознакомьтесь с примером Ник Гаммон here в разделе «Прочитать без блокировки».

Для достижения регулярной частоты дискретизации, вы можете:

1) Пусть работают в автономном режиме, в котором он принимает образцы так быстро, как это возможно, или

2) Используйте таймер ISR для запуска АЦП или

3) Используйте millis(), чтобы начать конвертацию периодически (обычное «опрос»). Убедитесь, что для перехода к следующему времени преобразования путем добавления к ранее вычисленного времени преобразования, не путем добавления к текущему времени:

uint32_t last_conversion_time; 

void setup() 
{ 
    ... 
    last_conversion_time = millis(); 
} 

void loop() 
{ 
    if (millis() - last_conversion_time >= ADC_INTERVAL) { 
    <start a new conversion here> 

    // Assume we got here as calculated, even if there 
    // were small delays 
    last_conversion_time += ADC_INTERVAL; // not millis()+ADC_INTERVAL! 

    // If there are other delays in your program > ADC_INTERVAL, 
    // you won't get back in time, and your samples will not 
    // be regularly-spaced. 

Независимо от того, как вы начать преобразование периодически, вы можете либо опрос для завершения или присоедините ISR, который будет вызываться, когда он будет завершен.

Обязательно используйте ключевое слово volatile для переменных, которые совместно используются ISR и loop.

 Смежные вопросы

  • Нет связанных вопросов^_^