реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Быстро считать данные с АЦП
nikolas_osu
сообщение Mar 19 2010, 03:43
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



Встала задача быстро считывать данные с 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 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?
Go to the top of the page
 
+Quote Post
smac
сообщение Mar 19 2010, 04:51
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(nikolas_osu @ Mar 19 2010, 06:43) *
Встала задача быстро считывать данные с 24 битного АЦП...
В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

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

Сообщение отредактировал smac - Mar 19 2010, 04:51
Go to the top of the page
 
+Quote Post
kiv121
сообщение Mar 19 2010, 05:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586



Каждый цикл у тебя 0.125мкс.
Можно соптимизировать на пару мкс.
Легче станет?
Читай выше и меняй АЦП на более секретную модель.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 19 2010, 10:06
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



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

При низких тактовых частотах аппаратная реализация TWI работает существенно медленнее, чем чисто программная. Если, конечно, цикл "вылизать".
Go to the top of the page
 
+Quote Post
nikolas_osu
сообщение Mar 19 2010, 10:41
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



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


Модель совсем не секретная - это AD7767, интерфейс у него не I2C, а похож не SPI (это односторонний интерфейс только для считывания)
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 19 2010, 10:57
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



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

Так, может быть, и приспособить SPI, и не мучаться ? Ну, а если надо программно и быстро, то вполне можно обойтись четырьмя тактами на бит - тактировкой манипулировать, используя предварительно загруженные состояния порта в регистрах (out выполняется за один такт, а SBI/CBI - 2 такта), ввод еще два такта (только там надо правильно сфазировать фронты тактирования относительно выборк). Итого 24x4 такта плюс подготовительные операции (загрузка регистров для вывода в порт и очистка аккумуляторов результата) = меньше 13 uS @ 8 MHz.
Go to the top of the page
 
+Quote Post
vvs157
сообщение Mar 19 2010, 11:04
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(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
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 19 2010, 11:45
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(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. Но аккумуляторы можно сбросить один раз заранее, и это сокращает еще один такт на бит (но вот тут надо учесть возможную задержку семплирования состояния ноги самим процессором, кажется, там где-то полтакта набегает).
Go to the top of the page
 
+Quote Post
kiv121
сообщение Mar 20 2010, 08:22
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586



Блин, как дети...
Чего надо добиться-то?
Писатели выше пишут как про разгон видеоплат.
Слов много, а цена вопроса...
Там спортивный интерес, понятно.
Андерсон так и не написал нахрена попу гармонь (хоть признался про 7767).
8мГц. А Вы тут про его экономию 5руб. на кварце развлекаете. А то он не знает.
Может такие проблеммы надо в корне решать?
АСЕм, Си, можно про Паскаль поговогить.
Я давно-бы сдох с голоду, если бы про аккумуляторы писал.
В пинципе, один раз поголодать можно.
Да и профессионалы с пятью квадрариками в последнее время...
Маленькую LPC и голову себе не забивать.
Iar пока ...
Всех уважаю.

Сообщение отредактировал kiv121 - Mar 20 2010, 08:49
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 20 2010, 20:02
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(nikolas_osu @ Mar 19 2010, 05:43) *
В итоге мой код выполняется за 40 мкс. Как можно его ускорить? Понятно что можно увеличить тактовую частоту а какие есть еще варианты?

Читать не все биты, а например только 12. Скажите вот нафига вам 24 бита на большой скорости? кто их обрабатывать будет?
Go to the top of the page
 
+Quote Post
vvs157
сообщение Mar 20 2010, 22:59
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(kiv121 @ Mar 20 2010, 11:22) *
Маленькую LPC и голову себе не забивать.
Ну как маленькие дети... Если нужно 20 мА на выход, EEPROM на >10000 циклов и вечер перестанет быть томным. Русскую забаву "суп из топора" не предлагать.
Go to the top of the page
 
+Quote Post
kiv121
сообщение Mar 21 2010, 08:14
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-09
Пользователь №: 53 586



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

Сообщение отредактировал kiv121 - Mar 21 2010, 08:22
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th July 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016