Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 98 99

Грубо, порядка 30 мкС на одно преобразование хватит, т.е. за 1мС можно несколько десятков замеров сделать.
Зависит от самого МК, необходимости переключать канал АЦП, от требуемой точности (разрядности) и т.п.
Чем точнее требуется результат, тем медленнее нужно тактировать АЦП, и тем больше времени на перезаряд внутренней емкости.

 

Даже не так! АЦП работает следующим образом: внутрений конденсатор АЦП подключается в внешней ножке и от него заряжается (делаем таймаут на необходимое время). Отключается от ножки и подключается к внутренним цепям АЦП и начинается само преобразование. ... Так вот, захват (защелкивание) сигнала идет в момент отключения конденсатора от внешней ножки. Это происходит в момент подачи команды "начать преобразование".
Время зарядки этого самого конденсатора зависит от внутреннего сопротивления источника сигнала и самого АЦП.
DWD, конкретно для PIC12F675 смотрите раздел "7.2 A/D Acquisition Requirements" и параметр "Hold Capacitor Charging Time" для "charge holding capacitor (CHOLD)". Это и будет Ваш искомый параметр. Т.е. грубо это порядка минимум 16.47μs. Ну а как долго Вы захотите это преобразовывать, это уже второй вопрос. 16е ПИКи, если я не ошибаюсь, в основном способны выжать до 200 тыс. преобразований в секунду (10 бит).
....
Чуть не правильно понял DWD, не буду удалять вышеописанное. Полное преобразование от 20 мкс, детали смотрите там-же (TACQ). Вопрос в другом, за эти 20 мкс на 4 МГц МК успеет выполнить те-же 20 команд. Успеете за это время обработать и передать результат? Если за 1мс=1000мкс - то вполне!

 

Сергей К: DWD, конкретно для PIC12F675 смотрите раздел "7.2 A/D Acquisition Requirements" и параметр "Hold Capacitor Charging Time"...

Спасибо, уже смотрел. В даташите показан пример вычисления и получилось время 10мкс.
Но это время заряда конденсатора выборки-хранения, а есть ещё программный код, длина которого определяет, хатит ли однократной зарядки для корректного замера.

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

Или, может, внутренние утечки входа АЦП на столько малы, что позволяют оцифровывать сигнал при однократной зарядке входной ёмкости (для PIC12F675 - 25пФ)?

 

Пожалуй, проблема решилась сама собой.
Время измерения увеличилось до 50мс и сделать меньше, наверно уже не получится.
Просто я в начале кое чего не учёл и считал, что будет не более 1мс.

Так что, похоже, времени хватит в любом случае.

 

DWD: Если предположить, что внутри мс соединение между кристаллом и внешним выводом выполнено железным проводником диаметром 0,1мм, то сопротивление этого перехода будет порядка 25мОм.

Оно конечно так... но в статике. А в динамике, это нехорошая индуктивность.И именно в процессе срабатывании ключей возникает бросок по питанию. Я НИКОГДА себе не позволяю делать питающие (и общие) проводники всего 0,8мм. Ежели совсем деваться некуда, то я сверху наложу (пит. и общ.) на плату плоскую шинку из тонкого 0,2мм. (раздираю) стеклотекстолита. Еще критична разводка цепи кварца (если она есть).

 

DWD: при однократной зарядке входной ёмкости (для PIC12F675 - 25пФ)?

Откуда 25 пФ? Я вижу 5+120 пФ:

 

Vlad_Petr: Я НИКОГДА себе не позволяю делать питающие (и общие) проводники всего 0,8мм.

Я позволил.
Устройство работает каждый день с утра до вечера с начала месяца. Полёт нормальный.

 

Сергей К: Откуда 25 пФ? Я вижу 5+120 пФ:

Из русифицированной доки.
Посмотрел только что на английском - а там 120пФ.

Наверно при переводе на русский не ту картинку взяли.

 

DWD
Наверно при переводе на русский не ту картинку взяли.
Вот поэтому, при чтении русской документации, надо параллельно смотреть английскую, и ерраты заодно.

 

Собрал одну схемку на PIC12F675, а она не работает...
Хотя до этого собирал эту же схемку 3 раза и все удачно.

Для проверки работоспособности МК и для поучиться в PicBasik написал простенькую программку:

loop:
HIGH GPIO.2 'Включить светодиод
PAUSE 500 'Задержка полсекунды
LOW GPIO.2 'Выключить светодиод
PAUSE 500 'Задержка полсекунды
GOTO loop 'Возврат в начало программы
END

Работает.
Для проверки всех портов сразу написал следующую:

loop:
HIGH GPIO.0 'Включить светодиод
HIGH GPIO.1 'Включить светодиод
HIGH GPIO.2 'Включить светодиод
HIGH GPIO.4 'Включить светодиод
HIGH GPIO.5 'Включить светодиод
PAUSE 500 'Задержка полсекунды
LOW GPIO.0 'Выключить светодиод
LOW GPIO.1 'Выключить светодиод
LOW GPIO.2 'Выключить светодиод
LOW GPIO.4 'Выключить светодиод
LOW GPIO.5 'Выключить светодиод
PAUSE 500 'Задержка полсекунды
GOTO loop 'Возврат в начало программы
END

Не работает. Моргает только один порт. На остальных - коротенькие импульсы, которые только осциллографом и увидишь.
Но стоит вернуть первый вариант - для проверки по одному порту и менять по очереди номера портов, то всё работает.

Почему? Что не так прописал для отработки всех портов одновременно?