С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/30: Рейтинг темы: голосов - 30, средняя оценка - 5.00
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435

Как написать код для счетчика ампер-часов?

11.12.2017, 15:38. Показов 7290. Ответов 114
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сделал "показометр" на атмега 8 + дисплей нокия 5110 заточенный под переделанный БП АТХ.
Пока это выглядит так в Proteus. На макетке в железе тоже работает. Но столкнулся с проблемой - не могу найти, как написать код для счетчика ампер-часов. Ни в уроках, ни на форума исходников ни кто не показывает.
Если кто-то знает или где-то видел информацию о том, как это сделать, окажите помощь. Очень желательно под Atmel Studio.
Миниатюры
Как написать код для счетчика ампер-часов?   Как написать код для счетчика ампер-часов?  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2017, 15:38
Ответы с готовыми решениями:

Считывание ампер/часов на микроконтроллере pic
Делаю выпускную квалификационную работу. Имею слабое представление в программировании микроконтроллера, т.е. программу-прошивку на си еще...

Проблема с подсчетом ампер-часов на малых токах
Натолкнулся (вернее натолкнули) на такую проблему: показометр со счетчиком ампер-часов для ЛБП не считает ампер-часы при токе меньше 1...

Написать логическое выражение для определения стоимости перегово-ров, если стоимость с 22 часов до 8 часов на 20% ниже,
Написать логическое выражение для определения стоимости перегово-ров, если стоимость с 22 часов до 8 часов на 20% ниже, а в субботу и...

114
1184 / 670 / 113
Регистрация: 15.05.2012
Сообщений: 4,078
11.12.2017, 18:30
Цитата Сообщение от gogaze Посмотреть сообщение
как это сделать,
Амперы умножить на часы вызывает проблему или вывод на экран?
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
11.12.2017, 19:11  [ТС]
Цитата Сообщение от pyzhman Посмотреть сообщение
Амперы умножить на часы
Вот амперы и умножить - проблем нет, а вот часы - проблема! Дело в том, что ток разный в начале и в конце зарядки. Я так понимаю, что если просто включить часы, то для того, чтобы величина ампер с какой-то периодичностью считывалась, умножалась на этот период и прибавлялась к предыдущему результату? Типа как вода из крана - то сильно, то капает, а в результате к утру ведро 10 литров. Только как это в код превратить? Программирование начал осваивать сравнительно недавно, так что сильно не чмырите меня!
0
3 / 3 / 0
Регистрация: 04.05.2015
Сообщений: 7
11.12.2017, 19:12
Каждую секунду суммируешь текущее значение тока в накопитель. Результат делишь на 3600.
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
12.12.2017, 00:50  [ТС]
Цитата Сообщение от trofim2 Посмотреть сообщение
Каждую секунду суммируешь текущее значение тока в накопитель. Результат делишь на 3600.
Вот логику всего этого я понимаю, а для того, чтобы все это прописать... Если нет примера готового кода, тогда, пожалуйста, подскажите хотя бы пошагово, как это выполнить, типа:
1. Подключить и настроить таймер (или что там надо)
2. Какую-то переменную создать. ну и т.д.
Может я немного не правильно начал изучать программирование AVR. Мне нужно было сделать вольтметр и амперметр с дисплеем 16х2 - я посмотрел уроки, примеры, изучил литературу, касающуюся этого и сделал. А тут...
0
3 / 3 / 0
Регистрация: 04.05.2015
Сообщений: 7
13.12.2017, 17:14
Смотри примеры построения часов
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
14.12.2017, 01:03  [ТС]
Ну хоть что-то сдвинулось!
Цитата Сообщение от trofim2 Посмотреть сообщение
Смотри примеры построения часов
Внутренний таймер или часы реального времени?
0
3 / 3 / 0
Регистрация: 04.05.2015
Сообщений: 7
14.12.2017, 10:13
Можно и на внутреннем таймере. Подели до 1 сек.
1
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
14.12.2017, 12:42  [ТС]
Цитата Сообщение от trofim2 Посмотреть сообщение
Можно и на внутреннем таймере. Подели до 1 сек.
Ответ лаконичный, как для опытного программиста, но и за это респект!
А что такое "long SumVariable" простым понятным для новичка языком?
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
14.12.2017, 12:48
при инициализации - настройка таймера (чтоб получить период = 1 сек и включить прерывание)
при работе - прерывание - обработка (например, считывание тока) - (перезапуск таймера) - сброс флага прерывания - возврат в основной цикл
1
3 / 3 / 0
Регистрация: 04.05.2015
Сообщений: 7
14.12.2017, 13:09
Если с прерыванием, то нет необходимости сбрасывать флаг прерывания.
1
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
14.12.2017, 13:14
Цитата Сообщение от Dmitry Посмотреть сообщение
при работе - прерывание - обработка (например, считывание тока) - (перезапуск таймера) - сброс флага прерывания - возврат в основной цикл
Вот сброс таймера ни в коем случае не надо. Он сам сбросится, аппаратно, без снижения точности на ручном управлении.
Если я правильно понял, у вас есть переменные в которых хранится текущее значение тока. Настраиваете таймер на прерывание каждую секунду (можно и меньше, даже точнее будет), заводите достаточно большую переменную, хотя бы uint32_t, но для таких скоростей можно и все 64 бита. По прерыванию прибавляете в ней значение тока в данный момент. В результате в переменной будет интеграл тока, умноженный на интервал таймера, который равен 1 сек. Для вывода умножаете эту переменную на интервал и делите на количество секунд в часе. Например, интервал 1 сек, переменная насчитала 10000 попугаев. Выводим: 10000*1/3600 = 2,78 Ач.
Второй пример: интервал 1/125 сек = 8 мс (это получается если тактовая частота 16 МГц, делитель на 1024 и модуль счета 125), в переменной оказалось число 1250000. Выводим: 1250000 * 0,008 / 3600 = 2,78 Ач
1
14.12.2017, 13:53

Не по теме:

Цитата Сообщение от trofim2 Посмотреть сообщение
нет необходимости сбрасывать флаг
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
сброс таймера ни в коем случае не надо
ну вот, уточнили вам все :)

0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
15.12.2017, 01:32  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот сброс таймера ни в коем случае не надо. Он сам сбросится, аппаратно, без снижения точности на ручном управлении.
Если я правильно понял, у вас есть переменные в которых хранится текущее значение тока. Настраиваете таймер на прерывание каждую секунду (можно и меньше, даже точнее будет), заводите достаточно большую переменную, хотя бы uint32_t, но для таких скоростей можно и все 64 бита. По прерыванию прибавляете в ней значение тока в данный момент. В результате в переменной будет интеграл тока, умноженный на интервал таймера, который равен 1 сек. Для вывода умножаете эту переменную на интервал и делите на количество секунд в часе. Например, интервал 1 сек, переменная насчитала 10000 попугаев. Выводим: 10000*1/3600 = 2,78 Ач.
Второй пример: интервал 1/125 сек = 8 мс (это получается если тактовая частота 16 МГц, делитель на 1024 и модуль счета 125), в переменной оказалось число 1250000. Выводим: 1250000 * 0,008 / 3600 = 2,78 Ач
Огромное человеческое Danke! Теперь хоть есть, что изучать. До этого мне таймеры и прерывания не были нужны, и я особо не углублялся в их изучение, понимал, что важно но...
Если еще понадобится ваша помощь - не откажите!
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
15.12.2017, 10:21
Цитата Сообщение от gogaze Посмотреть сообщение
В результате в переменной будет интеграл тока, умноженный на интервал таймера, который равен 1 сек.
Интеграл будет, по времени. Ни на что не умноженный ).
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
15.12.2017, 12:15  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
Интеграл будет, по времени. Ни на что не умноженный ).
Это значит, что все, что мне предлагали сделать - неправильно?
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
15.12.2017, 12:16
Цитата Сообщение от Voland_ Посмотреть сообщение
Интеграл будет, по времени. Ни на что не умноженный ).
Да, но время будет не в секундах или часах, а в тиках таймера. А перевести нужно в часы. Именно это у меня и делается при выводе
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
15.12.2017, 12:23  [ТС]
Цитата Сообщение от gogaze Посмотреть сообщение
Для вывода умножаете эту переменную на интервал и делите на количество секунд в часе. Например, интервал 1 сек, переменная насчитала 10000 попугаев. Выводим: 10000*1/3600 = 2,78 Ач.
Как это соотнести с этим
Цитата Сообщение от Voland_ Посмотреть сообщение
Интеграл будет, по времени. Ни на что не умноженный ).
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
15.12.2017, 13:31
Вероятно, он говорит о случае когда таймер настроен ровно на 1 сек. Проблема в том что подобрать делители для такого не всегда возможно, проще уж считать в тиках, а в часы переводить только на последнем этапе.
0
29 / 26 / 8
Регистрация: 09.12.2017
Сообщений: 435
15.12.2017, 15:44  [ТС]
COKPOWEHEU,
На рекомендации по пунктам: что сделал
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если я правильно понял, у вас есть переменные в которых хранится текущее значение тока.
Да, были созданы переменные
C
1
2
3
4
5
6
float U, I, Ist, R, P, T;
while (1)
    {   
U=(readADC(0)*20.00/1023);
I=(readADC(2)*10.00/1023);
Ist=(readADC(1)*10.00/1023);
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Настраиваете таймер на прерывание каждую секунду (можно и меньше, даже точнее будет)
Насмотрелся и начитался уроков и сделал так. По идее через каждые 8 секунд считывается показание текущего тока
C
1
2
3
4
5
6
7
8
9
void timer_ini(void)
{
    TCCR1B |= (1<<WGM12);   // устанавливаем режим СТС (сброс по совпадению)
    TIMSK |= (1<<OCIE1A);   //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
    OCR1AH = 0b11110100;    //записываем в регистр число для сравнения старшая часть
    OCR1AL = 0b00101000;    // записываем в регистр число для сравнения младшая часть в обоих частях всего 8 секунд
    TCCR1B |= (1<<CS12);    //установим делитель 256 8000000/256=31250= почти 1 сек
    // когда счетчик отсчитает 8 сек сработает прерывание и выполнится код
}
Цитата Сообщение от gogaze Посмотреть сообщение
заводите достаточно большую переменную, хотя бы uint32_t,
C
1
uint32_t ah; // переменная для подсчета ампер-часов
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
По прерыванию прибавляете в ней значение тока в данный момент.
C
1
2
3
4
ISR (TIMER1_COMPA_vect)
{
    //ah++I // так не работает пока не знаю как правильно надеюсь на помощь
}
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для вывода умножаете эту переменную на интервал и делите на количество секунд в часе.
Пока не сделал из-за невыполненного предыдущего условия
C
1
2
// Ампер-часы
        Lcd_prints (9,3,FONT_1X,(unsigned char*)PSTR("50 Ah")); //пустышка для вывода ампер-часов
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2017, 15:44
Помогаю со студенческими работами здесь

Нужно написать код в atmel studio счетчика 0-9 по нажатию кнопки
Написать нужно код в atmel studio на atmega8 чтобы при зажатии кнопки счётчик добавлял +1

HTML-Код счетчика посещаемости (для форума)
Внимание! - При внесении каких-либо изменений в этот код работоспособность счётчика не гарантируется! - Вы можете вставлять этот...

Как выровнять код счетчика
Привет, всем как подскажите как выровнять код счетчика, что бы он был по центру страницы, вот код счетчика &lt;table cellpadding=0...

Код счетчика посещения для сайта на javascript html
Готовый код счетчика посещений на javascript. По функционалу ничем не уступает стандартным счетчикам типа мэил и лайвинтернет. Сайт не...

Хочу вставить код счетчика для сайта ucoz.ru
Хочу вставить код счетчика для сайта ucoz.ru Как открыть &quot;HTML&quot; что бы вставить туда свой код? Сам код у меня уже есть, не знаю куда его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru