Перейти к содержанию
    

Быстро считать данные с АЦП

Встала задача быстро считывать данные с 24 битного АЦП, для этого использую Mega128 с внутренним тактовым генератором (8 МГц), написал такой код:

#define SET_SCLK_ADC PORTC|=(1<<3)                    
#define CLR_SCLK_ADC PORTC&=~(1<<3)       

#define GET_SDO_ADC ((PINC)?1:0)                     
.......
.......

        SET_SCLK_ADC;CLR_SCLK_ADC;
    bufferA<<=1;
    bufferA|=GET_SDO_ADC;

..... и так 24 раза, цикл не использую что-бы не тратить время на проверку условия выполнения цикла......
        
        SET_SCLK_ADC;CLR_SCLK_ADC;
    bufferС<<=1;
    bufferС|=GET_SDO_ADC;

 

 

В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Встала задача быстро считывать данные с 24 битного АЦП...

В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.

Изменено пользователем smac

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каждый цикл у тебя 0.125мкс.

Можно соптимизировать на пару мкс.

Легче станет?

Читай выше и меняй АЦП на более секретную модель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.

При низких тактовых частотах аппаратная реализация TWI работает существенно медленнее, чем чисто программная. Если, конечно, цикл "вылизать".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.

 

Модель совсем не секретная - это AD7767, интерфейс у него не I2C, а похож не SPI (это односторонний интерфейс только для считывания)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модель совсем не секретная - это AD7767, интерфейс у него не I2C, а похож не SPI (это односторонний интерфейс только для считывания)

Так, может быть, и приспособить SPI, и не мучаться ? Ну, а если надо программно и быстро, то вполне можно обойтись четырьмя тактами на бит - тактировкой манипулировать, используя предварительно загруженные состояния порта в регистрах (out выполняется за один такт, а SBI/CBI - 2 такта), ввод еще два такта (только там надо правильно сфазировать фронты тактирования относительно выборк). Итого 24x4 такта плюс подготовительные операции (загрузка регистров для вывода в порт и очистка аккумуляторов результата) = меньше 13 uS @ 8 MHz.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В итоге мой код выполняется за 40 мкс. Как можно его ускорить

На АСМе раза в 2 быстрее будет - считывание 1 бита

    sbi        PORTС,PIN_CLK        
     clc
     sbic    PINС,PIN_DATA
     sec
     rol        r0
     cbi        PORTС,PIN_CLK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На АСМе раза в 2 быстрее будет - считывание 1 бита

    sbi        PORTС,PIN_CLK        
     clc
     sbic    PINС,PIN_DATA
     sec
     rol        r0
     cbi        PORTС,PIN_CLK

На один такт сокращается заменой clc-sbic-sec-rol на lsl-sbic-ori. Но аккумуляторы можно сбросить один раз заранее, и это сокращает еще один такт на бит (но вот тут надо учесть возможную задержку семплирования состояния ноги самим процессором, кажется, там где-то полтакта набегает).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, как дети...

Чего надо добиться-то?

Писатели выше пишут как про разгон видеоплат.

Слов много, а цена вопроса...

Там спортивный интерес, понятно.

Андерсон так и не написал нахрена попу гармонь (хоть признался про 7767).

8мГц. А Вы тут про его экономию 5руб. на кварце развлекаете. А то он не знает.

Может такие проблеммы надо в корне решать?

АСЕм, Си, можно про Паскаль поговогить.

Я давно-бы сдох с голоду, если бы про аккумуляторы писал.

В пинципе, один раз поголодать можно.

Да и профессионалы с пятью квадрариками в последнее время...

Маленькую LPC и голову себе не забивать.

Iar пока ...

Всех уважаю.

Изменено пользователем kiv121

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Читать не все биты, а например только 12. Скажите вот нафига вам 24 бита на большой скорости? кто их обрабатывать будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Маленькую LPC и голову себе не забивать.
Ну как маленькие дети... Если нужно 20 мА на выход, EEPROM на >10000 циклов и вечер перестанет быть томным. Русскую забаву "суп из топора" не предлагать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

vvs157, всё понравилось, а на МКС скоро экипаж поменяется.

Изменено пользователем kiv121

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...