Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Быстро считать данные с АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
nikolas_osu
Встала задача быстро считывать данные с 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 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?
smac
Цитата(nikolas_osu @ Mar 19 2010, 06:43) *
Встала задача быстро считывать данные с 24 битного АЦП...
В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.
kiv121
Каждый цикл у тебя 0.125мкс.
Можно соптимизировать на пару мкс.
Легче станет?
Читай выше и меняй АЦП на более секретную модель.
rx3apf
Цитата(smac @ Mar 19 2010, 07:51) *
Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.

При низких тактовых частотах аппаратная реализация TWI работает существенно медленнее, чем чисто программная. Если, конечно, цикл "вылизать".
nikolas_osu
Цитата(smac @ Mar 19 2010, 09:51) *
Модель АЦП видимо секретная, но по коду видно что с последовательным интерфейсом (похоже I2C), поэтому вариант следующий - попробовать использовать периферийный модуль TWI микроконтроллера, который сделает всю грязную работу за Вас. Если это не подходит - написать функцию получения отчета АЦП на ассемблере и не париться.


Модель совсем не секретная - это AD7767, интерфейс у него не I2C, а похож не SPI (это односторонний интерфейс только для считывания)
rx3apf
Цитата(nikolas_osu @ Mar 19 2010, 13:41) *
Модель совсем не секретная - это AD7767, интерфейс у него не I2C, а похож не SPI (это односторонний интерфейс только для считывания)

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

На АСМе раза в 2 быстрее будет - считывание 1 бита
Код
    sbi        PORTС,PIN_CLK        
     clc
     sbic    PINС,PIN_DATA
     sec
     rol        r0
     cbi        PORTС,PIN_CLK
rx3apf
Цитата(vvs157 @ Mar 19 2010, 14:04) *
На АСМе раза в 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. Но аккумуляторы можно сбросить один раз заранее, и это сокращает еще один такт на бит (но вот тут надо учесть возможную задержку семплирования состояния ноги самим процессором, кажется, там где-то полтакта набегает).
kiv121
Блин, как дети...
Чего надо добиться-то?
Писатели выше пишут как про разгон видеоплат.
Слов много, а цена вопроса...
Там спортивный интерес, понятно.
Андерсон так и не написал нахрена попу гармонь (хоть признался про 7767).
8мГц. А Вы тут про его экономию 5руб. на кварце развлекаете. А то он не знает.
Может такие проблеммы надо в корне решать?
АСЕм, Си, можно про Паскаль поговогить.
Я давно-бы сдох с голоду, если бы про аккумуляторы писал.
В пинципе, один раз поголодать можно.
Да и профессионалы с пятью квадрариками в последнее время...
Маленькую LPC и голову себе не забивать.
Iar пока ...
Всех уважаю.
defunct
Цитата(nikolas_osu @ Mar 19 2010, 05:43) *
В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Читать не все биты, а например только 12. Скажите вот нафига вам 24 бита на большой скорости? кто их обрабатывать будет?
vvs157
Цитата(kiv121 @ Mar 20 2010, 11:22) *
Маленькую LPC и голову себе не забивать.
Ну как маленькие дети... Если нужно 20 мА на выход, EEPROM на >10000 циклов и вечер перестанет быть томным. Русскую забаву "суп из топора" не предлагать.
kiv121
vvs157, всё понравилось, а на МКС скоро экипаж поменяется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.