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

 
 
> Проблемы со скоростью АЦП у PIC.
angir
сообщение Nov 17 2005, 16:45
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 8-02-05
Из: 61RUS
Пользователь №: 2 510



ДД.
Столкнулся с следуйщей проблемой: не хватает скорости АЦП у 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 - Nov 17 2005, 16:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
greg
сообщение Nov 18 2005, 06:49
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 44
Регистрация: 7-07-05
Из: МОСКВА
Пользователь №: 6 604



Да в общем то никогда вопросов не было, привожу фрагменты кода, который работает и позволяет
обновлять данные с частотой больше 12000 раз в секунду (зависит от программы интерпретации результатов иззмерения Сode_Сompare). Код приведён для Pic12f675 (тактовая частота 4 MHz).
Прикрепленные файлы
Прикрепленный файл  Fragment.txt ( 999 байт ) Кол-во скачиваний: 75
 
Go to the top of the page
 
+Quote Post
upc2
сообщение Nov 18 2005, 06:52
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



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

При таком алгоритме нет синхронизации между прерыванием таймера и преобразованием АЦП.При
кварце 4 МГц таймер прерывается каждые 83 мксек.Время преобразования АЦП ~25 мксек.
Остается 58 мксек(58 однотактных команд).Необходимо тщательно проанализировать программу , чтобы время выполнения остальных команд не превысило это время.(Морока).

АЦП работает на пределе.Таймер я бы выбросил и организовал работу по прерыванию АЦП , а не
таймера.
Go to the top of the page
 
+Quote Post
angir
сообщение Nov 19 2005, 09:49
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 8-02-05
Из: 61RUS
Пользователь №: 2 510



Частота пика - 20 мегагерц, по времени преобразования - все ок. В чем дело - сам не пойму. Проверил все уже сто раз. Прерывание на время преобразования не нужно делать - я контролирую флаг done.
Go to the top of the page
 
+Quote Post
upc2
сообщение Nov 21 2005, 05:59
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



PIC16F676 не имеет ни одного полноценного порта.Он предназначен для построения цифровых
регуляторов. Как вы оцениваете результат измерения? Вероятно там и причина.
В вашем фрагменте вы считываете 1 байт измерения, а надо два.Где неточность?
Для чего таймер? Для использования АЦП в Sleep режиме? Но это работает на внутренний RC
генератор 4МГц.
Go to the top of the page
 
+Quote Post
bav
сообщение Nov 22 2005, 11:20
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



Попробуй синхронизировать АЦП от кварцевого генератора, уменьши время преобразования АЦП (не ниже рекомендуемого). Если переключаешь каналы, делай задержку перед преобразованием и т. д. (как написано в DataSheet). Проверь, не изменяются ли данные, приходящие с АЦП другими подпрограммами (может что-то не успевает выполниться).
Go to the top of the page
 
+Quote Post
angir
сообщение Nov 24 2005, 18:00
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 8-02-05
Из: 61RUS
Пользователь №: 2 510



Самое интересное, что этот-же код прекрасно работает в 16f87x Серии, конечно, с учетом разницы перифирии - и на 20000 раз в секунду. Ладно, с 676 я забил. Правда, я у 676 заводские константы потер - может и в этом дело было...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:26
Рейтинг@Mail.ru


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