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

Могу ли я начать изучение микроконтроллеров используя PIC16F74?

1 8 10

kkol: очень хорошая зарядка для мозгов
И не говорите... . Сунулся в свою библиотеку... нарыл дополнительные описания, правда в основном на английском языке. Если что то нужно то вот список подклеиваю

213403.zip

 

Привет Всем.

Ну вот и первый затык.

Преобразование аналогового напряжения на входе RA0 в бинарный код работает неплохо и даже количество ступеней могу выбрать произвольно. Но....... при некотором пороговом значении между битами, результат конвертации начинает скакать (плюс минус 1 бит), а этого как раз и не должно быть в устройстве. В принципе это было ожидаемо, но думал что не так ярко выражено будет. Установка фильтра и стаба по измеряемому входу, ситуацию улучшают, но не до конца, просто реже мыргает (вместо светодиодов будут стоять реле). То же самое с применением задержки при выводе на индикацию.
В целом ситуёвину могу обойти с помощью валкодера и 887 пика , но это будет следующий шаг по изучению МК, а пока задача решить проблему с помощью PIC16F74 так как у ней нет ЕЕПРОМ, а постоянный резистор будет служить ещё и "памятью состояний", да и просто для практики полезно.
Так вот и не могу определиться какой алгоритм применить для решения задачи.

Хотя примеров не нашел чтобы посмотреть как это можно делать, мысль такая: 1. объявляю две переменные для текущего и нового значений преобразования. 2. сравниваю значения. 3. большее или меньшее значение (не играет роли) пишу в переменную для текущего значения. 4. текущее значение вывожу на порт вывода. 5. и так по кругу........

Просветите пожалуйста.

 

Отбросить младший разряд, этим устранив джиттер.

 

Vladikas: Отбросить младший разряд

А это програмно ? Прошу прощения за глупый вопрос.
Если не использовать просто ногу младшего разряда, то счет не равномерный.

 

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

 

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

Спасибо, буду думать как это програмно выразить. Интересен алгоритм.

Vladikas: Или сделать сдвиг числа вправо, результат почти тот же,

А вот это где то видел, это как де жа вю, что то подобное недавно читал.................

 

А может я глупости пишу
Чёт сюда никто не заходит... Поправили бы.
--------------
Типа так сдвиг.
value=read_adc();
shift_right(&value,1,0);

 

вы убираете младший бит, уменьшая точность замера в 2 раза и больше ничего.
===
полагаю лучше организовать статистическую обработку замеров, например - усреднить результаты замеров за некоторый интервал времени.

 

AnSi: полагаю лучше организовать статистическую обработку замеров, например - усреднить результаты замеров за некоторый интервал времени.

То есть пишем массив, например за 10 тактов, и наибольшее число ( можно и меньшее ) пишем на выход?

AnSi: вы убираете младший бит, уменьшая точность замера в 2 раза и больше ничего.

В принципе точность не нужна. Надо просто рабочий ход потенциометра разбить на 24 сектора или на 32. А вот переход от сектора к сектору не должен дрожать если потенциометр остановится в таком положении.

Vladikas: Типа так сдвиг.
value=read_adc();
shift_right(&value,1,0);

Надыть попробовать. Пасибо.

 

Vladikas: Типа так сдвиг.
или так:
value=read_adc();
value=value>>1 //Сдвиг на 1 бит

kkol: Надо рабочий ход потенциометра разбить на 24 сектора или на 32
32 сектора это 5 бит (2^5=32)
АЦП дает 8...10 битов (в зависимости от настроек и самого АЦП), поэтому можно смело сдвигать. Вероятность "дрожания" резко снизится, но все-же останется.
Можете попробовать сразу:
value=value>>3
на выходе получите от 0 до 31 (это если АЦП 8 бит)