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

Проблемы со скоростью АЦП у PIC.

ДД.

Столкнулся с следуйщей проблемой: не хватает скорости АЦП у pic. Исходно задача стоит следуйщим образом: есть прерывание по таймеру, срабатывает со скоростью 12000 раз в секунду. Надо используя прерывание в том числе запускать АЦП и получать с него данные.

Алгоритм работы с АЦП у меня следуйщий: при инициализации портов и т.д. задаю режим работы - от внутреннего опорника, 0-й канал. После чего при каждом прерывании выполняется следуйщий алгоритм: начало преобразования (adcon -> go), выход из прерывания. При следуйщем прерывании - контролируем бит go - если не сбросился, ждем следуйщего прерывания и по новой.... Так вот: если прерывание идет с частотой например 1000 раз в секунду - все отлично работает. А на 12000 раз в секунду - вылетает из ацп постоянный код, не зависящий от входного напряжения. Сам сигнал на входе - очень медленно меняющийся, снаружи стоят кондеры в 0.1 и 1 мкф. Бился и так и этак. Пробывал и такую схему: в 1-ом прерывании программирую АЦП, во втором - запускаю, далее контролирую состояние бита GO/~Done, пока не снимется и по новой. Получается таже балалайка. Временные параметры на зарядку внутреннего конденсатора в пике - соблюдены.... Может кто-нибудь что-нибудь подскажет????? 2-ой день сижу с этой проблемой. Я конечно понимаю, что она, возможно и пустяковая, но тем не менее...

Сама программа - на ассемблере... оргинал кода привести сейчас не могу - по памяти боюсь ошибиться примерно вот такая конструкция.Сам пик - 16f676.... Прошу извинения за отсутствие формата - сам движок форума переформатирует нормальный формат.

 

start_irq

 

BTFSC ad_status,0

goto start_ad

 

movlw 0x41

movwf ADCON

BSF ad_status,0

goto next_irq

 

start_ad

 

BTFSC ad_status,1

goto wait_ad

BSF ADCON, GO

BSF ad_status,1

goto next_irq

 

wait_ad

 

BTFSC ADCON,GO

goto next_irq

MOVF adresh,w

movwf ad_result

CLRF ad_status

 

next_irq

 

retfie

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

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


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

Да в общем то никогда вопросов не было, привожу фрагменты кода, который работает и позволяет

обновлять данные с частотой больше 12000 раз в секунду (зависит от программы интерпретации результатов иззмерения Сode_Сompare). Код приведён для Pic12f675 (тактовая частота 4 MHz).

Fragment.txt

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


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

<< После чего при каждом прерывании выполняется следуйщий алгоритм: начало преобразования (adcon -> go), выход из прерывания. При следуйщем прерывании - контролируем бит go - если не сбросился, ждем следуйщего прерывания и по новой.... >>

 

При таком алгоритме нет синхронизации между прерыванием таймера и преобразованием АЦП.При

кварце 4 МГц таймер прерывается каждые 83 мксек.Время преобразования АЦП ~25 мксек.

Остается 58 мксек(58 однотактных команд).Необходимо тщательно проанализировать программу , чтобы время выполнения остальных команд не превысило это время.(Морока).

 

АЦП работает на пределе.Таймер я бы выбросил и организовал работу по прерыванию АЦП , а не

таймера.

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


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

Частота пика - 20 мегагерц, по времени преобразования - все ок. В чем дело - сам не пойму. Проверил все уже сто раз. Прерывание на время преобразования не нужно делать - я контролирую флаг done.

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


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

PIC16F676 не имеет ни одного полноценного порта.Он предназначен для построения цифровых

регуляторов. Как вы оцениваете результат измерения? Вероятно там и причина.

В вашем фрагменте вы считываете 1 байт измерения, а надо два.Где неточность?

Для чего таймер? Для использования АЦП в Sleep режиме? Но это работает на внутренний RC

генератор 4МГц.

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


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

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

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


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

Самое интересное, что этот-же код прекрасно работает в 16f87x Серии, конечно, с учетом разницы перифирии - и на 20000 раз в секунду. Ладно, с 676 я забил. Правда, я у 676 заводские константы потер - может и в этом дело было...

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


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

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

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

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

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

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

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

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

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

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