Для обработки аналогового сигнала можно использовать, например, аналоговый вывод A0:
int analogPin = 0;
Ввод значения напряжения на этом выводе реализуется так:
val = analogRead(analogPin);
Перевод считанного значения в уровень напряжения реализуется так:
volts = val * vref / 1024.0;
В качестве делителя в некоторых источниках рекомендуется и 1023.
Но в даташите на ATMega328P указано именно число 1024:
В вышеуказанном выражении vref - опорное напряжение (voltage reference).
В режиме по умолчанию (DEFAULT) опорное напряжение равно напряжению питания (5 В для моей платы Arduino).
В режиме INTERNAL используется внутренний источник опорного напряжения (1,1 В для моей платы Arduino).
В режиме EXTERNAL на вывод AREF подается внешнее опорное напряжение (от 0 до 5 В), причем входное сопротивление составляет 32 кОм. В этом случае удобно использовать внешний источник опорного напряжения - например, LM4040, LM385Z, REF-4096.
Источник REF-4096 основан на чипе MCP1541 и имеет три вывода:
Он преобразует напряжение около 5 В (4,3 ... 5,5 В) в стабильное напряжение 4,096 В (4,055 ... 4,137 В) (макс. выходной ток 2 мА):
Схема включения диода LM4040 следующая:
Диоды LM4040 обеспечивает различные значения напряжения:
LM4040-N-2.0 - 2,0 В;
LM4040-N-2.5 - 2,5 В;
LM4040-N-3.0 - 3,0 В;
LM4040-N-4.1 - 4,1 В;
LM4040-N-5.0 - 5,0 В.
Диод LM4040 обеспечивает стабильное опорное напряжение при токах 60 мкА ... 15 мА.
Также можно использовать опорный диод из серии LMx85, например, LM385Z-1.2 на напряжение 1,235 В с погрешностью 2 %, работающий при токах 10 мкА ... 20 мА.
Схема включения такого диода аналогична схеме включения LM4040, при этом рекомендуемое значение сопротивления резистора R для входного напряжения 9 В - 510 кОм, 1,5 В - 3 кОм.
Символ "Z" в обозначении диода означает тип корпуса TO-92:
Внутренняя схема такого опорного источника весьма сложна:
Для переключения режима опорного напряжения используется команда:
analogReference(режим);
Следует отметить, что в используемой схеме напряжение на катушке при включенном MOSFET будет отрицательным, что отобразится нулевым значением в результатах измерений АЦП Arduino.
Для успешного детектирования сигнала необходимо ускорить аналого-цифровое преобразование, изменив множитель (prescaler) путем управления битами ADPSx в регистре ADCSRA:
ADPS2 |
ADPS1 |
ADPS0 |
Множитель |
0 |
0 |
0 |
2 |
0 |
0 |
1 |
2 |
0 |
1 |
0 |
4 |
0 |
1 |
1 |
8 |
1 |
0 |
0 |
16 |
1 |
0 |
1 |
32 |
1 |
1 |
0 |
64 |
1 |
1 |
1 |
128 |
Этот множитель показывает, во сколько раз тактовая частота АЦП меньше системной тактовой частоты (16 МГц).
Установка множителя, равного 64 (частота дискретизации около 19 кГц) -
cbi(ADCSRA, ADPS2);
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
Установка множителя, равного 32 (частота дискретизации около 38 кГц) -
sbi(ADCSRA, ADPS2);
cbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
Установка множителя, равного 16 (частота дискретизации около 76 кГц) -
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
В этом случае тактовая частота АЦП равна 1 МГц. С учетом того, что преобразование занимает 13 тактов, оно будет длиться 13 мкс (частота 1000/13 = 76,92 мкс). Но это в идеальном случае! Тесты показали, что без изменения множителя (128 по умолчанию) одно аналого-цифровое преобразование (analogRead) в цикле занимает ~ 112 мкс, а с измененным множителем (16) - ~ 17 мкс.