Приветствую.
Прошу помощи.
Сделал ёмкостной сенсор методом CVD, а точнее разностный метод. Суть его в том, что мы не просто меряем
напряжение на АЦП, а делаем два замера, поочерёдно заряжая/разряжая пластину сенсора и ёмкость АЦП. Это
вроде как самый надёжный способ. Вот его описание:
http://ww1.microchip.com/downloads/en/A ... 01478B.pdf
Я его реализовал. Работает действительно очень стабильно. Но только некоторое время. Со временем лампа нагревается,
и сенсор перестаёт реагировать на касания. Т.е. я снимаю показания с АЦП, а значения такие, как в состоянии покоя,
ёмкость пластины никак не меняется.
Схема лампы следующая:
Замер я делаю так:
Спойлер
Код: Выделить всё
uint16_t touch_probe( byte SensPin, byte SensAdc, byte RefPin, byte RefAdc )
{
// Зарядим конденсатор АЦП и разрядим пластину сенсора.
ADMUX = RefAdc;
PORTB |= _BV(RefPin); // Charge S/H Cap
PORTB &= ~_BV(SensPin); // Discharge Pad (0)
DDRB |= _BV(RefPin) | _BV(SensPin);
my_delay_us(5); // Задержка на заряд/разряд.
DDRB &= ~_BV(SensPin); // Сенсор на вход
ADMUX = SensAdc; //|_BV(ADLAR); // Переключим конденсатор АЦП к пластине.
my_delay_us(5); // Задержка на уравнивание зарядов. Заряд с АЦП перетекает на пластину.
ADCSRA |= _BV(ADSC); // Меряем.
while( !( ADCSRA & _BV(ADIF) ) );
ADCSRA |= _BV(ADIF); // Clear ADIF
//dat1=ADCH;
uint16_t dat1 = ADC;
// Зарядим пластину сенсора и разрядим конденсатор АЦП.
ADMUX = RefAdc;
PORTB &= ~_BV(RefPin); // Discharge S/H Cap
PORTB |= _BV(SensPin); // Charge Pad
DDRB |= _BV(RefPin) | _BV(SensPin);
my_delay_us(5); // Задержка на заряд/разряд.
DDRB &= ~_BV(SensPin); // Сенсор на вход
PORTB &= ~_BV(SensPin);
ADMUX = SensAdc; //|_BV(ADLAR); // Переключим конденсатор АЦП к пластине.
my_delay_us(5); // Задержка на уравнивание зарядов на пластине и кондере АЦП.
ADCSRA |= _BV(ADSC); // Меряем.
while( !( ADCSRA & _BV(ADIF) ) );
ADCSRA |= _BV(ADIF); // Clear ADIF
//dat2 = ADCH;
uint16_t dat2 = ADC;
return dat2 - dat1;
}
Надо сказать ещё, что значения замеров при касании и покое у меня очень близки. Везде в доках на картинках
они довольно сильно отличаются. У меня разница около 80 (из 1023, разрядность АЦП 10бит). Это очень мало.
Рекалибровку тоже делаю, усложнял фильтр. Ничего не помогает. Как-будто что-то с зарядом/разрядом пластины.
Дело в коде? Или ещё в чём-то? Я пытаюсь повторить работающую схему, там этих проблем нет.