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

AVR начинающим - вопросы и ответы

1 23 68

Нет, неправильно. Всё равно 20-10 не будет равно 10-20
Надо прямо написать
if (adc1>adc2) adc_rez=adc1-adc2;
else adc_rez=adc2-adc1;

ЗЫ. В приложении код антидребезга для одной кнопки. Я его написал в рамках какой-то темы здесь, но что-то не могу найти.

149463.c

 

Вот спасибо хорошо.
Да вот только кусок этой программы все равно не работает
Нужно мне мерять напряжение на АЦП если оно стало вдруг больше на 8-10 ед. то выставлять флаг.
А если напряжение уменьшилось вдруг на 8-10 то убирать флаг
Делать пытался так хотя-бы для установки флага

interrupt [ADC_INT] void adc_isr(void)
{

adc_data=ADCW;
delay_ms(7);
ADCSR|=0x40;

if (z>1) {
if (adc1>adc2) {
adc_rez=adc1-adc2; }
else {adc_rez=adc2-adc1;}

if (adc_rez>8) { //Если увеличилось на 8
PORTA.7=1; } //Выставляем флаг
z=0; };
if (z==0) {
adc1=adc_data ;}; //Измерение предыдущего значения АЦП
if (z==1) {
adc2=adc_data;}; //Измерение следущего значения АЦП
z++;

 

Естественно, по модулю разницы ты не можешь определить, какое из значений adc1 или adc2 больше, на то он и модуль.
Тогда вот так:

if (z>1)
{
  if (adc1>adc2)
  {
    adc_rez=adc1-adc2;
    if (adc_rez>8) //Если уменьшилось на 8
    {
      PORTA.7=0; //Чистим флаг
    }
  }
  else
  {
    adc_rez=adc2-adc1;
    if (adc_rez>8) //Если увеличилось на 8
    {
      PORTA.7=1; //Выставляем флаг
    }
  }
  z=0;
}

ЗЫ. Постарайся форматировать текст поаккуратнее, сложно читать (и тебе самому в том числе).

 

А может так ?

 

Модераторы, забаньте его уже опять, а?

 

Да спасибо код работает частично
Его я хотел использовать в модуле зарядки NiMh аккумуляторов. А именно отслеживать подключение ЗУ к устройству с установленными аккумами.
При подключении ЗУ напряжение на аккумуляторе возрастает как-раз минимум на 8-10 ед АЦП.
Но у меня в девайсе получается подключение он видит нормально - PORTA.7=1;
А при отключении ЗУ PORTA.7 гаснет не сразу а через некоторое время, причем которое зависит от продолжительности подключения ЗУ.
Хотя напряжение на аккумуляторе падает при отключении ЗУ сразу
Чем это может быть вызвано для меня не понятно

 

shemmer: Чем это может быть вызвано для меня не понятно

Используйте отладку вставкой контрольных сообщений и увидите как меняются результаты АЦП.

 

shemmer: Хотя напряжение на аккумуляторе падает при отключении ЗУ сразу

Надо смотреть прямо на ножке контроллера, там же наверное какой-то делитель, и конденсатор наверное имеется...

 

На ножке резистивный делитель.
Только-что померял на ножке АЦП - без зарядки 2.39, с зарядкой - 2.44 В
При отключении сразу возвращается в 2.39 В.

2.44-2.39=0,05
разность показаний ADC=0.05*1024/2.56=20
Пробовал и частоту работы АЦП менять..
Где-то в пограмном коде наверно,а вот где?

 

shemmer: сразу возвращается в 2.39 В

"Сразу" в каком масштабе времени ? В "человеческом" ? Для МК это медленно слишком.

Думаю на АКБ напряжение опускается не мгновенно и разница в 8 отсчетов не достигается между соседними АЦП.