Jump to content
Sign in to follow this  
nrgizer79

Ацп Attiny13

Recommended Posts

Всех приветствую!

БП для автомобильного компьютера.

Все работает, кроме.....

Для контроля напряжения на аккумуляторе, когда все устройства "спят", подаю напряжение через делитель на АЦП1 (нога 7).

При напряжении 10,5В на входе на ноге 7 д.б. 2,625В или значение 537 на АЦП1.

Т.е. при значении менее 537 хотелось бы обесточивать всю схему.

На деле АЦП правильно не считает:

- если задавать int bat_volt_min в диапазоне меньше 500, то схема обесточивается при напряжении менее 10,4 В;

- если в диапазоне более 500, то схема обесточивается при напряжении менее 11,5В.

Т.е. не АЦП какое то, а триггер.

Что я неправильно делаю ?

Вот моя схемка БП:

3b4fc1b02ae6t.jpg

Вот код:

#include <tiny13a.h>
#define F_CPU 1200000UL
#include <delay.h>
// Назначим константы
int bat_volt_min = 537;
// Глобальные переменные
bit first_start=0;
bit batt_bad=0;
bit power_on=0;
bit LCD_state=0;
unsigned int timer0_sec=0;
unsigned int timer0_count=0;
unsigned int batt_volt=0;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
timer0_count++;
 if (timer0_count==146)
 {
 timer0_sec+=1;
 timer0_count=0;
 }
//	 if (PORTB.3==1 && power_on==1)
//	 {
//	 timer0_sec=0;
//	 }
}
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}
// Выключение всего
void all_off ()
{
 PORTB.4=1;
 LCD_state=0;
 PORTB.0=LCD_state;
 first_start=0;
 power_on=0;
}	
// Нажатие кнопки Power на плате Odroid
void power_on_off ()
{
PORTB.1=1;
delay_ms (300);
PORTB.1=0;
power_on=!power_on;
}
//Включение/выключение LCD & HUB
void lcd_hub_on_off ()
{
 LCD_state=!LCD_state;
 PORTB.0=LCD_state;
}

// Проверка батареи
void check_bat ()
{
batt_volt = read_adc (1);
if (batt_volt < bat_volt_min)
 {
 batt_bad=1;
 }
else {
 batt_bad=0;
	 };					
}
// Первый старт
void first_start_func ()
{
 check_bat ();
 if (batt_bad==1)
 {
	 all_off ();
 }
 if (PINB.3==1 && batt_volt>=bat_volt_min)
 {
 PORTB.4=0;
 LCD_state=1;
 PORTB.0=LCD_state;
 first_start=1;
 power_on=1;	
 }
 timer0_count=0;
 timer0_sec=0;	
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=1 Bit3=T Bit2=T Bit1=0 Bit0=0
PINB=(0<<PINB5) | (1<<PINB4) | (0<<PINB3) | (0<<PINB2) | (0<<PINB1) | (0<<PINB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 37,500 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 6,8267 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

// Global enable interrupts
#asm("sei")
while (1)
 {
 if (first_start==0)
 {
	 first_start_func ();
 }
 if (PINB.3==0 && timer0_sec>=10 && power_on==1)
 {
	 power_on_off ();
 }
 if (PINB.3==0 && timer0_sec>=15 && LCD_state==1)
 {
	 lcd_hub_on_off ();
 }			
 if (PINB.3==0 && timer0_sec>=30)
	 {
	 check_bat ();
	 }
 if (batt_bad==1)
 {
	 all_off ();
 }
 if (PINB.3==0 && timer0_sec>=51000)
 {
	 all_off ();
 }
 if (PINB.3==1 && power_on==0 && LCD_state==0 && batt_bad==0 && first_start==1)
 {
	 lcd_hub_on_off ();
	 timer0_sec=0;
 }
 if (PINB.3==1 && power_on==0 && timer0_sec>=5 && LCD_state==1 && batt_bad==0 && first_start==1)
 {
	 power_on_off ();		
	 timer0_sec=0;
 }
 if (PINB.3==1 && power_on==1 && LCD_state==1)
 {
 timer0_sec=0;
 }
 }
}

Share this post


Link to post
Share on other sites

Схему не смотрел, программу тоже, в проблему особо не вникал, но абсолютная погрешность преобразования тинек плюс/минус 2 LSB, то есть реально можно рассчитывать на использование только 8 бит результата АЦ преобразования. 9 бит возможно осилит, если отправлять ее спать на время преобразования и обеспечить минимум помех в питающем напряжении.

Edited by salyamkamrad

Share this post


Link to post
Share on other sites

Попробуйте снизить частоту работы АЦП. Рекомендованные значения 50-200кГц.

Share this post


Link to post
Share on other sites

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

Подумал вот что.

Может на время преобразования надо отключать прерывания.

У меня используется прерывание по таймеру.

Может это АЦП сбивает ?

Share this post


Link to post
Share on other sites

На время преобразования нужно отключать все, кроме АЦП. Хотя бы потому, что у Attiny13 нет отдельных земель и питания для аналоговой и цифровой частей. А просыпаться по прерыванию от окончания преобразования АЦП.

Edited by salyamkamrad

Share this post


Link to post
Share on other sites

Новое бюджетное семейство микроконтроллеров STM32G0 и планы его развития

Семейство STM32G0 сочетает в себе лучшие качества представителей семейств STM32F0 и STM32L0 - относительно высокую производительность и низкое энергопотребление. Модели STM32G0 имеют упрощенную схему питания, улучшенную периферию, систему тактирования и быстрые порты в/в, доп.средства защиты ПО, повышенную устойчивость к статическим разрядам, широкий ассортимент корпусов, обновленные пакеты библиотек для STM32CubeMX. STMicroelectronics планирует развивать новое семейство.

Подробнее...

В общем так:

- понизил частоту работы АЦП до минимума

- выбрал режим только с 8-ю битами

Работает как надо.

Всем спасибо.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Нанести на рабочую часть потенциометра силиконовую смазку и забудешь про шумы и помехи, и срок службы увеличится в разы. 
    • @IDIOT Попробую вечером замерить на хх
    • Господа! оставьте вы эту тему в покое. система реально хорошая. один единственный датчик на оси вращения который не при каких глюках ПО и скачках напряжения не позволяет забыть модулю управления  в какой точке что находится. не требует повторной калибровки за весь свой жизненный цикл. Никаких концевиков которые могут быть повреждены, застрять, или перестать корректно работать из за износа механической части. Это очень правильная но  не всегда корректно выполненная система.  Вот спасибо! вернусь с работы буду вникать в тему. Если на память что нибудь подобное на два канала с собственным экраном и в компактном корпусе придет буду просто дико благодарен! 
    • Ищите аналого-цифровой преобразователь и к нему цифровой регистратор (data logger). Или сразу 2 в 1  Например, вот или вот .
    • Конечно. Причем для двух вариантов развития событий: если все сохранится, как сейчас - первый, и если все произойдет по "навальному" сценарию - второй. Наивность 83 level! Вот допустим, что ты - опер в полиции. Или следователь. И вот ты какого-то там "коррупционера" "оформляешь" по всей строгости. А тут тебе приходит СМС: выбирай - или сын в в коробочках по частям, или вилла на Лазурном берегу. Что ты выберешь? Ясен пень, что какой бы ты честный ни был, выберешь второе. Ну а выберешь первое - и сам пострадаешь, и семью потеряешь, и ничего не изменишь, ибо другой опер-следователь не будет таким тупо-принципиальным. Вот и вся твоя емелина сказка. Фильм "Спрут" смотрел? Лет 40 назад был, пожалуй - про итальянскую мафию. Что с тех пор изменилось? НИ-ЧЕ-ГО. А ты все херню несешь - стоит только захотеть, можно в космос полететь... тьфу. Тьфу на вас еще раз © Все эти глупости про "просто честно исполняй закон" хороши в теории, ну или для проблем уровня взяток гаишников на трассе. А для проблем государственного масштаба - это херня на палочке. Сколько общество существует, столько существуют мздоимцы и лиходеи, и нигде никак их не смогли уничтожить. Ни расстрелы не помогают, ни высокие зарплаты, ни повсеместное стукачество - ничего. Потому что не с того конца заходим к решению проблемы.  100500 раз говорил: надо терпеливо заниматься воспитанием себя, своих детей, своих внуков, правнуков и пра-правнуков. И вот внуки пра-правнуков смогут, вероятно (если были правильно воспитаны по всей предыдущей цепочке) действительно жить так, как ты и я мечтаем. Но, поскольку всем надо всё и сразу - ничего не выходит вот уже 3000 лет, а то и более. Я отлично понимаю, что и мои предложения пахнут наивностью, и тоже невыполнимы, скорее всего... Но невозможность пройти путь вовсе не означает, что существует другой. Был бы другой - за 3000 лет-то уж нашли бы его...  
    • Да я и не спорю. Но лет 70-80 назад разработчик бы читал УК, статью "вредительство". А может, и не успел бы прочитать. Я вот по работе пересекаюсь с промышленными компами и промышленными мониторами (слава Богу, от последних удалось отбиться). Так вот я бы расстрелял производителей промышленных мониторов, которые стоят космических денег, и вылетают через полгода-год. Рекорд - полтора года. А вот бытовые поставили - проблем нет. Осталось теперь от промышленных компов отказаться. Хотя, они намного надёжней, чем мониторы. Года на два хватает (условия - превосходные, кондиционирование и тд). Стоящий рядом с ними бытовой комп уже лет 10 пашет, а промышленный уже четвёртый.
×
×
  • Create New...