Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
repairman (Guest)
Добавлено 20.03.2009 11:18 Редактировалось 20.03.2009 11:18 Сообщение: 81
repairman (Guest)

2susamy:
Ты опору АЦП дать не забыл ??? (J1)

Все пучком, работает...
Изменение входного напряжения от 0 до U оп. (3.3в) дает изменение 0x0000...0x03ff на выходе АЦП... типичный униполярный 10 битный АЦП...

Обработчик прерывания выглядит у меня так:
Код

static irqreturn_t at91tc0_isr (int irq, void *dev_id)
{
int status;
//struct timeval time;
static int timecount = 0;

// Read TC0 status register to reset RC compare status.
status = ioread32(at91tc0_base + AT91_TC_SR);

timecount++;
if (timecount >= SAMPLE_INTERVAL_MS)
{
timecount = 0;

if (ioread32(at91adc_base + AT91_ADC_SR) & AT91_ADC_DRDY)
{
// Copy converted data to module ring buffer.
at91adc_pbuf0[at91adc_appidx] = ioread32(at91adc_base + AT91_ADC_CHR(0));
at91adc_pbuf1[at91adc_appidx] = ioread32(at91adc_base + AT91_ADC_CHR(1));

// Increment the ring buffer index and check for wrap around.
at91adc_appidx += 1;
if (at91adc_appidx >= MAX_ADCSAMPLES)
at91adc_appidx = 0;
}

// Trigger the ADC (this will be done using TIOA automatically eventually).
iowrite32(AT91_ADC_START, (at91adc_base + AT91_ADC_CR));
}

return IRQ_HANDLED;
}


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

Вот так еще удобно смотреть в реалтайм на работу АЦП:
Код

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* f;
int chr;
f=fopen("/dev/adc0","r");
while (1)
{
chr=fgetc(f);
printf("%02x%02x ", fgetc(f),chr);
}

}


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 11:46:40
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 20.03.2009 11:50 Редактировалось 20.03.2009 11:50 Сообщение: 82
repairman (Guest)

2MiniMax:
Цитата

mV = (adcValue * 3.0) / 1023.0;

Опора, если взята с внутреннего LM1086 будет 3.267...3.333 в, т.е. ~3.3 в

p.s. по-хорошему АЦП нужен отдельный прецезионный источник опорного напряжения... иначе несколько бит будут просто недостоверными... как у китайского тестера, последний знак, а иногда и два - нужно заклеить, чтобы не вводили в заблуждение... ...отображаемые там цифры не имеют никакого отношения к реальной измеряемой величине...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 17:25:45
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 20.03.2009 14:52 Редактировалось 20.03.2009 14:52 Сообщение: 83
repairman (Guest)

Кстати, на AT91SAM7X я несколько по-другому делал чтение с ADC...
АЦП SAM'ов (и 9260 тоже) может работать с автозапуском от таймера, обработчик прерывания упрощается - руками толкать и проверять наличие данных в регистре - уже нет необходимости... первое происходит само, без второго не произойдет прерывание... и "дрожание" момента выборки не происходит, т.к. больше не зависит от выполняемого кода...
А еще можно DMA запустить на ADC... вообще процессор освобождается... вот только, хоть убейте меня, я не понимаю КАК разделить данные разных каналов при DMA ??? Никому такая хитрость не удавалась ?

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 16:07:08
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 20.03.2009 14:55 Редактировалось 20.03.2009 14:55 Сообщение: 84
sasamy (Guest)

Цитата
Ты опору АЦП дать не забыл ???

Опорное на месте - 3.3 В (если идти со стороны красной кнопки на J1- пусто, перемычка х2), вход ацп - PC0 (26 пин на Х1) - ацп не реагирует.
Цитата
Тот драйвер без изменений сильно грузит систему вплоть до остановки сети

я делаю с дма - систему вообще не грузит, только одни ноли валятся вместо данных :) единственное - я делаю на ядре 2.6.28.1, там есть небольшие изменения по структуре исходников по сравнению с 2.6.24, в драйвере с at91.com я только пути к инклудам поменял... возможно в инклудах гд-то ошибка закралась , но это уже фантастика :) вообще непонятно - на пустом месте споткнулся с этим ацп...
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 20.03.2009 15:00 Редактировалось 20.03.2009 15:00 Сообщение: 85
repairman (Guest)

Цитата

я делаю с дма - систему вообще не грузит, только одни ноли валятся вместо данных :)


КАК ??? Если один канал, еще понятно... а если 4 канала нужны ???

Цитата

единственное - я делаю на ядре 2.6.28.1, там есть небольшие изменения по структуре исходников по сравнению с 2.6.24, в драйвере с at91.com я только пути к инклудам поменял... возможно в инклудах гд-то ошибка закралась , но это уже фантастика :) вообще непонятно - на пустом месте споткнулся с этим ацп..


У меня даже свежее:

Linux at91sam9260dfc 2.6.28.6 #19 PREEMPT Fri Mar 13 10:04:55 MSK 2009 armv5tejl unknown

Да, и драйвер я внутрь ядра собрал, НЕ модулем...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 15:02:17
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 20.03.2009 15:07 Редактировалось 20.03.2009 15:07 Сообщение: 86
sasamy (Guest)

Цитата
КАК разделить данные разных каналов при DMA

а разве они не друг за другом идут ? 0,1,2,3,0,1,2,3 итд ? да и на нашей плате только два канала физически доступно - 0,1. остальные доступны только в bga корпусе. К тому же канал 1 совпадает с pck0 который у меня используется для аудиокодека - так что мне без вариантов только 1 канал....

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно sasamy 20.03.2009 г. в 15:11:41
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 20.03.2009 15:12 Редактировалось 20.03.2009 15:12 Сообщение: 87
repairman (Guest)

Так, метод последовательного приближения... время измерения зависит от измеряемого напряжения... кто из них будет первым - непредсказуемо... а DMA сработает на того, кто первый дернет прерывание... когда один "готов", второй может еще быть "в процессе"...
Взять можно все данные, непонятно где чьи...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 15:19:24
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 20.03.2009 15:21 Редактировалось 20.03.2009 15:21 Сообщение: 88
sasamy (Guest)

Насколько я понял измерения идут последовательно и канал переключается только после окончания измерения предыдущего, хотя опыта у меня с этими процессорами нет - может и ошибаюсь.
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 20.03.2009 15:28 Редактировалось 20.03.2009 15:28 Сообщение: 89
repairman (Guest)

Насколько я знаю (поправьте, если я где-то ошибаюсь):
1. Каналы все стартуют хором, руками по ADC_CR/STRT либо сигналом от ADTRG (таймер, внешний вход и т.д.)
2. Преобразование происходит параллельно по всем каналам (??? не уверен.. не стыкуется с блок-схемой, но стыкуется с моими наблюдениями..)
3. Время измерения разное, кто будет первым - случайность ( ??? стыкуется с моими наблюдениями и принципами работы такогго ADC...)
4. Данные выдаются в общий регистр данных ADC_LCDR в порядке поступления, в нем предыдущие не взятые данные затираются текущими... (есть еще и персональные регистры для каждого канала ADC_CDR0..3)
5. DMA работает с ADC_LCDR и поэтому не может знать с какого канала данные.

Если я не прав и удастся гнать через DMA >1 канала... с меня море пива... А если еще и разные каналы с разной частотой дискретизации (мне через 1 канал звук гнать надо ~12 кГц, через остальные ~1..10 Гц)... Будет Даз ист фантастиш !!!

Цитата

да и на нашей плате только два канала физически доступно - 0,1. остальные доступны только в bga корпусе.


Посмотрим... может и в BGA дальше все будет строится... Хотя мне быстрый только 1 канал нужен, а из второго сделаем хоть 8, хоть ..дцать... аналоговых мультиплексоров кругом в изобилии...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 20.03.2009 г. в 16:29:56
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 20.03.2009 15:59 Редактировалось 20.03.2009 15:59 Сообщение: 90
sasamy (Guest)

Не могу ничего возразить - я даже один канал не могу запустить с готовым рабочим драйвером :) Но в пользу моей версии говорит прогрммируемый параметр Sample and Hold Clock cycles - какой в нем смысл если все данные будут попадать в LCDR беспорядочно как только в одном из каналов будут готовы данные ?
Спуститься к концу Подняться к началу
Форум » starterkit.ru » Embedded Linux