Для нашего занятия усложним предыдущее устройство. Добавим к устройству управления возможность регулировать задержку между включением и выключением следующего светодиода с помощью потенциометра. Наши бегущие огни можно замедлить или на оборот увеличить скорость и другим способом, но сначала рассмотрим способ с потенциометром.
Сигнал снимаемый с потенциометра аналоговый, значит подключать его нужно к аналоговом входу микроконтроллера. Для обработки таких сигналов в ардуино предлагается функция analogRead(Ax), где х номер вывода для аналоговых сигналов. Время работы функции 100 -110 мкс. Диапазон оцифрованного сигнала от 0 до 1023. Если использовать штатные функции обработки аналогового сигнала иэ задержки. Примерно так:
//================
t_data = analogRead(A3);
delay(t_data);
//================
На занятии от 28.01.2020 мы рассмотрели способ ускорения работы analogRead() и хотя нам такое ускорение и не требуется напишем программу, которая учтет опыт прошлого занятия.
Итак для работы с аналоговыми сигналами на вход требуется настроить АЦП
потенциометр |
схема подключения |
Сигнал снимаемый с потенциометра аналоговый, значит подключать его нужно к аналоговом входу микроконтроллера. Для обработки таких сигналов в ардуино предлагается функция analogRead(Ax), где х номер вывода для аналоговых сигналов. Время работы функции 100 -110 мкс. Диапазон оцифрованного сигнала от 0 до 1023. Если использовать штатные функции обработки аналогового сигнала иэ задержки. Примерно так:
//================
t_data = analogRead(A3);
delay(t_data);
//================
На занятии от 28.01.2020 мы рассмотрели способ ускорения работы analogRead() и хотя нам такое ускорение и не требуется напишем программу, которая учтет опыт прошлого занятия.
Итак для работы с аналоговыми сигналами на вход требуется настроить АЦП
Настройка АЦП сводится к следующим действиям:
1. Необходимо настроить регистр ADMUX (Регистр настройки мультиплексора АЦП).
2. Настройки регистра ADCSRA (Регистр статуса и контроля А)
3. При необходимости, настройки DCSRB (Регистр статуса и контроля B)
3. Чтение результата преобразования
А теперь приступим к самому интересному:
И начинаем запуск преобразования. В регистре ADCSRA, битом ADSC необходимо запустить преобразование и выполнять его,
пока не будет выставлен бит о свидетельствующий о том, что преобразование завершено (бит ADIF).
Данной строчкой (ADCSRA & (1 << ADIF) == 0 происходит проверка и одновременное сбрасывание флага об окончании преобразования.
Далее считываем полученное значение, как видно использовать АЦП не так уж и сложно!
unsigned int data;
int main()
Serial.begin(9600);
DDRC = 0x00; // назначает выводы с 14 по 19 входными
PORTC = 0x00;
ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);
ADMUX |= (0 << REFS1)|(1 << REFS0)|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3);
L0:;
ADCSRA |= (1 << ADSC); // Начинаем преобразование
L1:;
if((ADCSRA & (1 << ADIF)) == 0) goto L1; // пока не будет выставлен флаг об окончании преобразования
data = (ADCL|ADCH << 8); // Считываем полученное значение
Serial.println(data);
goto L9;
}
Как заменить функцию delay()? А попробуйте разработать алгоритм самостоятельно. На занятии клуба 04.02.20 мы обсудим ваши алгоритмы и займемся написанием программы и созданием нашего устройства.