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

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

1 24 68

shemmer: разность показаний ADC=0.05*1024/2.56=20

Дак вот эту разность и выведи из МК как отладочное сообщение и посмотри чему она реально равна, а не предположительно.

 

shemmer: Где-то в пограмном коде наверно,а вот где?

В коде всё нормуль. Боюсь, Karados прав, напряжение спадает медленнее. Попробуй брать adc1и adc2 при значениях z, скажем, 0 и 20.
В этом случае, кстати, можно выкинуть из прерывания задержку delay_ms(7), не дело это в прерывании.
Я бы вообще сделал так:

interrupt [ADC_INT] void adc_isr(void)
{
  static unsigned char adc_counter = 20;
  adc_data=ADCW;
  ADCSR|=0x40;
  if (--adc_counter == 0)
  {
    adc_counter = 20;
    adc1 = adc2;
    adc2 = adc_data;
    if (adc2>adc1)
    {
      if (adc2-adc1>8) PORTA.7=1;
    }
    else
    {
      if (adc1-adc2>8) PORTA.7=0;
    }
  }
}

 

Все-таки для МК это действительно слишком медленно.
Наверное придется "выдернуть" еще одну ногу АЦП с устройства для работы ЗУ. Поставить делитель и запускать сервис зарядки если на ней стал какой-то уровень напряжения. Все эти игры с миливольтами могут не известно как себя повести на аккумулятороах с различной степенью зарядки

 

shemmer: Все-таки для МК это действительно слишком медленно.

Да . А в чем задача ? Что нужно сделать ?

 

В устройстве задействованы оба таймера, два выхода ШИМ на одном генератор 500 кГц ,динамическая индикация 5-ти светодиодов,функция кнопки,PLL.
Контроллер attiny26L

 

Все-таки переделал я схему зарядки, выделил ногу специально для контроля подключения зарядки.
Теперь возник вопрос - у меня условие
допустим
if (adc_data<980) {
PORTA.7=1;
PORTA.5=1;
zaradka=1;
}
if (adc_data>=980)
{
PORTA.7=0;
PORTA.5=0;
timerZ=0;
zaradka=0;
};
При подходе значения АЦП к значению в условию начинается подергивание светодиода на PORTA.7
Наверное нужно усреднение показаний АЦП?
ФНЧ?
Какой есть способ усреднения чтобы был самым маленьким по объему кода?

 

Можно сделать гистерезис:

if (zaradka==0 && adc_data<980-5)
{
  PORTA.7=1;
  PORTA.5=1;
  zaradka=1;
}
if (zaradka==1 && adc_data>980+5)
{
  PORTA.7=0;
  PORTA.5=0;
  timerZ=0;
  zaradka=0;
}

 

Гистерезис ИМХО удобней ( и правильней ) определить через

#define GIST 5

и в коде писать

... adc_data < 980 - GIST )

 

CVAVR 2.03.2 - добавлено много нового
http://www.hpinfotech.ro/html/cvavr_history.htm

Размер демки вырос с 2 до 8 Мб.

 

Антоха, спасибо за помощь в написании алгоритма